我目前正在阅读操作系统概念第 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 源代码-2.6 二进制包。
另一件事是目录结构随着时间的推移发生了一些变化;与体系结构相关的标头从移动include/asm-$ARCH
到arch/$ARCH/include/asm
。此外,i386
和体系结构在 2.6.24 中x86_64
合并为统一的。(x86
更多详情请点击这里。) 因此,您现在需要查看arch/x86/include
而不是查看include/asm-i386
。
以下是一些对 Linux 内核黑客有用的资源:
- Linux 设备驱动程序(LDD3)
- 左心室收缩末期(有关 Linux 的新闻,包括 LDD 作者之一撰写的许多有关内核的技术文章)
- 左心室收缩功能浏览和搜索内核源代码
- 伦琴河(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
:)