一个程序在计算机中是如何运行的?
这是一个困扰了我很久的问题,但是之前都没有想过好好了解,最近在看《深入理解计算机系统》,想将整个流程归纳总结一下,文章结构包括:可执行目标文件的结构——>操作系统如何加载可执行文件——>CPU如何执行可执行文件。可执行目标文件结构(第七章节)
编译器通过预处理、编译、汇编、链接生成了最后的可执行目标文件,文件结构如下:
ELF头描述了代码段.text、.init、.rodata,数据段.data和.bss的位置,在最初加载可执行文件时,会被率先读取到内核态的临时缓冲区,用于构建虚拟映射VMA,说明整个程序的虚拟内存里,哪里是代码段,哪里是数据段。
.init是在main()函数执行之前需要运行的代码,想知道请自行了解。在经过链接之后,代码段里的符号引用已经被重定位成了在代码段和数据段的地址,翻译成汇编语言,就是我们所看到的:
.section .rodata.LC0: .string "Hello, World!".text.globl mainmain: push rbp mov rbp, rsp sub rsp, 16 lea rdi, # rdi = "Hello, World!" call std::operator
页:
[1]