计算机系统
大作业
题 目 程序人生-Hello’s P2P
专 业 计算机科学与技术
学 号 2021110568
班 级 2103102
学 生 王英杰
指 导 教 师 刘宏伟
计算机科学与技术学院
2022年5月
本文介绍了hello程序从程序编写到回收的整个过程,介绍了预处理、编译、汇编、链接生成可执行文件的全过程。。
关键词:预处理;编译;汇编;链接;进程管理;异常;
目 录
2.2在Ubuntu下预处理的命令............................................................................. - 5 -
5.3 可执行目标文件hello的格式........................................................................ - 8 -
6.2 简述壳Shell-bash的作用与处理流程........................................................ - 10 -
6.3 Hello的fork进程创建过程......................................................................... - 10 -
7.2 Intel逻辑地址到线性地址的变换-段式管理............................................... - 11 -
7.3 Hello的线性地址到物理地址的变换-页式管理.......................................... - 11 -
7.4 TLB与四级页表支持下的VA到PA的变换................................................ - 11 -
7.5 三级Cache支持下的物理内存访问............................................................. - 11 -
7.6 hello进程fork时的内存映射..................................................................... - 11 -
7.7 hello进程execve时的内存映射................................................................. - 11 -
7.8 缺页故障与缺页中断处理.............................................................................. - 11 -
8.2 简述Unix IO接口及其函数.......................................................................... - 13 -
第1章 概述
1.1 Hello简介
Hello.c经过预处理器得到hello.i文件,然后经过编译得到hello.s,然后经过汇编得到hello.o,最后链接生成可执行文件hello(.out)。在shell中,fork产生一个子进程,就完成了从program到process
1.2 环境与工具
硬件:X86-64,Intel core i5
软件:windows10,linux,ubuntu20.04
开发工具:gcc,edb等。
1.3 中间结果
hello.c Hello源程序
hello.i 预处理生成文件
hello.s 汇编程序
hello.o 可重定位目标程序
hello.elf Hello.o的ELF格式可执行文件
hello 链接器生成的可执行目标文件
hello.asm Hello.o的反汇编文件
hello1.elf Hello的ELF格式可执行文件
1.4 本章小结
本章主要介绍了开发环境,简述了helloP2P过程。
第2章 预处理
2.1 预处理的概念与作用
(以下格式自行编排,编辑时删除)
概念:程序设计领域中,预处理一般是指在程序源代码被翻译为目标代码的过程中,生成二进制代码之前的过程。
作用:预处理器(preprocessor) 对程序源代码文本进行处理,得到的结果再由编译器核心进一步编译。这个过程并不对程序的源代码进行解析,但它把源代码分割或处理成为特定的单位——(用C/C++的术语来说是)预处理记号(preprocessing token)用来支持语言特性(如C/C++的宏调用)。
2.2在Ubuntu下预处理的命令
2.3 Hello的预处理结果解析
Hello.i文件前所多出的内容基本是源文件中的头文件(如stdio.h)的解析,同时该头文件所引用的头文件也会解析,如此递归解析下去。
2.4 本章小结
本章主要介绍了预处理的过程与作用。
)
第3章 编译
3.1 编译的概念与作用
把预处理的文件进行一系列的语法分析并且进行优化后生成的相应的汇编指令叫做编译,其作用为hello.i文件生成hello.s文件,方便下一步生成二进制文件。
3.2 在Ubuntu下编译的命令
3.3 Hello的编译结果解析
3.3.1字符串
将字符串存放在只读数据段中,globl表示他的作用范围在main函数里。
3.3.2局部变量
局部变量int存放在栈中。
3.3.3数组
Argv[]数组。
3.3.4算数操作符 ++
通过addl实现。
3.3.5赋值
通过movl实现。
3.3.6关系操作
Cmpl实现。
3.3.7控制转移
先cmpl之后通过je和jle实现跳转。
3.3.8函数操作
通过rip等寄存器传参。
3.4 本章小结
介绍了编译的过程和作用,并分析了生成的hello.s文件。
第4章 汇编
4.1 汇编的概念与作用
汇编就是将汇编语言转化为机器可直接识别执行的代码文件的过程,即是机器码,汇编器将.s文件翻译成机器语言指令,把这些指令打包成可重定位目标程序的格式,并将结果保存在.o 文件中。
4.2 在Ubuntu下汇编的命令
4.3 可重定位目标elf格式
1.ELF头
描述了一些基本信息,如文件类型,大小,格式等等。
2.节头部表
描述了每个节的名字,地址等信息。
3.重定位节
4.符号表
4.4 Hello.o的结果解析
- 分支跳转:.s文件通过段名称跳转。.o文件通过地址偏移量跳转。
- 函数调用:.s文件用函数名标识。.o文件用下一条指令标识。
- 数据访问:.s文件中通过如:.LC1(%rip)的形式访问。.o文件中是通过如:0x0(%rip)的形式访问。
4.5 本章小结
对汇编的概念,过程,功能进行了介绍,分析了.s文件与.o文件的不同。
第5章 链接
5.1 链接的概念与作用
链接是将各种代码和数据片段收集并组合成为一个单一文件的过程,这个文件可被加载(复制)到内存并执行。链接使得分离编译成为可能,能够将一个大型的应用程序分解成为更小、更好管理的模块,可以独立地修改和编译这些模块。
5.2 在Ubuntu下链接的命令
5.3 可执行目标文件hello的格式
ELF头:入口地址:0x400550
节头部表:.text段入口地址:0x400550
符号表:
5.4 hello的虚拟地址空间
虚体空间地址:起始点:0x400550
终点:0x401540
5.5 链接的重定位过程分析
Hello.out中已重定位完成,有具体的虚拟地址。
而hello.s中未完成重定位,虚拟地址为0。
5.6 hello的执行流程
libc.so dl_start
libc.so dl_init
_start
libc_start_main
Hello_main
Hello_exit
libc.so exit
5.7 Hello的动态链接分析
(以下格式自行编排,编辑时删除)
分析hello程序的动态链接项目,通过edb调试,分析在dl_init前后,这些项目的内容变化。要截图标识说明。
5.8 本章小结
本章主要介绍链接的概念,过程,及作用。并进行了一些较为详细的分析
第6章 hello进程管理
6.1 进程的概念与作用
进程是操作系统对一个正在运行的程序的一种抽象, 是系统进行资源分配和调度的基本单位,是操作系统结构的基础.
6.2 简述壳Shell-bash的作用与处理流程
Shell是一种命令行解释器,其读取用户输入的字符串命令,解释并且执行命令.首先读取、解析用户输入。如果该命令是内置的 shell 命令则会立即解释。如果不是,则调用fork创建新子进程,再调用execve执行指定程序。
6.3 Hello的fork进程创建过程
shell判断输入字符串“./hello.out 2021110568 王英杰6”不是内置指令,则调用fork,分化成两个进程。
6.4 Hello的execve过程
子进程中shell执行execve系统调用,将hello.out装载入内存,hello成为进程,下一步开始执行
6.5 Hello的进程执行
上下文信息:上下文就是内核重新启动一个被抢占的进程所需要的状态。
时间片:一个进程执行它的控制流的一部分的每一时间段叫做时间片。
进程调度:有异常时,根据异常类型,进入内核模式,处理异常,进行上下文切换。
6.6 hello的异常与信号处理
四类异常:中断、陷阱、故障、 终止。
6.7本章小结
本章描述了进程、shell的概念与作用,分析了fork,execve的进程,展示了异常处理机制
第7章 hello的存储管理
7.1 hello的存储器地址空间
(以下格式自行编排,编辑时删除)
结合hello说明逻辑地址、线性地址、虚拟地址、物理地址的概念。
7.2 Intel逻辑地址到线性地址的变换-段式管理
(以下格式自行编排,编辑时删除)
7.3 Hello的线性地址到物理地址的变换-页式管理
(以下格式自行编排,编辑时删除)
7.4 TLB与四级页表支持下的VA到PA的变换
(以下格式自行编排,编辑时删除)
7.5 三级Cache支持下的物理内存访问
(以下格式自行编排,编辑时删除)
7.6 hello进程fork时的内存映射
(以下格式自行编排,编辑时删除)
7.7 hello进程execve时的内存映射
(以下格式自行编排,编辑时删除)
7.8 缺页故障与缺页中断处理
(以下格式自行编排,编辑时删除)
7.9动态存储分配管理
(以下格式自行编排,编辑时删除)
Printf会调用malloc,请简述动态内存管理的基本方法与策略。
7.10本章小结
(以下格式自行编排,编辑时删除)
第8章 hello的IO管理
8.1 Linux的IO设备管理方法
(以下格式自行编排,编辑时删除)
设备的模型化:文件
设备管理:unix io接口
8.2 简述Unix IO接口及其函数
(以下格式自行编排,编辑时删除)
8.3 printf的实现分析
(以下格式自行编排,编辑时删除)
[转]printf 函数实现的深入剖析 - Pianistx - 博客园
从vsprintf生成显示信息,到write系统函数,到陷阱-系统调用 int 0x80或syscall等.
字符显示驱动子程序:从ASCII到字模库到显示vram(存储每一个点的RGB颜色信息)。
显示芯片按照刷新频率逐行读取vram,并通过信号线向液晶显示器传输每一个点(RGB分量)。
8.4 getchar的实现分析
(以下格式自行编排,编辑时删除)
异步异常-键盘中断的处理:键盘中断处理子程序。接受按键扫描码转成ascii码,保存到系统的键盘缓冲区。
getchar等调用read系统函数,通过系统调用读取按键ascii码,直到接受到回车键才返回。
8.5本章小结
(以下格式自行编排,编辑时删除)
结论
- 预处理
将hello.c中外部头文件内容插入程序文本中,完成字符串的替换,方便后续处理。
- 编译
通过分析,将指令翻译成等价汇编代码。通过编译器,将hello.i 翻译成汇编语言文件 hello.s。
③ 汇编
将hello.s汇编程序翻译成机器语言指令,并把这些指令打包成可重定位目标程序格式,最终结果保存在hello.o 目标文件中。
④ 链接
通过链接器,将hello的程序编码与动态链接库等收集整理成为一个单一文件,生成完全链接的可执行的目标文件hello。
⑤ 加载运行
打开Shell,终端为其fork新建进程,并通过execve把代码和数据加载入虚拟内存空间,程序开始执行。
⑥ 执行指令
在该进程被调度时,CPU为hello其分配时间片,在一个时间片中,hello享有CPU全部资源,PC寄存器一步一步地更新,CPU不断地取指,顺序执行自己的控制逻辑流。
⑦ 访存
内存管理单元MMU将逻辑地址,一步步映射成物理地址,进而通过三级高速缓存系统访问物理内存/磁盘中的数据。
⑧ 动态申请内存
printf 会调用malloc 向动态内存分配器申请堆中的内存。
⑨ 信号处理
进程时刻等待着信号,如果运行途中键入ctr-c ctr-z 则调用shell 的信号处理函数分别进行停止、挂起等操作,对于其他信号也有相应的操作。
⑩终止并被回收
Shell父进程等待并回收hello子进程,内核删除为hello进程创建的所有数据结构。
感悟:
计算机系统这门课加深了对底层计算机结构的认知。
附件
hello.c
源程序
hello.i
预处理后得到的文本文件
hello.s
编译后得到的汇编语言文件
hello.o
汇编后得到的可重定位目标文件
Elf.txt
用readelf读取hello.o得到的ELF格式信息
Elf2.txt
由hello可执行文件生成的.elf文件
hello
可执行文件
参考文献
[1] Randal E.Bryant, David O'Hallaron. 深入理解计算机系统[M]. 机械工业出版社.2018.4
[2] Pianistx.printf 函数实现的深入剖析[EB/OL].2013[2021-6-9].
[3] 赵耀东. 新时代的工业工程师[M/OL]. 台北:天下文化出版社,1998 [1998-09-26]. http://www.ie.nthu.edu.tw/info/ie.newie.htm(Big5).
[4] Florian.printf背后的故事[EB/OL].2014[2021-6-10].https://www.cnblogs.com/fanzhidongyzby/p/3519838.html.