整个内核并不需要同时装入内存。应该确认,为保证系统能够正常运行,一些特定的内核必须总是驻留在内存中,例如,进程调度代码就必须常驻内存。但是内核其它部分,例如大部分的设备驱动就应该仅在内核需要的时候才装载,而在其它情况下则无需占用内存。
举例来说,只有在内核真正和CD-ROM通讯时才需要使用完成内核与CD-ROM通讯的设备驱动程序,因此内核可以被设置为在和设备通讯之前才装载相应代码。内核完成和设备的通讯之后可以将这部分代码丢弃。也就是说,一旦代码不再需要,就可以从内存中移走。系统运行过程中可以增减的这部分内核称为内核模块。
内核模块的优点是可以简化内核自身的开发。假设你购买了一个新的高速CD-ROM驱动器,但是现有的CD-ROM驱动程序并不支持该设备。你自然就希望增加对这种高速模式的支持以提高系统光驱设备的性能。如果作为内核模块来编译驱动程序,你的工作将会方便得多:编译驱动程序,加载到内核,测试,卸载驱动程序,修改驱动程序,再次加载驱动程序到内核,测试,如此周而复始。如果你的驱动程序是直接编辑在内核中的,那么你就必须重新编译整个内核并且在每次修改驱动程序之后重新启动机器。这样慢得很多。
自然,你也必须留意内核模块。对于指明其它内核模块在磁盘上的驻留位置的那些模块,一定不能从内存中卸载,否则,内核将只能通过访问磁盘来装载处理磁盘访问的内核模块,这是不可能实现的。这也是我们要选择把部分内核作为模块编译还是直接编译进内核使其常驻内存的又一个原因。你知道自己系统的设置方式,因而也就可以自己选择正确使用的方式。(如果为了确保安全,你可以简单的忽略内核模块系统的优点,而把所有的内容都编译到内核里面。)
内核模块会带来一些速度上的损失,这是因为一些必需的代码现在并不在RAM中,必需要从磁盘读入。但是整个系统的性能通常会有所提高,这主要是因为通过丢弃暂时不使用的模块可以释放出额外的RAM供应用程序使用。如果这部分内存被内核所占用,应用程序将只能更加频繁地进行磁盘交换(swap),而这种磁盘交换会显著的降低应用程序的性能。(磁盘交换将在第8章中讨论。)
内核模块还会带来因复杂度的增加所造成的开销,这是因为在系统运行的过程中移进移出部分内核需要额外的代码。然而,正如你将在本节中看到的,复杂度的开销是可以管理的。通过使用外部程序来代理一些必需的工作还可以更进一步降低复杂度的开销。(更为确切的说法是,这样做不是减少了复杂度的开销,而是把复杂度的开销重新分配了一下。)这是对内核模块原理的一个小小的扩展:即使是内核的支持模块对于内核来说也只是外部的,部分可用的,只有在需要的时候才被装入内存。
文章评论(0条评论)
登录后参与讨论