我可以为了乐趣而阅读 Linux 内核的哪些部分?[关闭]
-
06-07-2019 - |
题
编程不是我的主要工作,尽管我喜欢它并且有时会因此获得报酬。多年来,我一直听说 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内核源码 看看是否能找到吸引人的东西。
在 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 开始。*
我们可以学习一些简单的技巧,例如
#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
...
#define min(x, y) ...
...
#define container_of
为了好玩,我想你也可以看看 Minix,它不完全是 Linux,但 tenenbaum 的《现代操作系统》是一本很好的读物。