下一页 上一页 目录

4. Linux 内核

内核实际上做了很多事情。我认为一个合理的总结方式是,它使得硬件能够公平且高效地执行程序想要的操作。

处理器一次只能执行一条指令,但是 Linux 系统看起来可以同时运行很多程序。内核通过非常快速地在任务之间切换来实现这一点。它通过跟踪哪些进程准备就绪,以及哪些进程正在等待某些东西(例如来自硬盘文件的记录或一些键盘输入)来最大程度地利用处理器。这个内核任务被称为调度。

如果一个程序没有做任何事情,那么它就不需要驻留在 RAM 中。即使是一个正在运行的程序,也可能有一些部分没有在运行。每个进程的地址空间被划分为页面。内核跟踪哪些进程的哪些页面正在被最频繁地使用。那些不太常用的页面可以被移出到交换分区。当再次需要它们时,另一个不常用的页面可以被换出,以便为它腾出空间。这就是虚拟内存管理。

如果您曾经编译过自己的内核,您会注意到有很多针对特定设备的选项。内核包含大量特定的代码来与各种不同的硬件进行通信,并将它们以一种统一的方式呈现给应用程序。

内核还管理文件系统、进程间通信以及大量的网络 stuff(内容)。

一旦内核被加载,它做的第一件事就是查找一个 init 程序来运行。

4.1 配置

内核的大部分配置是在您构建它时完成的,使用 make menuconfigmake xconfig/usr/src/linux/(或您的 Linux 内核源代码所在的任何位置)。您可以使用 rdev 重置默认视频模式、根文件系统、交换设备和 RAM 磁盘大小。这些参数以及更多参数也可以从 lilo 传递给内核。您可以在 lilo.conf 中或在 lilo 提示符下给出 lilo 参数以传递给内核。例如,如果您想使用 hda3 作为您的根文件系统而不是 hda2,您可以输入

        LILO: linux root=/dev/hda3

如果您是从源代码构建系统,您可以通过创建一个“单内核”来简化生活。 也就是说,没有模块的内核。 这样您就不必将内核模块复制到目标系统。

注意:System.map 文件被内核日志记录器用来确定生成消息的模块名称。程序 top 也使用此信息。当您将内核复制到目标系统时,也请复制 System.map

4.2 练习

思考一下:/dev/hda3 是一种特殊类型的文件,它描述了一个硬盘分区。但它像所有其他文件一样存在于文件系统中。内核想知道要挂载哪个分区作为根文件系统 - 它还没有文件系统。那么它如何读取 /dev/hda3 来找出要挂载哪个分区呢?

如果您还没有做过:构建您自己的内核。阅读每个选项的所有帮助信息。

看看您能制作出多小的仍然可以工作的内核。您可以通过遗漏错误的东西来学到很多东西!

阅读“The Linux Kernel”(下面的 URL),并在阅读时,找到它引用的源代码部分。这本书(在我写作时)指的是内核版本 2.0.33,这已经非常过时了。如果您下载这个旧版本并在那里阅读源代码,可能会更容易理解。 令人惊讶的是,可以找到名为“process”和“page”的 C 代码片段。

Hack!看看您是否可以使其吐出一些额外的消息或其他东西。

4.3 更多信息


下一页 上一页 目录