10.5.5 Linux中的模块

几十年来,UNIX设备驱动程序是被静态链接到内核中的。因此,只要系统启动,设备驱动程序都会被加载到内存中。在UNIX比较成熟的环境中,如大部分的部门小型计算机以及高端的工作站,其共同的特点是I/O设备集都较小并且稳定不变,这种模式工作得很好。基本上,一个计算机中心会构造一个包含I/O设备驱动程序的内核,并且一直使用它。如果第二年,这个中心买了一个新的磁盘,那么重新链接内核就可以了。一点问题也没有。

随着个人电脑平台Linux系统的到来,所有这些都改变了。相对于任何一台小型机上的I/O设备,PC机上可用I/O设备的数量都有了数量级上的增长。另外,虽然所有的Linux用户都有(或者很容易得到)Linux源代码,但是绝大部分用户都没有能力去添加一个新的驱动程序、更新所有的设备驱动程序数据结构、重链接内核,然后把它作为可启动的系统进行安装(更不用提要处理构造完成后内核不能启动的问题)。

Linux为了解决这个问题,引入了可加载模块(loadable module)的概念。可加载模块是在系统运行时可以加载到内核的代码块。大部分情况下,这些模块是字符或者块设备驱动,但是它们也可以是完整的文件系统、网络协议、性能监控工具或者其他想要添加的模块。

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

当一个模块被加载到内核时,会发生下面几件事。第一,在加载过程中,模块会被动态地重新部署。第二,系统会检查这个驱动程序需要的资源是否可用(例如,中断请求级别)。如果有效,则把这些资源标记为正在使用。第三,设置所有需要的中断向量。第四,更新驱动转换表使其能够处理新的主设备类型。最后,运行驱动程序来完成可能需要的特定设备的初始化工作。一旦上述所有的步骤都完成了,这个驱动程序就安装完成了,也就和静态安装的驱动程序一样了。其他现代的UNIX系统也支持可加载模块。