mdev目录更改导致驱动insmod后无法被自动创建/dev节点
分析和解决:
1. 在仔细检查自己写的驱动和使用课程老师写的驱动后结果依旧是无法在/dev下创建xyz节点,但是在/sys/class目录下驱动注册的class和class_device都在,那么基本可以肯定驱动是没有问题的。
2. 回忆课程《006_u-boot_内核_根文件系统(新1期_2期间的衔接)视频第004课_根文件系统第004节_构建根文件系统之构建根文件系统 》,知道busybox中的mdev程序会在驱动加载后(热插拔)根据驱动在/sys/class目录下创建的信息自动在/dev目录下给该驱动创建驱动指定的设备节点,所以进一步怀疑mdev的问题。
3. 求助课程微信群,得到韦老师的指导,在根文件系统中执行mdev -s命令发现没有报错,这可以确定mdev程序是没有问题的,ls /dev/xyz 发现节点出现了,成功了。
//此处是第一张图。请指导的朋友教一下怎么在文章内插入图片?
4. 可是为什么并没有向老师视频里面那样挂载驱动后自动创建设备节点呢?
既然mdev -s能创建节点,说明mdev程序本身没问题,那是不是哪里配置错误了呢?
继续回忆课程《006_u-boot_内核_根文件系统(新1期_2期间的衔接)视频第004课_根文件系统第004节_构建根文件系统之构建根文件系统 》,构建根文件系统时,对mdev的只在etc/init.d/rcS中配置过,
```
# cat /etc/init.d/rcS
#mount -t proc none /proc
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /bin/mdev > /proc/sys/kernel/hotplug
mdev -s
#
```
问题来了,奇怪的是,在根文件/bin目录并没有发现mdev,可是刚才执行mdev -s并没有报错,那么只可能是mdev在其他目录,之后果然在***in目录下找到了mdev。然后修改 etc/init.d/rcS,将mdev的所在目录改成***in。
//此处是第二张图片。
修改完后,重启
开发板(注意:一定要重启,否则修改不生效,因为etc/init.d/rcS实在开机阶段被执行的),重新insmod加载驱动,这回节点/dev/xyz 果然被自动创建了!
//此处是第三章图片。
5. 为什么mdev会在***in目录,而不是像老师视频里那样在bin目录呢?
这个问题我个人怀疑跟我修改了busybox顶层Makefile有关,因为我用的是课程自带的ubuntu16.04,所以在编译busybox的时候遇到了如下问题,参考了网上的解决方案(后来群里同学告知课程文件中也有:005_
ARM裸机1期加强版虚拟机环境ubuntu16.04ubuntu16.04配置内核和busybox出现错误的解决方法.docx),有可能跟这些修改有关,因为是需改了makefile,所以我猜测会影响编译结果。不过既然是mdev的目录换了,这不影响我学习,只是上面分析和解决问题的方法值得总结和学习。
我遇到的问题和解决方案如下:
①.
编译busybox-1.7:
出现错误:
scripts/kconfig/Makefile:14: recipe for target 'menuconfig' failed
解决方法:安装2个库
sudo apt-get install libncurses5-dev libncursesw5-dev
②.
编译busybox-1.7.0出现如下错误:
busybox-1.7.0$make menuconfig
Makefile:405:*** mixed implicit and normal rules: deprecated syntax
Makefile:1242:*** mixed implicit and normal rules: deprecated syntax
make:*** No rule to make target 'menuconfig'. Stop.
分析原因:
新版Makefile不支持这样的组合目标:config %config(一个有通配符,另一个没有通配符)
解决方法:
要么把config %config拆成2个规则,要么把其中一个目标去掉。
所以,
a.修改busybox-1.7.0 顶层Makefile 405行:
config%config: scripts_basic outputmakefile FORCE
改为:
%config:scripts_basic outputmakefile FORCE
b.修改busybox-1.7.0 顶层Makefile 1242行:
/%/: prepare scripts FORCE
改为:
%/:prepare scripts FORCE