dev下无法生成节点的分析思路和解决方法及原理 |
您所在的位置:网站首页 › 查看设备节点信息的方法有 › dev下无法生成节点的分析思路和解决方法及原理 |
前言:本篇没有解决什么大问题,不神秘也不高深莫测,单纯记录,同时为其他碰到该问题的同仁提供思路,重点在于分析思路的整理,并使用流水帐的形式,试图讲清/dev下节点的生成原理 1.背景为了调试方便,将之前直接编译进内核的驱动调整为module模式加载,即将驱动编译为.ko文件,通过insmod动态加载驱动。在未调整为module加载方式之前,系统启动后可以正常在dev下正常生成驱动节点 driver_test0,driver_test1 出现问题了,就先对比下差异项,从差异项入手,既然没有编译为模块的时候,节点正常生成,那么就有了一个好的场景,有了对比对象,这就好办了 相同点:源码相同 差异点: (1).编译方式不同,即Makefile不同 (2).加载方式和时机不同 有节点的是将驱动直接编译为内核,在系统启动过程中将驱动加载 无节点的是将驱动单独编译为ko文件,打包到文件系统中,等系统起来后,再通过insmod命令将ko文件注册到系统中,驱动被加载 3.分析从2中可以看到2个差异项。makefile只是负责编译为不同的镜像形式,感觉和加载方式的不同有很大关联。但是insmod只是单纯的加载,之前也一直在用,一时半会找不到为何使用insmod加载后就没有节点的线索。 既然差异项无法突破,那么就从正面突破吧,先来搞清楚dev下节点生成的原理 4.生成dev节点的原理dev目录下的节点不是由驱动本身生成的,它是由文件系统中的工具生成的,即busybox中的程序mdev。 具体流程是,当系统启动后,加载完内核再去加载文件系统,执行文件系统中的脚本,脚本会执行mdev -s命令。其实mdev就是一个上层可执行程序,mdev -s执行后,会去遍历/sys/class下的所有文件,寻找所有的名为dev的文件,dev文件保存了每个驱动的主设备号,次设备号,以及驱动名。mdev根据找到的dev,在/dev目录下根据dev文件中的驱动名创建节点(其实就是新建了一个文件)此时,驱动的节点就生成了。 (mdev的源码在busybox源码路径下:./util-linux/mdev.c中,接口为mdev_main,感兴趣可研究下) 根据上述原理,其关键点就2个: (1).sys/class 下必须有驱动的节点信息,即dev文件 (2).必须执行mdev -s创建/dev下的节点 根据上述结论查询系统下sys/class目录发现驱动的class节点 无法创建/dev下节点的原因找到了,但是又有一个新问题,难道对于insmod加载驱动这种方式,必须在insmod以后,再执行一遍mdev -s吗,这个命令谁执行,每次都手动执行吗,显然对于牛逼的linux这不太可能,肯定有更好的方式。 我想了一下,目的其实就是在insmod以后,系统必须通知一下让某个“人”去执行下mdev -s,从而达成一直自动化的效果,我相信一定是这样的,是个人都要这样设计。。。。 所以这里的问题变为了谁去通知呢?我也不会,百度了下,看了几篇帖子,上报通知的动作在device_create操作中。 device_create 操作就是创建class下节点的函数接口 代码中是这样用的: 所以重点是env->argv[0]中的赋值,代码中为: static int init_uevent_argv(struct kobj_uevent_env *env, const char *subsystem) { env->argv[0] = uevent_helper; env->argv[1] = &env->buf[env->buflen]; env->argv[2] = NULL; uevent_helper 定义在: #ifdef CONFIG_UEVENT_HELPER char uevent_helper[UEVENT_HELPER_PATH_LEN] = CONFIG_UEVENT_HELPER_PATH; #endif那么CONFIG_UEVENT_HELPER_PATH又是啥?不知道就搜么,反正内核代码都看得见,大不了就全局搜,只要电脑扛得住。。 生成新配置 重新编译内核,启动看下效果 总结下:dev下自动需要生成节点的必要条件: 条件1:驱动需要调用device_create接口生成sys/class下的class类和dev文件,供mdev程序扫描生成/dev下的节点 条件3:需要使能CONFIG_UEVENT_HELPER 机制,使能后,在条件1中,调用device_create创建好sys/class下的节点文件后,会通知用户态调用CONFIG_UEVENT_HELPER_PATH中的应用程序。这个应用程序就是/sbin/mdev 条件4:需要配置CONFIG_UEVENT_HELPER_PATH为sbin/mdev 上述4个条件满足后,当你的驱动调用device_create后,/dev目录下就会创建暴露给用户态的驱动节点。 所以dev下生成节点的流程为: 1.驱动调用device_create 创建sys/class/xxx节点 2.接着device_create中会调用call_usermodehelper_exec去执行CONFIG_UEVENT_HELPER_PATH路径中的用户态程序,传入参数s 3.该程序为/sbin/mdev,mdev -s 会去遍历/sys/class下的所有文件,寻找所有的名为dev的文件, dev文件保存了每个驱动的主设备号,次设备号,以及驱动名。 mdev根据找到的dev,在/dev目录下根据dev文件中的驱动名创建节点(其实就是新建了一个文件) 此时,驱动的节点就生成了 7.后记还有一种修改CONFIG_UEVENT_HELPER_PATH的方法: 在脚本中执行 echo /sbin/mdev > /proc/sys/kernel/hotplug即可将CONFIG_UEVENT_HELPER_PATH中的内容重写为/sbin/mdev |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |