计算机系统大作业
我是Hello,我是每一个程序猿¤的初恋(羞羞……)
却在短短几分钟后惨遭每个菜鸟的无情抛弃(呜呜……),他们很快喜欢上sum、sort、matrix、PR、AI、IOT、BD、MIS……,从不回头。
只有我自己知道,我的出身有多么高贵,我的一生多么坎坷!
多年后,那些真懂我的大佬(也是曾经的菜鸟一枚),才恍然感悟我的伟大!
想当年: 俺才是第一个玩 P2P的: From Program to Process
懵懵懂懂的你笨笨磕磕的将我一字一键敲进电脑存成hello.c(Program),无意识中将我预处理、编译、汇编、链接,历经艰辛,我-Hello一个完美的生命诞生了。
你知道吗?在壳(Bash)里,伟大的OS(进程管理)为我fork(Process),为我execve,为我mmap,分我时间片,让我得以在Hardware(CPU/RAM/IO)上驰骋(取指译码执行/流水线等);
你知道吗?OS(存储管理)与MMU为VA到PA操碎了心;TLB、4级页表、3级Cache,Pagefile等等各显神通为我加速;IO管理与信号处理使尽了浑身解数,软硬结合,才使我能在键盘、主板、显卡、屏幕间游刃有余, 虽然我在台上的表演只是一瞬间、演技看起来还很Low、效果很惨白。
感谢 OS!感谢 Bash!在我完美谢幕后回收了我。 我赤条条来去无牵挂!
我朝 CS(计算机系统-Editor+Cpp+Compiler+AS+LD + OS + CPU/RAM/IO等)挥一挥手,不带走一片云彩! 俺也是 O2O: From Zero-0 to Zero-0。
历史长河中一个个菜鸟与我擦肩而过,只有CS知道我的生、我的死,我的坎坷,“只有 CS 知道……我曾经……来…………过……”————未来一首关于Hello的歌曲绕梁千日不绝 !!
摘要:
本文章主要内容是hello.c文件在linux下的从产生到结束的全过程。首先是对代码的预处理,编译,汇编的过程,然后是对hello的动态链接。还包括了进程管理、存储管理、I/O管理,存储层次结构、异常控制流、虚拟内存。通过hello实例的学习,可以更深入地了解计算机系统底层运行机制。
关键词:编译、存储层次结构、链接、虚拟内存、操作系统、异常控制流、信号
目 录
- 第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简介
根据Hello的自白,利用计算机系统的术语,简述Hello的P2P,020的整个过程。
在linux的环境下,经过预处理得到hello.i文件,编译形成hello.s汇编语言文件,汇编将其转化为hello.o可重定位目标程序二进制文件,链接最终成为一个可执行文件hello
P2p:
执行目标文件,shell使用fork形成子进程,分配内存资源,execve映射虚拟内存进入程序中,进入main函数执行目标代码,通过取指、译码、执行等微程序,逐步执行目标文件中的程序
020:
程序运行结束,shell父进程回收子进程,内核删除相关的数据结构
1.2 环境与工具
1.2.1 硬件环境
X64 CPU;2.5GHz;16G RAM;256GHD Disk 以上
1.2.2 软件环境
Windows 10; Ubuntu 18.04 ;
1.2.3 开发工具
gpedit+gcc,vim,wxhexeditor
1.3 中间结果
列出你为编写本论文,生成的中间结果文件的名字,文件的作用等。
文件名 作用
hello.c hello源代码
hello.i 预处理文本文件
hello.s 编译后的汇编文件
hello.o 汇编后的可重定位文件
hello 链接后的可执行文件
hello.txt hello.o的反汇编代码
1.4 本章小结
这里介绍了hello从源代码到执行的流程,包括预处理,编译,汇编,链接等过程,体现了p2p 020的理念
第2章 预处理
2.1 预处理的概念与作用
预处理指在代码翻译的过程中生成二进制代码之前的过程。
预处理会展开以#起始的行解释为预处理指令
#if/#ifdef/#ifndef/#else/#elif/#endif、#define、#include等
include形式声明的文件复制到新的程序中,define定义的字符串用实际值代替。
预处理可以让目标程序变小,提高运行速度
2.2在Ubuntu下预处理的命令
图2-1 预处理命令
gcc hello.c -E -o hello.i
生成的与处理之后的文本文件
图2-2 预处理文本文件
2.3 Hello的预处理结果解析
经过了预处理,hello.c转化为hello.i,hello.i程序被拓展为3118行,但依旧是c语言文本文件,从3100行开始就是原始代码,原文件中的头文件依次展开,形成一个完备的程序文本
图2-3 预处理文本文件末尾源代码
2.4 本章小结
hello.c中的源代码很短小,但是真正的实现需要很多附加成分,经过了预处理指令,下一阶段就要进行汇编处理
第3章 编译
3.1 编译的概念与作用
编译指的是将高级语言程序代码翻译成为等价的汇编语言代码的过程。
这里编译器将文本文件hello.i翻译成文本文件hello.s
3.2 在Ubuntu下编译的命令
图3-1 编译指令
gcc hello.i -S -o hello.s
生成的hello.s文件,图·3-2,3-3
图3-2 hello.s(1)
图3-3 hello.s(2)
3.3 Hello的编译结果解析
3.3.1数据
包括一个全局变量和两个字符串