本文通过在unbuntu虚拟机下对hello.c文件的预处理、编译、汇编、链接等操作的实现原理分析,还原了hello程序的生命历程,并且对hello程序的进程管理、存储管理和IO管理也做简要的说明。回顾了计算机系统的几乎全部的知识,希望能通过总结对于计算机系统的工作与原理有更深的了解。
关键词:预处理、编译、汇编、链接、进程管理、存储管理、IO管理、计算机系统
目 录
6.2 简述壳Shell-bash的作用与处理流程... - 29 -
6.3 Hello的fork进程创建过程... - 30 -
6.6.3 Hello运行时的异常与信号... - 35 -
7.2 Intel逻辑地址到线性地址的变换-段式管理... - 40 -
7.3 Hello的线性地址到物理地址的变换-页式管理... - 41 -
7.4 TLB与四级页表支持下的VA到PA的变换... - 42 -
7.5 三级Cache支持下的物理内存访问... - 43 -
7.6 hello进程fork时的内存映射... - 44 -
7.7 hello进程execve时的内存映射... - 44 -
第1章 概述
1.1 Hello简介
P2P:From Program to Process
Hello.c代码文件从本质上来说,只是一个文本文件,可以说是一个program的雏形。经过预处理器的预处理,得到Hello.i(预编译文件),Hello.i又被编译为Hello.o(目标文件),而Hello.o文件再经过汇编器翻译,得到Hello.s,成为了机器语言命令汇编文件,最后通过链接器进行链接,才能得到可执行文件hello,这个hello通过shell运行最终得到一个进程Process。
图 1-1 编译系统
020:From Zero-0 to Zero-0
程序本身从虚无中走来,当程序员敲下第一个字母,它便逐渐成型。从最开始的Hello.c文件成型,经历上述P2P过程,最终得到属于自己的进程、内存和CPU时间周期,走向自己的辉煌。在一切落幕后,进程终止,Hello又被回收,删除上下文,释放所有它占有的资源。这个从虚无到存在再次走向虚无的过程就是020。
1.2 环境与工具
硬件工具:X64 I7 CPU,8G RAM,521G SSD
软件工具:Windows10 64位,Vmware 16,Ubuntu 20.04
开发者与调试工具:gcc,gdb,edb,vim,ld,readelf,objdump
1.3 中间结果
中间结果文件名 |
文件作用 |
Hello.i |
预处理后的文件 |
Hello.s |
编译后的汇编文件 |
Hello.o |
汇编后的可重定位目标文件 |
Hello |
连接后的可执行文件 |
Hello_o.elf |
Hello.o的ELF格式 |
Hello.elf |
Hello的ELF格式 |
Hello_o_ass.txt |
Hello.o的反汇编代码 |
Hello_ass.txt |
Hello的反汇编代码 |
1.4 本章小结
本章对Hello.c文件的执行总流程进行了简要概述,解释了P2P和020的概念,随后阐明了实验中的软硬件条件,列出了实验中会用到的中间文件和它们的作用。
第2章 预处理
2.1 预处理的概念与作用
- 概念
程序设计领域中,预处理一般是指在程序源代码被翻译为目标代码的过程中,生成二进制代码之前的过程。这个过程并不对程序的源代码进行解析,但它把源代码分割或处理成为特定的单位。预处理器(CPP)根据以字符#开头的命令,修改原始的C程序,从而得到另一个C程序,通常以Hello.i命名。
- 作用
- 处理头文件
对于本程序来说,6-8行存在代码#include <stdio.h>、#include <unistd.h>、#include <stdlib.h>,预处理器会据此读取系统的头文件,并将它们直接插入程序文本中
- 处理宏定义
对于源代码中存在的#define,对所有引用到define的程序语句进行宏替换,使用实际值替换使用宏定义处的符号。
- 处理条件编译
是根据某类条件进行代码静态编译的手段,可通过表达式的值是否满足要求或某个宏是否被定义来判断编译条件。比如,#ifdef和#if命令等。
- 处理特殊符号
预处理器(CPP)可以识别一些特殊符号,并在后续过程中进行合适的替换。例如#error命令。
- 删除注释