操作系统内置编译器如何确定C代码的目标机器语言类型?
操作系统相关编译器的目标架构确定逻辑
首先要澄清一个常见误解:大多数操作系统并不会内置用来编译自身代码的编译器。操作系统的内核和核心组件通常是在「交叉编译环境」中构建的——也就是在一台已经运行的机器(比如x86架构的PC)上,使用针对目标CPU架构的交叉编译器,把C代码编译成对应架构的机器码,再部署到目标硬件(比如ARM的嵌入式设备)上。
如果是指操作系统安装完成后,用户可以使用的编译器(比如Linux下的gcc、Windows下的MSVC),它们确定目标机器语言的方式主要有这几种:
- 编译时的目标架构预设:编译器本身在被构建的时候,就已经被配置为针对特定CPU架构生成机器码。比如针对ARM架构的Linux发行版,其预装的
gcc就是编译为ARM目标的版本,编译代码时默认输出ARM机器码。 - 显式指定目标参数:很多编译器支持通过命令行参数手动指定目标架构。比如
gcc可以用-march、-mtune参数,或者直接用arm-linux-gnueabihf-gcc这类交叉编译器命令,明确告诉编译器要生成对应架构的机器码。 - 依赖宿主环境的架构:如果是原生编译器(即运行在某架构的机器上,编译出该架构的机器码),它会默认匹配自身运行的宿主CPU架构。比如在x86-64的Windows上运行的MSVC,默认生成x86-64的Windows可执行文件。
另外,回到操作系统自身的构建场景:当需要为不同CPU架构编译OS时,开发人员会先搭建对应架构的交叉编译工具链——这个工具链的编译器在配置阶段就被指定了目标架构,编译OS代码时自然会生成对应架构的机器码,根本不需要OS自己来“决定”。
内容的提问来源于stack exchange,提问作者Mehdi Charife
相关产品推荐
相关产品推荐

