【问题标题】:Conflict between system call number and system call handler pointer系统调用号和系统调用处理程序指针冲突
【发布时间】:2011-01-24 19:14:48
【问题描述】:

在阅读操作系统概念(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 在标题下 条目(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。这种差异的原因是什么?

提前致谢

【问题讨论】:

    标签: linux operating-system linux-kernel system-calls


    【解决方案1】:

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

    【讨论】:

    • 我又检查了一遍,我确定它们的拱门是一样的
    • 你在看什么路径?我在 /usr/include/asm/unistd_32.h 和 /usr/include/asm/unistd_64.h 中分别找到了 x86 和 x86-64 的系统调用号。如果您使用的是普通 x86,我希望 /usr/include/asm/unistd.h 将 __NR_close 定义为 6。
    • 我已经检查了您指向两个文件的路径是否具有与您相同的值。但是在内核源代码中,在 include/asm-generic 文件夹中只有一个 unistd.h。为什么会这样? x86 和 x86_64 没有单独的文件
    猜你喜欢
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 2014-09-10
    • 2014-05-17
    • 2014-12-25
    • 2021-09-22
    • 1970-01-01
    • 2022-11-07
    相关资源
    最近更新 更多