编译器只是一台"翻译机",它自己没有思想,它只会机械地把输入的 .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% 严丝合缝
-