3

在阅读操作系统概念(7e,Silberschatz,Galvin,Gagne)时,我遇到了一个关于向 linux 内核添加系统调用的学习项目。书上说

Linux 内核最新版本的系统调用号列在 /usr/src/linux-2.x/include/asm-i386/unistd.h 中。(例如,__NR_close 对应于为关闭文件描述符而调用的系统调用 close(),被定义为值 6。) /usr/src/linux-2.x/arc/i386/kernel/entry .S 在标题 ENTRY(sys_call_table) 下。请注意,sys_close 存储在表中编号为 6 的条目中,以与 unistd.h 文件中定义的系统调用号一致。(第 75 页)

我已经从 ubuntu 存储库下载了最新的 linux 源代码包,并发现上述源文件的目录和文件名发生了微小的变化。但是文件/usr/src/linux-source-2.6.31/arch/x86/kernel/less syscall_table_32.S 中有一个有趣的事情让我感到困惑,正如书中所说,sys_close 存储在编号为6的条目中,但是,在 unistd.h 文件中 __NR_close 定义为 57,而不是 6。这种差异的原因是什么?

提前致谢

4

1 回答 1

2

你确定你在比较类似的架构吗?在不同的架构上,系统调用很可能有不同的编号。例如,在 x86 上,close 确实是 6,而在 x86-64 上,close 是 3(在我的 PC 上的 unistd.h 中查找)。

于 2010-03-07T23:39:28.477 回答