【问题标题】:Read a book to learn the Linux kernel [closed]读一本书来学习 Linux 内核 [关闭]
【发布时间】:2013-01-08 01:25:39
【问题描述】:

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

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

#define __NR_getuid (__NR_SYSCALL_BASE+ 24)

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

【问题讨论】:

  • 你说你读过my answer,但你显然没有读到最后一段,它指向一本可以回答所有这些问题的书。我知道“读这本书”不是正确的 SE 答案,但实际上,在这种情况下它是正确的答案。您不会一次只回答一个问答答案来了解内核是如何工作的。
  • @WarrenYoung,感谢您关注我的问题。我想你已经投票结束了。您能否至少指出我可能会找到这个问题的答案的那本书的章节?我喜欢你的最后一句话。可能一次找到一章或一本书的答案吗?
  • 我投票关闭它,因为它不是这里的主题。 Stack Overflow 是针对关于编程的具体问题。如果您问过如何将 getuid() 更改为不同的行为,我怀疑我是否会投票关闭它,特别是如果您说出您已经尝试过的内容。在您找到更多了解相关代码的人的网站上,有关如何深入研究特定代码的问题会更好。在这种情况下,我建议unix.SE。但是直到主持人费心提出这个问题(假设有人这样做),我已经将我的评论扩展到下面的答案。

标签: linux linux-kernel operating-system


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    find -name "*.c"| xargs grep -n -E "SYSCALL_DEFINE" | grep getuid

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-06
      相关资源
      最近更新 更多