操作系统:编译器混乱

Operating Systems: Compiler Confusion

同学问我既然OS是扩展机或虚拟机,编译器在生成汇编代码时是否需要知道寄存器的数量,或者处理器的指令?一个 C 程序。

我在网上搜索了一段时间,以下是我的想法...

它不需要知道寄存器的数量,因为作为一个虚拟机,它的内存资源是无限的。

但是,它确实需要知道处理器的指令才能知道它何时能够在特定时间执行特定功能。

我想知道是否有人可以为我澄清这个问题,因为我对自己的回答不是很有信心。

实际上,编译器正在编译(进入object code, often via some assembler file) not only for a target processor (in particular instruction set architecture - ISA), but for a target application binary interface - ABI, which defines some conventions regarding register usage (and how to make system calls) & calling conventions

操作系统(由 kernel) is - or gives to application programs and processes - a virtual machine very close to the processor; the VM is the (user-mode, unpriviledged) machine instructions + an instruction (SYSENTER) to switch into kernel or supervisor mode 提供,用于系统调用。

另见 & that. Regarding compilers, read about register allocation, instruction scheduling, optimizing compilers

如果您的计算机上有 GCC,请尝试使用 gcc -fverbose-asm -O -S hello.c 编译一个 hello-world 程序(可能在新目录中),然后查看生成的汇编代码 hello.s;添加 -fdump-tree-gimple 并查看其他编译器转储文件[s](甚至更多 -fdump-tree-all

PS。一些编译器在内存中编译为机器代码(例如 SBCL). Read also about JIT compilers. Other compilers compile to C code.

编译有几个阶段,从不同的抽象到目标机器,这取决于编译器架构。

在某些阶段,寄存器不是很有限,但在某些阶段之后会完成映射。您可以阅读有关 register allocation for more details. I can also suggest you to have a look at Appel's book 编译器架构的文章。