FreeBSD中模块相关的命令 kldload

kldload: 用内核连接器把文件装进内核里(这里的文件可以是模块也可以不是模块)
kldunload: 把文件从内核中卸载
kldstat 查看已装载的连接文件列表(不是模块).

kldstat命令输出的内容与装载的模块完全是两个意义。FreeBSD中的模块是指内核的某个部分,执行驱动、系统调用、设备驱动 ...。内核本身包含着一些模块 (如文件系统支持), 而一个连接文件是一个像wrapper的东西,它能够把持大量的模块。或者说,模块是一些结构化的内核代码;连接文件是把持着一个或多个将被插入内核中的 模块的文件。

详解:

内核连接器(kernel linker)
内核连接器只是动态地把代码装载到内核里,ld会像对动态连接的用户程序一样把一个symbol表装到内核里面,当文件被装载,代码会被重新定 位,任何未被解析的symbol会依据内核的symbol表来配好. 文件还包含一个依赖性列表,使几个文件中共有的代码自动装载.内核可以不需用户程序的帮助来加载文件(与老式的LKM系统形成对照),系统的 bootstrap可以预装文件,在获得根磁盘之前所需要的设备得以动态加载,而不必静态地连接到内核。当代码被加载,任何包含SYSINIT的都会运行 .这样,写代码时可以不考虑它是静态加载还是动态加载的.当一个文件被卸载的时候,由SYSUNINIT定义的相似的一系列函数运行。

模块
内核连接器上层的是模块系统.它用SYSINIT为装载的代码实现一个简单的事件系统.它的含义是: 一段代码定义一个模块(用DECLARE_MODULE)并提供一个handler 范式. handler在装载、卸载、关机的时候被调用使模块自我初使化,各种内核子系统都会提供用来注册文件系统、设备或其它什么的泛型handler函数,它 们大多提供包裹了DECLARE_MODULE的宏(如VFS_SET)。

Leave a Reply