2015年(9)
分类: 嵌入式
2015-09-22 19:52:33
在文章 《》中,当提及 构建dev目录 时,使用的静态的方法,也就是根据预先知道要挂载的驱动,用mknod命令逐一构建,现在介绍一种使用mdev创建设备文件的方法。
mdev是udev的简化版本,通过读取内核信息来创建设备文件。其用途主要有:初始化/dev目录,动态更新,支持热插拔。要使用mdev,需要内核支持sysfs文件系统,为了减少Flash的读写,还要支持tmpfs文件系统。现确保内核已经已经设置 CONFIG_SYSFS 和 CONFIG_TMPFS 配置项。
针对这两个选项,我们来看看。转到自己编译的内核的目录下,我们编译内核时都是现加载s3c2410_defconfig这份默认配置文件的,然后再作修改,所以看看s3c2410_defconfig文件,其中有内容如下:
CONFIG_SYSFS=y CONFIG_TMPFS=y
也就是说默认的配置下已经满足使用mdev的要求。
现在回到busybox编译出来的文件系统文件夹下。
修改etc/fstab文件,修改后如下:
#device mount-point type options dump fsck order proc /proc proc defaults 0 0 tmpfs /tmp tmpfs defaults 0 0 sysfs /sys sysfs defaults 0 0 tmpfs /dev tmpfs defaults 0 0
其实就是在fstab文件后多挂载sysfs tmpfs两个设备而已。
修改etc/init.d/rcS文件,修改后如下:
#!/bin/sh mount -a mkdir /dev/pts mount -t devpts devpts /dev/pts echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s
其中的语句就是和mdev的使用方法几乎一样。可参考busybox/doc/mdev.txt文档。
修改erc/inittab文件,修改后如下:
#/etc/inittab ::sysinit:/etc/init.d/rcS #ttySAC0::askfirst:-/bin/sh s3c2410_serial0::askfirst:-/bin/sh ::ctrlaltdel:/sbin/reboot ::shutdown:/bin/umount -a -r
上述修改中,将ttySAC0::askfirst:-/bin/sh注释,代替的是s3c2410_serial0::askfirst:-/bin/sh。因为开发板上通过mdev生成的/dev目录中,s3c2410、s3c2440的串口名为s3c2410_serial0等。
另外,mdev通过init进程启动,在使用mdev构造/dev目录前,init进程至少要用到/dev/console /dev/null。所以像使用静态方法一样构建它们。在/dev/下执行
sudo mknod console c 5 1 sudo mknod null c 1 3
而proc mnt tmp sys root 等都按照原来方法构建空目录即可。
这样,跟文件系统的dev目录的设备文件就会在系统启动时自动生成。
另外,把生成好的文件系统镜像文件弄到nand flash上启动,进入系统后,发现一个奇怪的现象。无论当前路径在哪,提示符都只会显示一个“/”,这一看估计就是shell的配置问题。
在/etc/profile文件下(该文件也许要自己建立)输入export PS1=’w:’
保存后却发现没效果。google了一下,发现是busybox的配置问题。
解决方法:
在编译busybox时需要将选项CONFIG_FEATURE_EDITING_FANCY_PROMPT选上。
Location: -> Busybox Settings ---> -> Busybox Library Tuning ---> -> [] Fancy shell prompts
对于Fancy shell prompts的help如下
Setting this option allows for prompts to use things like w and $ and escape codes. 设置了该选项将允许提示符使用 w 和 $的转移码(大概这意思吧)
这样,从新编译busybox后再根据余下的步骤构建根文件系统即可。
效果:(注意那个/etc:)
/etc:ls fstab init.d inittab profile