我可以阅读Linux内核的哪些部分?
编程不是我的主要工作,虽然我喜欢它,有时得到报酬。 多年以来,我一直在听说Linux,我的朋友们向我展示了许多* nixes(或* nici?),尽pipe我坚持使用Mac OS。
你是否认为我可以欣赏Linux内核的任何部分,这将帮助我理解什么是整体的东西? 例如,Linux与Darwin有什么不同?
我已经和汇编和DOS一起成长起来了,所以像中断或低级C这样的东西不应该成为理解的障碍。 但是最后我对高级概念更感兴趣,比如线程或者networking堆栈 – 我知道不同的操作系统会有不同的操作系统。 而且我正在寻找一些有趣,轻松和愉快的东西,比如深夜阅读。
(注:做了一个CW,以防万一)
更新:我找了一些文档,并开始阅读:
- 不可靠的locking指南
我会build议看看LXR 。 它使得跟踪代码的stream程变得更加容易(您不必search每个被调用的函数 – 呃,您有,但是网站会为您做)。
一些起点,对于当前版本(2.6.30):
-
start_kernel()
– 将其视为main()
的内核等价物。 这个函数初始化几乎所有的内核子系统; 按照它在代码中看到你在启动过程中看到在屏幕上滚动。 - entry_32.S – 系统调用和中断(x86-32版本,应该更接近你所知道的;注意使用AT&T汇编方言而不是你习惯的英特尔方言)。
- head_32.S – 内核入口点。 这是内核在切换到保护模式后启动的地方; 最后,它会调用
start_kernel()
。 - arch / x86 / boot – 实模式引导代码。 它以汇编( boot / header.S )开始,但是很快跳入C代码(从boot / main.c开始 )。 是否进行实模式初始化(主要是在切换到保护模式之前必须完成的BIOS调用); 它使用奇怪的GCC技巧(
.code16gcc
)编译,它允许生成32位实模式代码。 - arch / x86 / boot / compressed – 如果你想知道“Decompressing Linux …”的消息来自哪里,那就来自这里。
我自己,我总是发现任务调度代码有点唠叨: – /
你需要让自己成为行业外的业余爱好者。 或者一生:-)
内核中的注释可能非常有趣。 有一些关于在哪里可以find最好的 kerneltrap的提示。
arch / sparc / lib / checksum.S- / * Sun,你只是不能打败我,你只是不能。 停止尝试,arch / sparc / lib / checksum.S:*放弃。 我是认真的,我要踢活生生的拱/ sparc / lib / checksum.S * *出你,游戏结束,熄灯* /
linux-0.01.tar.gz是历史性的内核,很适合开始
开始阅读简单,小巧,更好
(也有void main(void)而不是start_kernel()lol:D)
深入研究Linux内核之前,您可能需要阅读或阅读描述Linux内核的书籍。
想到的书是:
- 了解Linux内核,第二版
- UNIX操作系统的devise
你可能会更多的阅读一本关于OS理论的书。 至于源代码:我不知道,但你可以很容易地下载Linux内核源 ,看看你能find什么吸引力。
在src目录下运行时,会出现一些有趣的代码:
grep -ir "fixme" *
也尝试与其他滑稽词汇,废话,狗屎,f ***,企鹅等。
您需要在您的上下文中重新定义单词“有趣”。 🙂
也就是说,Linux内核可能太多了。 首先,您可能需要从一些学术或更原始的内核开始,掌握正在发生的事情。 你也可以考虑Jolix的书。
很多人推荐linux的v0.0.1是最容易理解的。
虽然,如果你寻找好的内核源码来阅读,我不会用linux,这是一个黑客的野兽(就像说海湾合作委员会的来源是“乐趣”)相反,你可能希望尝试Minix或其中之一BSD(Darwin基本上是NetBSD iirc的一个分支),或者甚至是许多免费的DOS克隆之一,如果一切都有点太可怕了。
尝试读取实现这些字符设备的代码:/ dev / zero / dev / null / dev / full
也许随机数发生器,如果你倾向。 该代码比所有其他设备驱动程序简单直接,因为它不会触及任何硬件。
从drivers / char / mem开始*
kernel.h当
一些简单的技巧,我们可以学习,如
#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0])) ... #define min(x, y) ... ... #define container_of
为了好玩,我想你也可以看到Minix,它不完全是Linux,但tenenbaum的现代操作系统是一个很好的阅读。