linux内核杂记(14)-Linux kernel release 5.x(1)

运行的硬件

虽然最初是为32位x86的pc(386或更高)开发的,但今天Linux也(至少)运行在康柏Alpha AXP、Sun SPARC和UltraSPARC、摩托罗拉68000、PowerPC、PowerPC64、ARM、日立SuperH、Cell、IBM S/390、MIPS、惠普PA-RISC、英特尔IA-64、DEC VAX、AMD x86-64 Xtensa和ARC架构上。
Linux很容易移植到大多数通用的32或64位架构上,只要它们有一个分页内存管理单元(PMMU)和一个GNU C编译器(gcc)的端口(GNU编译器集合的一部分,gcc)。Linux也被移植到许多没有PMMU的体系结构中,尽管功能显然有些受限。Linux也被移植到自身。现在,您可以将内核作为用户空间应用程序运行—这称为UserMode Linux (UML)。

内核对设备驱动程序的支持

内核提供了各种各样的接口来支持设备驱动程序的开发。

驱动程序绑定

驱动绑定是将一个设备与一个可以控制它的设备驱动关联起来的过程。总线驱动程序通常会处理这个问题,因为有总线特定的结构来表示设备和驱动程序。使用通用的设备和设备驱动程序结构,大多数绑定都可以使用公共代码进行。

总线Bus

总线类型结构包含了系统中该总线类型上的所有设备的列表。当为一个设备调用device_register时,它被插入到这个列表的末尾。总线对象还包含该总线类型的所有驱动程序的列表。当驱动程序被调用driver_register时,它被插入到这个列表的末尾。这是触发驱动绑定的两个事件。

device_register

当一个新设备被添加时,总线的驱动程序列表将被迭代以找到一个支持它的驱动程序。为了确定这一点,设备的设备ID必须与驱动程序支持的设备ID之一匹配。比较IDs的格式和语义是特定于总线的。与其尝试推导复杂的状态机和匹配算法,不如由总线驱动提供一个回调来比较设备和驱动的id。如果找到匹配,总线返回1,否则0。

int match(struct device * dev, struct device_driver * drv);

如果找到匹配,设备的驱动字段被设置为驱动,驱动的探测回调被调用。这给了驱动程序一个机会来验证它是否真的支持硬件,以及它是否处于工作状态。

设备类

探测成功完成后,设备被注册到它所属的类中。设备驱动程序属于且仅属于一个类,它在驱动程序的devclass字段中设置。调用devclass_add_device来枚举类中的设备,并实际将其注册到类中,这是通过类的register_dev回调发生的。

设备

当一个驱动程序连接到一个设备时,该设备被插入到驱动程序的设备列表中。

sysfs

符号链接是在总线的“devices”目录中创建的,它指向物理层次结构中的设备目录。
在驱动的“devices”目录中创建一个符号链接,它在物理层次结构中指向设备的目录。
在类的目录中创建设备的目录。在该目录中创建一个符号链接,指向设备在sysfs树中的物理位置。
符号链接可以在设备的物理目录中创建到类目录或类的顶级目录(尽管这还没有完成)。也可以创建一个指向它的驱动程序目录。

driver_register

当添加新的驱动程序时,这个过程几乎是相同的。遍历总线的设备列表以找到匹配项。已经有驱动程序的设备会被跳过。遍历所有设备,以便将尽可能多的设备绑定到驱动程序。

删除

当一个设备被移除时,它的引用计数最终将变为0。当它这样做时,驱动程序的remove回调被调用。它从驱动程序的设备列表中删除,并且驱动程序的引用计数减少。两者之间的所有符号链接都被移除。
当一个驱动被移除时,它所支持的设备列表就会被遍历,并且驱动的移除回调函数会为每一个设备调用。设备从列表中移除,符号链接也被移除。

相关推荐
©️2020 CSDN 皮肤主题: 岁月 设计师:pinMode 返回首页