系统调用号和系统调用处理程序指针之间的冲突
当我阅读《Operating System Concepts》(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_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。这种差异的原因是什么?
提前致谢
When I was reading Operating System Concepts (7e, Silberschatz, Galvin, Gagne), I encountered a study project about adding a system call to the linux kernel. The book says that
The system call numbers for recent versions of the Linux kernel are listed in
/usr/src/linux-2.x/include/asm-i386/unistd.h. (for instance, __NR_close, which
corresponds to the system call close() that is invoked for closing a file
descriptor, is defined as value 6.) The
/usr/src/linux-2.x/arc/i386/kernel/entry.S under the heading
ENTRY(sys_call_table). Notice that sys_close is stored at entry numbered 6 in
the table to be consistent with the system call number defined in unistd.h
file. (pg. 75)
I've downloaded latest linux source package from the ubuntu repository, and found the mentioned source files with minor directory and file name changes. But there is an interesting thing confuses me in the file /usr/src/linux-source-2.6.31/arch/x86/kernel/less syscall_table_32.S, sys_close is stored at entry numbered 6 as said in the book, nevertheless, in unistd.h file __NR_close defined as 57, instead of 6. What is the reason of this difference?
Thanks in advance
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您确定要比较类似的架构吗?在不同的体系结构上,系统调用很可能有不同的编号。例如,在 x86 上,close 确实是 6,而在 x86-64 上,close 是 3(在我的 PC 上的 unistd.h 中查找)。
Are you sure you're comparing like architectures? On different architectures, system calls may well have different numbers. For instance, on x86, close is indeed 6, while on x86-64, close is 3 (looked up in unistd.h on my PC).