我可以阅读Linux内核的哪些部分以获得乐趣?

时间:2009-06-18 04:05:56

标签: linux open-source operating-system kernel

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

你认为Linux内核中有任何我喜欢看的部分,这有助于我理解整个内容是什么吗?例如,Linux与Darwin有何不同?

我已经在汇编程序和DOS中长大,所以像中断或低级别C这样的东西不应成为理解的障碍。但最后我对高级概念更感兴趣,比如线程或网络堆栈 - 我知道不同的操作系统会以不同的方式执行它们。我正在寻找有趣,轻松和愉快的事情,比如深夜阅读。

(注意:做一个CW,以防万一)

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

12 个答案:

答案 0 :(得分:31)

我建议查看LXR。它可以更容易地跟踪代码流(您不必搜索每个被调用的函数 - 嗯,你有,但网站为你做了)。

当前版本(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 - 如果您想知道“解压缩Linux ...”消息来自哪里,那就是来自这里。

答案 1 :(得分:11)

我自己,我总是发现任务调度代码有点令人兴奋: - /

你需要让自己成为行业之外的业余爱好。或者生活: - )

答案 2 :(得分:8)

内核中的注释非常有趣。在kerneltrap上有一些tips on where to find the best ones

  

arch / sparc / lib / checksum.S- / *太阳,你只是不能打败我,你就是不能。停止尝试,   arch / sparc / lib / checksum.S:*放弃。我很认真,我要踢生活的狗屎   arch / sparc / lib / checksum.S- * out of you,game over,Lights out。* /

答案 3 :(得分:6)

linux-0.01.tar.gz是历史核心,有利于开始 它简单而小巧,适合开始阅读 (也有void main(void)而不是start_kernel()lol:D)

答案 4 :(得分:3)

在深入了解Linux内核之前,您可能想要阅读或略读一本描述Linux内核的书。

想到的书是:

答案 5 :(得分:1)

你可能会更多地阅读有关OS理论的书。至于源代码:我不知道,但你可以轻松下载Linux kernel source,看看你是否能找到任何吸引人的东西。

答案 6 :(得分:1)

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

grep -ir "fixme" *

还尝试其他滑稽术语,废话,狗屎,f ***,企鹅等。

答案 7 :(得分:1)

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

也就是说,Linux内核可能是一个太过庞大的怪物。您可能希望从一些学术或更原始的内核开始,首先了解正在发生的事情。您可能还需要考虑Jolix本书。

答案 8 :(得分:1)

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

但是,如果您正在寻找良好的内核源代码来阅读,我不会选择Linux,它是一个黑客的野兽(就像说GCC来源是“有趣”)相反,您可能希望尝试Minix或其中一个BSD(Darwin基本上是NetBSD iirc的一个分支),甚至是其中一个免费的DOS克隆,如果其他一切都有点过于恐怖......

答案 9 :(得分:1)

尝试阅读实现这些角色设备的代码: 的/ dev /零 的/ dev / null的 的/ dev /全

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

从drivers / char / mem开始。*

答案 10 :(得分:1)

kernel.h

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

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

答案 11 :(得分:0)

为了好玩,我想你也可以看到Minix,它不完全是linux,但tenenbaum的现代操作系统是一个很好的阅读。