如何向 Linux 内核添加系统调用?

如何向 Linux 内核添加系统调用?

我目前正在阅读操作系统概念第 7 版,作者:Silberschartz、Galvin 和 Gagne。第 2 章末尾有一个练习“向 Linux 内核添加系统调用”。不幸的是,我发现作者使用的目录结构与 Ubuntu 的目录结构完全不同。例如,作者引用了“/usr/src/linux-2.x/include/asm-i386/unistd.h”,但在我的计算机上,它们是:

  • /usr/src/linux-headers-2.6.38-10
  • /usr/src/linux-headers-2.6.38-10-generic

在这个文件夹中,我找不到任何名为“asm-i386”的东西:(。我想知道是否有专门针对 Ubuntu 的文档?如能提供任何建议,我将不胜感激。

谢谢你,

答案1

Ubuntu 没有什么特别之处。你遇到的第一个困难是你没有安装内核源代码,只有内核头文件。作者在 中描述了一个带有内核源代码副本的系统/usr/src/linux-2.x。如果你只编译外部模块,那么你在系统上看到的头文件就足够了。Ubuntu 在软件包中提供了用于此目的的内核头文件linux-headers-*(你通常会通过依赖项从linux-headers-通用 安装 linux-headers-generic元包)。如果您需要整个源代码,请从Linux 源代码-2.6 安装 linux-source-2.6二进制包。

另一件事是目录结构随着时间的推移发生了一些变化;与体系结构相关的标头从移动include/asm-$ARCHarch/$ARCH/include/asm。此外,i386和体系结构在 2.6.24 中x86_64合并为统一的。(x86更多详情请点击这里。) 因此,您现在需要查看arch/x86/include而不是查看include/asm-i386

以下是一些对 Linux 内核黑客有用的资源:

并阅读此主题在 Unix 和 Linux 上,解释了如何定位现有系统调用的实现。

答案2

/usr/src/linux-headers-2.6.38-10-generic/include/linux/unistd.h

或者在未来的内核中:

/usr/src/linux-headers-KERNEL_VERSION/include/asm-generic/unistd.h

:)

相关内容