Linux设备驱动程序原理及框架内核模块入门篇精品PPT课件
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
内核模块介绍
内核模块
可安装模块是可以在系统运行时动态地安装和 卸载的内核软件。严格来说,这种软件的作用 并不限于设备驱动,例如有些文件系统就是以 可安装模块的形式实现的。但是,另一方面, 它主要用来实现设备驱动程序或者与设备驱动 密切相关的部分(如文件系统等)。
课程内容
内核模块介绍 应用层加载模块操作过程 内核如何支持可安装模块 内核提供的接口及作用 模块实例
内核模块
应用层加载模块操作过程
内核引导的过程中,会识别出所有已经安装的硬件设备,并 且创建好该系统中的硬件设备的列表树:/sys 文件系统。 (udev 服务就是通过读取该文件系统内容来创建必要的设备 文件的。)。根据 /sys 文件系统,内核读取 modules.alias 文件(位于 /lib/modules/2.6.5-1.358/ 目录下,2.6.5-1 为内 核版本号,请替换为你的系统版本号),找到对应的模块, 加载。我们可以看到 modules.alias 文件中都是类似如下的 行:
Linux设备驱动程序原理及框架
内核模块入门篇
课程内容
内核模块介绍 应用层加载模块操作过程 内核如何支持可安装模块 内核提供的接口及作用 模块实例
内核模块介绍
内核模块
Linux采用的是整体式的内核结构,这种结构 的内核一般不能动态的增加新的功能。为此, Linux提供了一种全新的机制,叫(可安装) “模块”(module)。利用这个机制,可以 根据需要,在不必对内核重新编译链接的条件 下,将可安装模块动态的插入运行中的内核, 成为内核的一个有机组成部分;或者从内核移 走已经安装的模块。正是这种机制,使得内核 的内存映像保持最小,但却具有很大的灵活性 和可扩充性。
/* Member of list of modules */ struct list_head list;
/* Unique handle for this module */ char name[MODULE_NAME_LEN];
内核模块
内核如何支持可安装模块
/* Sysfs stuff. */ struct module_kobject mkobj; struct module_param_attrs *param_attrs; struct module_attribute *modinfo_attrs; const char *version; const char *srcversion; struct kobject *drivers_dir;
alias pci:v*d00008139sv00001186sd00001300bc*sc*i* 8139too
内核模块
应用层加载模块操作过程
中间的若干符号包含了很多信息,例如该设备的制造商编 号、设备编号等。例如:
alias pci:v00008086d00007190sv000015ADsd00001976bc06 sc00i00
/lib/modules/2.6.16.27/kernel/drivers/net/8139too.ko : /lib/modules/2.6.16.27/kernel/drivers/net/mii.ko
内核模块
应用层加载模块操作过程
当内核通过 modules.alias 文件确定需要加载 8139too 模 块时,调用 modprobe 8139too,modprobe 工具再通过读 取 modules.dep 文件找到 8139too.ko 行,冒号前的文本给 出了该模块的绝对路径,而后面的文本则是在加载该模块前 需要先行加载的模块,也就是它所依赖的模块。(模块的依 赖性后面讲解)
以上讨论的是内核启动中,发现硬件,并且成功匹配模块 名称并加载的情况。但如果内核没有成功匹配合适的模块呢? 我们就需要作一些工作自己加载了。
当然,我们可以每次手动调用 insmod 加载某个模块,但 如果是硬件设备驱动的话,我们自然更愿意让它在系统引导 时便加载。
内核模块
应用层加载模块操作过程
Fedora 在 core 3 之后的版本中,加入了 /etc/modprobe.conf 文件,我们可以在该文件中加入我们 自己的模块的 alias 行。该文件的作用是在 modprobe 运 行时,添加必要的模块参数、修正模块加载方式或使用更 为灵活的模块加载办法,例如加入安装脚本。
而 LFS 则使用了特意订制的一个服务 S05modules,读 取配置文件 /etc/sysconfig/modules,加载其中以行指定 的模块名称,不过只是简单地调用 modprobe。如果我们 要加入非系统直接支持的硬件的话,则需要修改相应的 modules.dep 文件,以便 modprobe 工具可以正确的识 别模块的绝对路径。
/* Exported symbols */ const struct kernel_symbol *syms; unsigned int num_syms; const unsigned long *crcs;
课程内容
内核模块介绍 应用层加载模块操作过程 内核如何支持可安装模块 内核提供的接口及作用 模块实例
内核模块
内核如何支持可安装模块
每个已安装模块在内核中都有一个module数据结构 (通过系统调用create_module()创建)
内核模块
内核如何支持可安 module_state state;
表示该设备的设备编号是 0x7190,制造商编号是x8086, 模块子系统提供商编号 0x15ad 等等,v即是代表vendor, sv代表 subsystem-vendor,sd代表 subsystem-device。
内核模块
应用层加载模块操作过程
通过这些信息和 modules.alias 某一行匹配之后,便加载 后面指定的模块名称。加载模块使用的是 modprobe 工具。 我们可以发现,modules.alias 文件中给出的模块只是个 名称,并没有模块文件的绝对路径。那么 modprobe 工具 如何定位模块文件本身呢?它需要另一个有用的文件: modules.dep 。该文件和 modules.alias 在同一个目录下。 该文件的内容是像下面一样的行文本: