我已经阅读了这些相关问题的一般答案,
但仍然留下了我自己的问题。例如,在 int 0x80
上,内核为系统调用提供服务,但“为”调用提供服务意味着什么?例如如果为 getuid 调用服务电话
#define __NR_getuid (__NR_SYSCALL_BASE+ 24)
然后一旦 int 0x80
发生,内核就会为调用提供服务。那么内核究竟必须做什么来实现getuid呢?某处一定有一些代码在 int 0x80
之后运行。假设已经下载了 Linux 内核源代码,您可以在哪里(例如什么路径)找到 __NR_getuid
的源代码实现?
getuid(2)
的处理程序在 kernel/timer.c
中,但您会在那里找到一个单行函数,它不会启发
我通过在内核源目录的顶层输入 make tags
找到该文件,然后输入 vi -t sys_getuid
。 sys_*()
是系统调用入口点在内核中的命名方式。完成后,您就会明白为什么 0xDen 给出的 find
命令应该起作用,事实上在我的系统上也是如此。但是,使用 tags更快更容易。
这就是为什么我一直建议那些想了解内核如何工作的人阅读有关它的书的原因。这些书并没有从字面上告诉您每个系统调用是如何实现的,因为那将要求它基本上逐行引导您完成所有代码。 There are millions of SLOC在内核中。如果您将其打印出来,它实际上需要一个书架才能容纳所有内容,即使您以小字体双面打印它也是如此。
即使您忽略所有非核心部分,例如驱动程序、奇怪的文件系统、不太流行的 CPU 类型等,以便您能够将其减少到总大小的 1%,您仍然留下了十万个 SLOC 来耕耘。这本身就可以写成一本大书,没有留下太多评论的余地。
因此,一本关于内核的书要做的是让您全面了解其中发生的事情,以便您能够自己找出事物存在的位置以及它们是如何被激活的。您将了解将它们联系在一起的数据结构,以便您可以跟踪调用链等。