在Linux系统中,/dev目录中包含了特殊的文件(即设备文件),正是由于这些设备文件的存在,才允许用户空间的应用程序访问由Linux内核管理的硬件设备。如果没有这些设备文件,即使Linux内核正确识别了硬件设备,用户空间的应用程序也无法使用它们。
所以,位于/dev目录下的设备文件是用户空间程序与硬件设备进行交流的中间媒介。
buildroot对/dev的四种处理方式
在buildroot中,提供了四种方式来处理/dev目录,他们位于System configuration选项下的/dev management选项中:
(1)第一种方式是Static using device table
这是 Linux处理设备文件的传统方法。使用这种方法,设备文件会被持久存储在根文件系统中(即重新启动后它们仍然存在),并且在系统添加或者移除硬件设备时,不能自动创建和删除这些设备文件。因此,Buildroot 使用了设备表来创建一组标准的设备文件,默认设备表存储在Buildroot源代码的system/device_table_dev.txt文件中。文件中内容按照:
格式进行设备文件定义。
name : 要创建或修改的文件的路径。
type :是文件的类型。f: 常规文件、d: 目录、r: 递归目录、c: 字符设备文件、b: 块设备文件、p: 命名管道。
mode :通常的权限设置(仅允许使用数值)。
uid 和 gid 是要在此文件上设置的 UID 和 GID;可以是数值或者实际名称。
major 和 minor 这里用于设备文件,其他文件需设置为“-”。
start,inc 和 count 适用于要创建一批文件的情况,实则为一个循环,从start开始,以inc为单位递增计数器,直至达到count。
Buildroot在生成最终的根文件系统镜像时才会处理这个设备表文件,因此设备文件在output/target 目录中是不可见的。BR2_ROOTFS_STATIC_DEVICE_TABLE选项用于更改Buildroot默认使用的设备表,或者添加其他设备表,以便Buildroot在构建过程中可以创建其他设备文件。因此,如果使用此方法,并且系统中缺少设备文件,则可以创建一个包含其他设备文件描述的board/
(2)第二种方式是Dynamic using devtmpfs only
devtmpfs是Linux内核中的一个虚拟文件系统,在内核 2.6.32 中引入(如果使用较旧的内核,则无法使用此选项)。在挂载到/dev 后,此虚拟文件系统将在系统添加或者移除硬件设备时自动显示或者让设备文件消失。
devtmpfs文件系统在重新启动后并不会持久,因为它是由内核动态填充的。
使用devtmpfs时需要启用以下内核配置选项:CONFIG_DEVTMPFS 和 CONFIG_DEVTMPFS_MOUNT。
(3)第三种方式是Dynamic using devtmpfs+mdev
该方法同样依赖于 devtmpfs 虚拟文件系统(因此同样需要在内核配置中启用 CONFIG_DEVTMPFS 和 CONFIG_DEVTMPFS_MOUNT),但添加了 mdev 用户空间程序。mdev是 BusyBox 里面的一个重要组成程序,每次添加或移除设备时,内核都会调用mdev。
我们可以使用/etc/mdev.conf配置文件配置mdev,例如给设备文件设置特定的权限或所有权、在设备出现或消失时调用脚本或应用程序等等。允许用户空间对设备添加和删除事件做出反应。例如:当设备出现在系统上时,mdev 可用于自动加载内核模块。如果设备需要固件,则 mdev 也很重要,因为它会负责将固件内容推送到内核。
mdev是udev的轻量级实现(功能较少)
(4)第四种方式是Dynamic using devtmpfs+eudev
此方法同样依赖于devtmpfs虚拟文件系统,但添加了eudev用户空间守护程序。eudev 是后台运行的守护程序,当系统添加或者移除设备时,内核将会调用eudev。
与 mdev 相比,它是重量级的解决方案,但是具有更高的灵活性。eudev是udev 的独立版本,udev 是大多数桌面 Linux 发行版中使用的原始用户空间守护程序,现已归入Systemd中。
总结
在本文中,描述了buildroot对/dev的四种处理方式,在实际使用中,可以按照以下规则进行选择:
如果在设备添加或移除时不通知用户空间,则选择Dynamic using devtmpfs only方式。(Busybox、systemV和OpenRC三种初始化系统都支持)
如果在设备添加或移除时需要通知用户空间或者需要固件,则选择Dynamic using devtmpfs+mdev方式。(Busybox、systemV和OpenRC三种初始化系统都支持)
如果选择systemd作为初始化系统,则/dev 管理将由 systemd 提供的udev程序执行。(仅支持systemd初始化系统)
全部0条评论
快来发表一下你的评论吧 !