本次为辅修人工智能中,《计算机系统基础》的大作业。
提前声明:本人仅代表工大最低水准,不能体现工大的水平。无奈为母校丢人十分抱歉。此处隐去教师的姓名也是怕丢老师的脸。
计算机系统
大作业
题 目 程序人生-Hello’s P2P
专 业 能源动力类
学 号 1180200704
班 级 1802007
学 生 肖家豪
指 导 教 师
计算机科学与技术学院
2020年3月
摘 要
本文主要论述了hello.c程序,在linux系统下的运行情况。详细陈述了其在机器级别的编译,内存的调用,及存储器的使用,系统级别的连接,虚拟内存的使用已经I/O设备的管理等方面的内容。详细介绍了hello.c如何一步步的编译解析成为机器码的过程。
关键词:程序的编译;连接;内存;虚拟内存;
目 录
第1章 概述 - 4 -
1.1 Hello简介 - 4 -
1.2 环境与工具 - 4 -
1.3 中间结果 - 4 -
1.4 本章小结 - 4 -
第2章 预处理 - 5 -
2.1 预处理的概念与作用 - 5 -
2.2在Ubuntu下预处理的命令 - 5 -
2.3 Hello的预处理结果解析 - 5 -
2.4 本章小结 - 5 -
第3章 编译 - 6 -
3.1 编译的概念与作用 - 6 -
3.2 在Ubuntu下编译的命令 - 6 -
3.3 Hello的编译结果解析 - 6 -
3.4 本章小结 - 6 -
第4章 汇编 - 7 -
4.1 汇编的概念与作用 - 7 -
4.2 在Ubuntu下汇编的命令 - 7 -
4.3 可重定位目标elf格式 - 7 -
4.4 Hello.o的结果解析 - 7 -
4.5 本章小结 - 7 -
第5章 链接 - 8 -
5.1 链接的概念与作用 - 8 -
5.2 在Ubuntu下链接的命令 - 8 -
5.3 可执行目标文件hello的格式 - 8 -
5.4 hello的虚拟地址空间 - 8 -
5.5 链接的重定位过程分析 - 8 -
5.6 hello的执行流程 - 8 -
5.7 Hello的动态链接分析 - 8 -
5.8 本章小结 - 9 -
第6章 hello进程管理 - 10 -
6.1 进程的概念与作用 - 10 -
6.2 简述壳Shell-bash的作用与处理流程 - 10 -
6.3 Hello的fork进程创建过程 - 10 -
6.4 Hello的execve过程 - 10 -
6.5 Hello的进程执行 - 10 -
6.6 hello的异常与信号处理 - 10 -
6.7本章小结 - 10 -
第7章 hello的存储管理 - 11 -
7.1 hello的存储器地址空间 - 11 -
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 -
7.9动态存储分配管理 - 11 -
7.10本章小结 - 12 -
第8章 hello的IO管理 - 13 -
8.1 Linux的IO设备管理方法 - 13 -
8.2 简述Unix IO接口及其函数 - 13 -
8.3 printf的实现分析 - 13 -
8.4 getchar的实现分析 - 13 -
8.5本章小结 - 13 -
结论 - 14 -
附件 - 15 -
参考文献 - 16 -
第1章 概述
1.1 Hello简介
P2P:
如上图所示,hello.c文件通过cpp成为hello.i文件,再由编译器生成hello.o文件,由连接器与其他的文件连接生成可执行文件。由shell启动程序,调用fork创建子进程。
O2O:由shell通过execve在fork产生的子进程中加载hello。映射虚拟内存,进入程序的入口,载入物理内存,执行main函数。之后通过I/O设备输入输出。程序结束后,shell回收hello进程,删除hello的痕迹。
1.2 环境与工具
硬件环境:AMD Ryzen 5 2500U ,8GB RAM
软件环境:windos10 64位,Ubuntu64位
开发与调试工具:edb,Ultraedit,gdb
1.3 中间结果
1.hello.i:cpp根据以字符#开头的命令,修改原始的C程序。主要是将头文件,例如stdio文件插入程序文本中,得到新的C程序。
2.hello.s:编译器将C语言翻译成汇编语言,作为中间的过度阶段。
3.hello.o:汇编器将汇编语言转化为机器可读的机器语言。
4.hello:源程序中调用了printf,getchar,sleep,atoi等函数。利用连接器,将C语言函数库中相应的可连接文件与3中的文件连接,生成可执行的文件。
5.hello.elf:hello.o的可执行可连接格式。
6.hello1.elf:hello文件的elf格式。
7.hello0.txt:hello.o的反汇编代码。
8.hello1.txt:hello的返回编码。
9.a.out:可执行文件。
1.4 本章小结
本章主要讲述了P2P和O2O的过程,程序的开发环境以及文件生成的中间过程。
(第1章0.5分)
第2章 预处理
2.1 预处理的概念与作用
概念:程序设计领域中,预处理一般是指在程序源代码被翻译为目标代码的过程中,生成二进制代码之前的过程。
作用:最常见的预处理是C语言和C++语言。ISO C和ISO C++都规定程序由源代码被翻译分为若干有序的阶段(phase) ,通常前几个阶段由预处理器实现。预处理中会展开以#起始的行,试图解释为预处理指令(preprocessing directive) ,其中ISO C/C++要求支持的包括#if/#ifdef/#ifndef/#else/#elif/#endif(条件编译)、#define(宏定义)、#include(源文件包含)、#line(行控制)、#error(错误指令)、#pragma(和实现相关的杂注)以及单独的#(空指令) 。预处理指令一般被用来使源代码在不同的执行环境中被方便的修改或者编译。
2.2在Ubuntu下预处理的命令
对hello.c文件预处理命令:gcc -E -o hello.i hello.c。
目录下会增加一个hello.c文件。
hello.c截图:
hello.i文件部分截图:
2.3 Hello的预处理结果解析
从截图中可以看到C的源程序其实依然存在,多出的3000多行带代码实际上是源文件中头文件的源代码。
2.4 本章小结
本章主要利用Linux下的预处理命令,对hello.i文件进行了分析。
(第2章0.5分)
第3章 编译
3.1 编译的概念与作用
概念:
1、利用编译程序从源语言编写的源程序产生目标程序的过程。 2、用编译程序产生目标程序的动作。 编译就是把高级语言变成计算机可以识别的2进制语言
注意:这儿的编译是指从 .i 到 .s 即预处理后的文件到生成汇编语言程序
作用:
将高级语言转化为机器可以读懂的2进制机器码。
3.2 在Ubuntu下编译的命令
对hello.i进行编译的命令是:gcc -S -o hello.s hello.i。
目录下会有一个hello.文件。
3.3 Hello的编译结果解析
3.3.1处理变量(包含赋值
源程序中只有局部变量,int i;分析汇编码知,该变量由系统默认初始化为0,存在寄存器地址-4(%rbp)处。