编程不是我的主要工作,尽管我喜欢它并且有时会因此获得报酬。多年来,我一直听说 Linux,我的朋友们向我展示了许多 *nixes(或 *nici?),尽管我坚持使用 Mac OS。

您认为 Linux 内核中有哪些部分是我喜欢看的,可以帮助我理解整个内容吗?例如,Linux 与 Darwin 有何不同?

我是在汇编程序和 DOS 的陪伴下长大的,所以中断或低级 C 之类的东西不应该成为理解的障碍。但最终我对高级概念更感兴趣,例如线程或网络堆栈 - 我知道不同的操作系统以不同的方式执行它们。我正在寻找一些有趣、简单和令人愉快的事情,比如深夜阅读。

(笔记:做了一个CW,以防万一)

更新:我查找了一些文档并开始阅读:

有帮助吗?

解决方案

我建议看看 LXR. 。它使遵循代码流程变得更加容易(您不必搜索每个被调用的函数 - 嗯,您已经搜索了,但是网站会为您做这件事)。

当前版本 (2.6.30) 的一些起点:

  • start_kernel() - 将其视为内核等价物 main(). 。该函数初始化了几乎所有的内核子系统;按照它在代码中查看启动过程中屏幕上滚动的内容。
  • 条目_32.S — 系统调用和中断(x86-32版本,应该更接近你所知道的;请注意使用 AT&T 程序集方言,而不是您可能更习惯的 Intel 方言)。
  • head_32.S — 内核入口点。这是内核切换到保护模式后启动的地方;最后,它会调用 start_kernel().
  • 拱门/x86/启动 — 实模式引导代码。它从汇编开始(引导/标头.S),但很快跳转到 C 代码(从 启动/main.c)。是否进行实模式初始化(​​主要是 BIOS 调用,必须在切换到保护模式之前完成);它是使用一个奇怪的 GCC 技巧编译的(.code16gcc),它允许生成 32 位实模式代码。
  • arch/x86/boot/压缩 — 如果您想知道“正在解压 Linux...”消息从何而来,那就是这里。

其他提示

我自己,我总是发现任务调度代码有点麻烦:-/

我认为你需要在行业之外给自己找一个爱好。或者一条生命:-)

内核中的评论可能非常有趣。有一些 关于在哪里找到最好的的提示 在内核陷阱上。

arch/sparc/lib/checksum.S- /* Sun,你就是打不过我,你就是打不到。别再尝试了 arch/sparc/lib/checksum.S:* 放弃。我是认真的,我要把他们踢得屁滚尿流 arch/sparc/lib/checksum.S- * 你完了,游戏结束,熄灯。*/

linux-0.01.tar.gz 是历史内核并且适合开始
它简单又小,更适合开始阅读
(它也有 void main(void) 而不是 start_kernel() 哈哈 :D )

在深入研究 Linux 内核之前,您可能需要阅读或浏览一本描述 Linux 内核的书。

我想到的书是:

阅读一本有关操作系统理论的书可能会让您获益匪浅。就源代码而言:我不知道,但你可以轻松下载 Linux内核源码 看看是否能找到吸引人的东西。

在 src 目录中运行时应该会出现一些有趣的代码:

grep -ir "fixme" *

也可以尝试使用其他滑稽的术语,如垃圾、狗屎、f***、企鹅等。

您需要在您的上下文中重新定义“有趣”这个词。:)

也就是说,Linux 内核可能是一个难以对付的庞然大物。您可能想首先从一些学术或更原始的内核开始,以了解正在发生的事情。您可能还想考虑 乔利克斯 书。

很多人都推荐linux v0.0.1是最容易理解的。

不过,如果您正在寻找好的内核源代码来阅读,我不会选择 linux,它是一种黑客攻击(就像说 GCC 源代码“有趣”)相反,您可能希望尝试 Minix 或其中之一BSD(Darwin 基本上是 NetBSD iirc 的一个分支),或者如果其他一切都有点太可怕的话,甚至可以是许多免费的 DOS 克隆之一。

尝试阅读实现这些字符设备的代码:/dev/zero /dev/null /dev/full

如果您愿意的话,也许还有随机数生成器。该代码比所有其他设备驱动程序简单明了,因为它不接触任何硬件。

从 drivers/char/mem 开始。*

内核.h

我们可以学习一些简单的技巧,例如

#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
...
#define min(x, y) ...
...
#define container_of

为了好玩,我想你也可以看看 Minix,它不完全是 Linux,但 tenenbaum 的《现代操作系统》是一本很好的读物。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top