【发布时间】:2012-02-01 18:44:39
【问题描述】:
在新安装的 Ubuntu 上,我在 /usr/include/linux 和 /usr/src/kernel-version-headers/include/linux 中都找到了内核头文件
它们是相同的吗?
【问题讨论】:
标签: linux include linux-kernel
在新安装的 Ubuntu 上,我在 /usr/include/linux 和 /usr/src/kernel-version-headers/include/linux 中都找到了内核头文件
它们是相同的吗?
【问题讨论】:
标签: linux include linux-kernel
它们非常不同; /usr/include/linux 标头是编译系统标准 C 库时使用的标头。它们归 C 库打包所有,并与标准 C 库同步更新。它们的存在是为了向内核提供 userland 接口,正如 C 库所理解和“代理”的那样1。
/usr/src/linux-headers-$(uname -r)/include/linux 标头通过/lib/modules/$(uname -r)/build 符号链接使用。它们归内核头包所有,并与内核同步更新。这些是内核头文件的子集,以及构建树外内核模块所需的足够的 Kbuild 系统。这些文件代表内核内部——如果模块要正确理解内存中的对象,就必须根据这些文件构建。有关详细信息,请参阅内核的 Documentation/kbuild/modules.txt 文件。
1:“中介”是我的第一个词选择,但它暗示了某种访问控制,但事实并非如此。 “代理”意味着第三方流程,但事实并非如此。考虑一下:当一个 C 程序调用 _exit() 时,它实际上是在调用标准 C 库的 _exit() wrapper,它调用了 exit(2) 系统调用。 select(2) 接口对可跟踪的文件描述符数量有一个上限,该限制被编译到标准 C 库中。即使内核接口被扩展,C库也需要重新编译。
【讨论】: