Linux devfs 初探

Linux     Devfs (Device File System) FAQ (http://www.atnf.csiro.au/people/rgooch/linux/docs/devfs.html#what-is-it)

1,Devfs has been in the kernel since 2.3.46

2,Devfs 之前的设备管理

块设备和字符设备通常位于/dev下面,但是并不是每一个都真的存在,但是依然要保留它们,因为它们在内核中注册了。

任何一个开发者都可以开发一个特殊或者新的设备的驱动程序,然后通过register_blkdev()或 register_chrdev()向内核注册自己的主设备号。而且一旦与内核开发人员达成一致,这个设备将得到一个“正式的”主设备,并入新版的/dev树。

这样 /dev树越来越大          

整个过程很烦琐。

3,Devfs解决了上述问题。    

=====================================================================    

devfs_register() 

这里是对 devfs 如何一下子处理事情和解决这些问题的一个简单明了的快速纲要。一旦 devfs 被正确配置(包括在内核添加 devfs 支持和对启动脚本进行一些稍复杂的更改),超级用户重新启动系统。 然后内核开始启动,设备驱动程序开始向系统的剩余部分注册设备。您会记起在非 devfs 系统上, register_blkdev()和 register_chrdev() 调用(连同提供的主设备号)正是用于这一目的。然而,现在启用了 devfs,设备驱动程序是用一种新的、改进了的内核调用来注册设备,称为 devfs_register()。 

这里是 devfs_register() 调用有趣的地方。虽然为了兼容性目的指定主设备号和副号码作为参数是可能的,但不再需要这样了。相反, devfs_register()调用接受 设备路径(就是它在 /dev 下可能的出现形式)作为参数。举例来说,假设 foo 设备驱动程序希望使用 devfs 注册设备。它会提供一个 foo0 的参数给 devfs_register(),从而告诉内核应该在 devfs 名称空间的根目录创建一个新的 foo0 设备。相应的, devfs_register() 在 devfs 名称空间的根目录添加 foo0设备节点,并记录这个新的 foo0 节点应该映射到内核中的 foo设备驱动程序。

运行的 Devfs
    一旦所有设备驱动程序启动并向内核注册适当的设备,内核就启动 /sbin/init 和系统初始化脚本开始执行。在启动过程初期(在文件系统检查前),rc 脚本将 devfs 文件系统安装在 /dev 中,/dev 包含了 devfs 名称空间的表达。这意味着在安装 /dev 后,所有注册的设备(如上面的 /dev/foo0)都可以访问,就象在非 devfs 上一样。当它们被访问时,内核 通过 devfs 设备名称映射到合适的设备驱动程序,而不是通过主设备号。 

这种系统的优点是,所有需要的设备节点(没有别的了)都由内核自动创建。这不仅仅意味着不再需要 MAKEDEV(因为所有注册的设备都只“出现”在 /dev 中),还意味着 /dev 不再被成百个“无用的”设备节点所充斥。实际上,使用 devfs,您可以只要查看 /dev 就知道系统上有什么设备。 所以,如果您有一台支持热插拔的膝上型电脑,这意味着您甚至可以在您从系统中插入和拔出 PC 卡时魔术般地让设备从 /dev 中出现和消失。这让 devfs 成为对以前笨拙局面的一个非常彻底和实用的解决方案。 

devfs 的优点

Devfs 让很多事变得容易许多。请考虑一下创建一张 Linux 可引导光盘的问题,它包括一个位于 CD 上的引导装载器、一个 initrd、一个内核和一个回送文件系统。当 CD 引导时,引导装载器装载内核和 initrd,然后内核执行 initrd 上的 /linuxrc脚本。 /linuxrc 的主要任务是安装 CD,从而使回送文件系统本身也可以被安装和访问。 

没有 devfs, linuxrc 就需要“查看” /dev 中的很多特殊文件,它们可能有也可能没有表示连接到系统的真实硬件。例如, linuxrc 会需要检测 /dev/hdc、/dev/scd0、/dev/hdb 和其它的设备以检测“活动的”光盘驱动器设备。在检测进程中,很可能命中几个“无用的”设备节点。 

然而,使用 devfs, linuxrc 只在 /dev/cdroms 中寻找,它包含了系统中所有和 活动的光盘驱动器相关联的特殊文件,不管是 IDE 的还是 SCSI 的。由于这种便捷的新式 devfs 约定,再不需要猜测了;只有活动的设备才会列出,而且设备检测代码甚至不必担心底层的光盘驱动器的细节,比如说它使用什么 IDE 通道或者什么 SCSI ID。实际上,这是 devfs 的另一个主要好处;在我下一篇文章中,我们会看到 devfs 下 /dev 中的设备有全新的缺省位置。 

实际上,如果您想访问一个特定的块设备(如磁盘、分区、光盘驱动器等等),事实上有 几个不同的特殊文件可以引用。例如,我的服务器只有一个 SCSI 光盘驱动器;如果启用了 devfs,我就可以通过安装 /dev/cdroms/cdrom0 或 /dev/scsi/host0/bus0/target4/lun0/cd 访问它。两种都引用同一个设备,我可以引用我认为最方便的特殊文件。如果愿意,我还可以使用一种老式的设备名称(/dev/sr0)访问光盘驱动器,这都是因为有一个非常便捷的叫 devfsd的小程序。 devfsd 是一个有功能很多的程序,它负责创建老式的“兼容性”特殊文件,还允许您以很多种方式自定义 /dev。在我的下一篇文章中,我们会详细讨论 devfsd,到时我会一直引导您启动 devfs 并在您自己的系统上运行它。在那之前,请参考下面的参考资料以了解更多关于 devfs 的信息。

    

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
devfs(Device Filesystem)是早期 Linux 内核版本中的一种设备文件系统。它是一种基于内核设备节点管理方式,通过在 `/dev` 目录下动态创建和删除设备节点来管理系统中的设备。 然而,随着系统中设备数量的增加和设备节点管理的复杂性增加,devfs 在许多方面显露出了一些问题,包括: 1. 性能问题:devfs 在大规模设备数量的情况下性能较差,因为每次访问设备时都需要进行目录遍历和节点查找操作。 2. 安全性问题:devfs 的权限控制相对较弱,无法提供对设备节点的细粒度权限控制。 3. 可移植性问题:devfs 依赖于内核的实现,不同内核版本之间的兼容性存在问题。 为了解决这些问题,udev(Userspace Device Manager)被引入作为 devfs 的替代方案。udev 是一个在用户空间运行的设备管理工具,它与内核进行通信并负责创建、删除和管理设备节点。 udev 的优势包括: 1. 性能优化:udev 使用基于事件驱动的机制,只在需要时才会创建或删除设备节点,从而提高了系统的性能。 2. 强大的权限控制:udev 提供了灵活的设备节点权限控制机制,可以根据设备属性、规则和用户配置设置节点的权限。 3. 可移植性和兼容性:udev 是一个独立于内核版本的用户空间工具,因此更容易适应不同内核版本和不同 Linux 发行版。 4. 更好的可管理性:udev 提供了丰富的规则和配置选项,允许系统管理员自定义设备节点的创建和管理行为。 综上所述,udev 取代了 devfs,成为了现代 Linux 系统中设备节点管理的标准方式,提供了更好的性能、安全性和可管理性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值