Linux 内核源码中 asm 头文件的目录结构与链接实践
在嵌入式开发或内核模块编写过程中,我们经常需要用到内核提供的头文件。其中 asm 目录尤为特殊,它包含了大量与 CPU 架构强相关的定义和宏。
嵌入式平台示例:mini2440 (ARM)
以 mini2440 附带的 Linux 2.6.32.2 内核源码为例,我们可以发现 asm 目录实际上是一个软链接,指向具体的架构实现。
[root@localhost linux-2.6.32.2]# pwd
/opt/FriendlyARM/mini2440/linux-2.6.32.2
[root@localhost linux-2.6.32.2]# find -name asm
./tools/perf/util/include/asm
./arch/frv/include/asm
./arch/h8300/include/asm
...
./arch/arm/include/asm
...
./include/asm
查看 include 目录下的结构,可以看到 asm 指向了 asm-arm:
[root@localhost linux-2.6.32.2]# ll include/
...
lrwxrwxrwx 1 root root 7 2011-09-23 16:13 asm -> asm-arm
...
drwxr-xr-x 2 root root 4096 2011-09-21 20:39 asm-arm
进入 asm-arm 后,会看到大量针对 ARM 架构的底层定义文件,如 atomic.h, cache.h, irqflags.h 等。
桌面平台示例:Fedora9 (x86)
再看 Fedora9 环境下的内核头文件(通过 yum install kernel-devel 安装):
[root@localhost build]# pwd
/lib/modules/2.6.25-14.fc9.i686/build
[root@localhost build]# find -name asm
./include/asm
这里的 asm 同样是一个软链接,但指向的是 x86 架构目录:
[root@localhost build]# ll include/
...
lrwxrwxrwx 1 root root 7 2011-09-12 19:42 asm -> asm-x86
...
drwxr-xr-x 3 root root 12288 2011-09-12 19:42 asm-x86
对比两个平台,核心逻辑是一致的:顶层 include/asm 作为抽象层,通过符号链接指向具体的架构目录(asm-arm 或 asm-x86),这样上层代码只需包含 <asm/xxx.h> 即可,无需关心具体硬件细节。
实际使用:链接到系统路径
在进行内核模块开发时,编译器往往需要在标准路径下查找这些头文件。如果当前工作目录不是内核源码根目录,就需要手动建立链接。
ln -s /lib/modules/2.6.25-14.fc9.i686/build/include/asm /usr/include/asm
ln -s /lib/modules/2.6.25-14.fc9.i686/build/include/linux /usr/include/linux
ln -s /lib/modules/2.6.25-14.fc9.i686/build/include/scsi /usr/include/scsi
执行上述命令后,系统就能识别到对应的内核头文件结构,编译过程便不会报找不到头文件的错误。注意不同发行版的路径可能略有差异,请根据实际 uname -r 查询到的版本调整路径。

