简介

模块(module)是在内核空间运行的程序,实际上是一种目标对象文件,没有链接,不能独立运行。

内核空间:这个好理解,内核模块嘛,自然运行在内核空间。

目标对象文件:从 Makefile 中就有体现,obj-m = hello.o;编出来的也是一个 ko 二进制文件。

没有链接:

不能独立运行:整个内核可以理解为 0 号进程,整个内核只有一个 main() 函数( 叫做 start_kernel() ),模块只是被 main() 函数调用的一份代码(module 不可以有 main() 函数,module 是处于被动的角色);只不过这份代码功能相对独立,功能相对完善,通过注册,被回调执行。

module_list

kernel 里面有个变量叫 module_list,每当用户将一个 module 载到 kernel 里的时候,这个 module 就会被记录在 module_list 里面。当 kernel 要使用到这个 module 提供的 function 时,它就会去 search 这个 list,找到 module,然后再使用其提供的 function 或 variable。每一个 module 都可以 export 一些 function 或变量来让别人使用。此外,module 也可以使用已经载到 kernel 里的 module 提供的 function,这种情形叫做 module stack。比方说,module A 用到 module B 的东西,那在加载 module A 之前必须要先加载 module B,否则 module A 会无法加载。除了 module 会 export 东西之外,kernel 本身也会 export 一些 function 或 variable。同样的,module 也可以使用 kernel 所 export 出来的东西。

symbol table

在 kernel 里,有一个 symbol table 是用来记录 export 出去的 function 或 variable。除此之外,也会记录着哪个 module export 哪些 function。

参考

Linux内核模块编程

Linux操作系统下如何写一个Module