Linux 内核模块与_proc 文件系统.pdf
Linux 内核模块是 Linux 操作系统中的一种关键机制,它允许用户动态地修改内核、加载自己编写的程序,而不需要每次都编译内核。这种机制极大地改善了 Linux 的灵活性。
Linux 内核模块可以分为静态可加载模块和动态可加载模块。一旦加载入内核,模块就和内核具有相同的权利。模块可以单独编译成目标代码,这样模块就是一个目标文件。它可以根据用户的实际需要,在系统启动后由用户自己动态地加载到内核中。
Linux 内核模块的加载和卸载由两种方式:1.根用户(root)可以通过 insmod 和 rmmod 命令显示地将模块载入或从内核中将其卸载。2.内核也可以根据需要时,请求守护进程(kemeld)加载和卸载模块。
Linux 内核模块有一个变量叫 module list,定义在 /linux/include/linux/module.h 中,其定义的原型为:extern struct module *module_list; 这是一个全局变量,每当用户将一个模块加载到内核中时,这个模块就被添加到由 module list 形成的链表中。每当内核要使用到这个用户加载的模块所提供的函数时,内核就会去检索这个链表,找到这个模块,然后再使用到其提供的函数或变量。
每个模块都可以输出(export)一组变量和函数,供其他模块或核心代码调用。当然这些模块也可以使用已经加载到内核中的模块提供的函数和变量。模块可以通过符号表(symbol table)使用核心资源,内核将资源登记再符号表中。当模块加载时,内核利用符号表来解决模块的资源引用问题。
Linux 允许模块堆栈(module stacking),即一个模块可以请求其他模块为之服务。当模块加载入内核时,系统将新加载模块提供的资源和符号加到内核符号表中。通过这种通信机制,新加载的模块可以访问已加载的模块提供的资源。
_proc 文件系统是一个伪的文件系统,就是说它是一个实际上不存在的目录,它并不存在于某个磁盘上,而是由核心在内存中产生。这个目录用于提供关于系统的信息。通过 proc 文件系统,可以用标准 Unix 系统调用(比如 open、read、write、ioctl 等等)访问进程地址空间。事实上,ps 命令正是利用 proc 文件系统获取进程状态。
在 proc 文件系统中,每个进程都有一个对应的目录,每个目录下面都有很多文件,提供了关于进程的信息,例如进程的状态、进程的地址空间、进程的打开文件等等。用户可以通过 proc 文件系统来获取进程的信息,从而实现对进程的控制和监控。
Linux 内核模块和 proc 文件系统是两个非常重要的概念,它们是 Linux 操作系统的核心组件。 Linux 内核模块提供了极大的灵活性和可扩展性,而 proc 文件系统提供了关于系统的信息和进程的信息。这两个概念的结合使用,可以实现对系统的完全控制和监控。