操作系统:编译器混乱

Bob*_*Bob -2 c assembly operating-system cpu-registers instructions

由于操作系统是扩展或虚拟机,同学们提出问题,编译器在生成C程序的汇编代码时需要知道寄存器的数量或处理器的指令.

我花了一段时间在互联网上搜索,这就是我的想法......

它不需要知道寄存器的数量,因为作为虚拟机,它在内存中具有无限的资源.

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

我想知道是否有人可以为我澄清这一点,因为我对我的答案不太自信.

Bas*_*tch 5

在实践中,编译器正在编译(进入目标代码,通常通过一些汇编程序文件),不仅针对目标处理器(特别是指令集架构 - ISA),而且针对目标应用程序二进制接口 - ABI,它定义了一些关于寄存器的约定用法(以及如何进行系统调用)和调用约定.

操作系统(由内核提供)是 - 或者给应用程序和进程 - 非常接近处理器的虚拟机; VM是(用户模式,非特权)机器指令+指令(SYSENTER),用于切换到内核或管理程序模式以进行系统调用.

另见这个那个.关于编译器,请阅读寄存器分配,指令调度,优化编译器.

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

PS.一些编译器编译为内存中的机器代码(例如SBCL).另请阅读有关JIT编译器的信息.其他编译器编译C代码.