计算机系统大作业*
**摘 要**
hello的生命周期从一个高级c语言程序开始的,然而为了在系统上运行hello.c程序,必须通过预处理、编译、汇编、链接这些过程转化成可执行的目标文件,才能在系统上运行,然后运行并结束。为了深入理解这个具体过程,结合理论知识、运用相关工具对hello的一生的“辗转”、“起伏”进行具体剖析。进而能更好的理解相关过程的实现及原理。
关键词:预处理;汇编;指令;目标文件;进程;信号处理;I/O函数;
(摘要0分,缺失-1分,根据内容精彩称都酌情加分0-1分)
目 录
6.2 简述壳Shell-bash的作用与处理流程 - 31 -
7.2 Intel逻辑地址到线性地址的变换-段式管理 - 38
-
7.3 Hello的线性地址到物理地址的变换-页式管理 - 39
-
7.7 hello进程execve时的内存映射 - 44 -
第1章 概述
1.1 Hello简介
在编辑器中创建并保存文本文件hello.c(Program)。Hello.c文件在经过预处理、编译、汇编、链接后生成了可执行目标文件hello。在向shell输入“./hello”运行hello时shell为其fork了子进程(Process),使得hello从Program变成了Process。
然后shell 通过
execve映射虚拟内存,并且hello中的代码和数据被载入主存。然后CPU开始执行hello程序的main程序中的目标代码。CPU为
hello 分配时间片、执行逻辑控制流。当程序运行结束后,shell 父进程负责回收
hello 进程,内核删除相关数据结构,于是hello“从0到0”结束了。
1.2 环境与工具
环境:VMware Ubuntu
工具:DEVC++、edb、gdb、
1.3 中间结果
中间结果 | 备注 |
---|---|
hello.i | 用来分析预处理过程的作用 |
hello.s | 用来分析编译阶段的作用 |
hello.o | 可重定位目标文件 |
hello.elf | 可重定位目标文件ELF文件 |
hello.asm | 可重定位目标文件反汇编 |
hello.ld | 可执行的目标文件 |
hello.ldelf | 可执行的目标文件ELF格式 |
hello.asm1 | 可执行的目标文件反汇编 |
1.4 本章小结
本章主要介绍了完成本项目的操作环境、应用工具,以及产生的中间结果。
(第1章0.5分)
第2章 预处理
2.1 预处理的概念与作用
概念:预处理器(cpp)根据以字符#开头的命令,修改原始的c程序。
主要作用为:
1.文件包含:将源文件中以“include”格式包含的文件复制到编译的源文件中。
2.处理宏定义:用实际值替换用“#define”定义的字符串。
3.处理条件编译:根据“#if”后面的条件决定需要编译的代码。
2.2在Ubuntu下预处理的命令
命令:cpp hello.c > hello.i
图2.1Ubuntu下生成hello.i文件
2.3 Hello的预处理结果解析
图2.2 hello.i局部内容
打开hello.i发现在:1)hello.c中对应的注释被去掉了。2)原来hello.c对应的代码之上多出了很多代码,是hello.c中的三个头文件:stdio.h、unistd.h、
stdlib.h的内容。源码中的尖括号表示在包含文件目录中去查找,即到C
编译系统所提供的并存放在指定的子目录下寻找头文件,并将对应内容添加到.i文件。
2.4 本章小结
预处理主要对hello.c进行展开头文件、宏替换、去掉注释、条件编译,完成的基本上是对源程序的“替代”工作。经过此种替代,生成一个没有宏定义、没有条件编译指令、没有特殊符号的输出文件hello.i。这个文件的含义同没有经过预处理的源文件是相同的,但内容有所不同。
(第2章0.5分)
第3章 编译
3.1 编译的概念与作用
概念:
编译器将文本文件hello.i翻译成文本文件hello.s,它包含一个汇编语言程序,汇编语言程序中的每条语句都以一种标准的文本格式确切的描述一条低级机器语言指令。
过程:
首先进行词法分析、语法分析,然后进行代码优化:删除公共表达式、循环优化、复写传播,以及无用赋值的删除等,并为存储分配空间,最后在确认所有的指令都符合语法规则之后,将其翻译成等价的中间代码表示或汇编代码。即:
-
词法分析、语法分析
-
代码优化、存储分配
-
代码生成
3.2 在Ubuntu下编译的命令
命令:gcc -S hello.c -o hello.s
图3.1Ubuntu下生成hello.s文件
3.3 Hello的编译结果解析
3.3.1数据
图 3.2 hello.c中包含的数据
可以看到hello.c中的数据包括:1)常量:字符串;2)局部变量:i;
3)全局变量:sleepsecs;4)外部参数:argc、argv。
- 常量处理
可以看到:1)字符串常量被处理成了UTF-8格式。2)这两个字符串直接存放在汇编程序中的只读数据域。