编译器只是一台“翻译机”,它自己没有思想,它只会机械地把输入的 .c 文件翻译成机器码。而决定“把哪些 .c 文件喂给它翻译”的,是构建系统(Makefile)
关键机制:
当你执行make时,总管会先看ARCH环境变量。
如果
ARCH=arm,总管就把arch/arm/这个目录下的.c文件列表,列成清单,塞给arm-gcc去翻译。如果
ARCH=x86,总管就无视arch/arm/,把arch/x86/目录下的.c文件塞给arm-gcc去翻译
ARCH=arm决定了“哪些代码属于体系相关部分”,而CROSS_COMPILE决定了“如何将体系无关 + 体系相关两部分代码翻译成硬件能跑的指令”
体系无关的代码(骨架):位于
kernel/、mm/、fs/、net/等目录。它负责“通用逻辑”:比如进程调度算法(CFS)、虚拟内存换页(LRU)、文件系统的 inode 管理。
特点:只写逻辑,不碰硬件寄存器。写这些代码的人不需要知道 CPU 是 ARM 还是 x86,只看重算法。
体系相关的代码(皮肤/血管):位于
arch/arm/、arch/x86/目录。它负责“硬件触达”:比如 CPU 上电第一条汇编指令(
head.S)、中断控制器(GIC)初始化、MMU 页表填充、具体 CPU 的 Cache 操作。特点:赤裸裸地操作物理地址和特定寄存器。这段代码必须和 CPU 架构 100% 严丝合缝