1

我已阅读这些相关问题的一般答案,

但仍然留下了我自己的问题。例如,在int 0x80内核上为系统调用提供服务,但“服务”调用是什么意思?例如,如果为getuid进行服务调用

#define __NR_getuid (__NR_SYSCALL_BASE+ 24)

然后一旦int 0x80发生,内核服务调用。那么内核究竟必须做什么来实现getuid呢?某处必须有一些代码在int 0x80. 假设已经下载了 Linux 内核源代码,您可以在哪里(例如,什么路径)找到源代码实现__NR_getuid

4

2 回答 2

3

的处理程序getuid(2)是 in kernel/timer.c,但你会在那里找到一个单行函数,它根本不会启发你。

我通过make tags在内核源目录的顶层说,然后说vi -t sys_getuid. sys_*()是系统调用入口点在内核中的命名方式。完成此操作后,您可以看到为什么find0xDen 给出的命令应该有效,而且实际上在我的系统上也有效。但是,使用标签更快更容易。

这就是为什么我一直建议那些想了解内核如何工作的人阅读有关它的书。这些书并没有从字面上告诉您每个系统调用是如何实现的,因为这需要它基本上逐行引导您完成所有代码。内核中有数百万个 SLOC。如果你把它打印出来,它实际上需要一个书柜来容纳它,即使你用小文本、双面打印它也是如此。

即使您忽略所有非核心部分,例如驱动程序、奇怪的文件系统、不太流行的 CPU 类型等,以便能够将其减少到其总大小的 1%,您仍然会留下一个十万 SLOC 犁过。这本身就填满了一本大书,没有留下太多评论的空间。

所以,一本关于内核的书的作用是让您全面了解其中发生的事情,以便您能够了解事物的存在位置以及它们是如何被自己激活的。您将了解将它们联系在一起的数据结构,以便您可以跟踪调用链等。

于 2013-01-25T00:38:05.740 回答
0

查找-名称“*.c”| xargs grep -n -E "SYSCALL_DEFINE" | grep getuid

于 2013-01-24T11:28:51.600 回答