哈工大计算机系统2022春 大作业 程序人生
计算机系统
计算机系统
大作业
题 目 程序人生-Hello’s P2P
专 业 计算机科学与技术
学 号
班 级
学 生
指 导 教 师 刘宏伟
计算机科学与技术学院
2021年5月
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简介
2. hello.c通过gcc编译器处理得到可执行文件hello,实际过程为
2.1 hello.c经过预处理修改源程序代码生成hello.i文本文件,这是一个新的c程序
2.3 hello.s通过汇编指令集变成二进制可重定位目标文件hello.o但此时该文件还不可以执行
2.4 最后经过链接,将hello.o文件与一些提前编译好的文件合并生成hello可执行文件
4.通过命令解释程序shell为hello创建新的进程,在通过调用execve对虚拟内存进行映射,通过mmap为hello开辟一片空间。
5.最后中央处理器CPU从虚拟内存中截取代码和数据,调度器为进程规划时间片,在发生异常时触发异常处理子程序
1.硬件环境:Intel(R) Core(TM) i7-10875H CPU 2.30 GHz;16GRAM;1024Disk
2.软件环境:Windows11 64位; Ubuntu 20.04 LTS 64位
1.3 中间结果
4.hello.i 预处理后的文件,可以对比查看预处理的内容
1.4 本章小结
本章主要介绍了hello程序的编译执行大概过程,说明了软件运行的设备环境和硬件设施。
第2章 预处理
2.1 预处理的概念与作用
2.作用:读取指定文件的内容并插入源程序,得到一个新的c程序。
2.2在Ubuntu下预处理的命令
2.3 Hello的预处理结果解析
目测文件内容依旧是可阅读的c语言程序代码,但是对一些函数等内容进行了替换。可以得出预处理的内容是对源程序进行的展开。
2.4 本章小结
本章了解了对hello文件的预处理的具体过程和结果,通过对比hello.i和hello文件可以看出预处理的本质工作是进行c语言代码的补充和替换。
第3章 编译
3.1 编译的概念与作用
3.2 在Ubuntu下编译的命令
3.3 Hello的编译结果解析
.section .rofata 只读数据段,存放“”中的字符串
.string “hello %s %s\n” 声明一段字符
.type main,@function 声明符号类型(函数还是数据)
hello程序中也声明了一个局部变量i,暂时保存在堆栈 -4(%rbp)的位置
hello程序中还存在着一个数组argv[]作为函数的参数,存放在 -32(%rbp)的位置
赋值操作:mov a b 代码表示将a中的数据复制到b中,从而实现赋值操作, mov代码一般会带后缀表示操作的数据大小
运算操作:add a b 代码表示将a加给b,可以实现加法运算,hello程序中主要的运算操作为循环过程中的i++,实现方式如图
循环与跳转:通过cmpl代码对后条件码进行判断,je和jle则利用条件码进行跳转,从而实现循环
3.4 本章小结
本章主要从c语言的数据,赋值语句,算术操作,逻辑/位操作,跳转操作,函数操作这几点入手,分析了编译器是如何把hello.i文件从高级的c语言变成了低阶的汇编语言
第4章 汇编
4.1 汇编的概念与作用
概念:通过指令集将汇编程序hello.s转化为机器指令并按一定规则打包得到可重定位目标文件hello.o
作用:将汇编语言翻译成机器语言,使其在链接时能被找到,链接后能够被机器识别并执行。
4.2 在Ubuntu下汇编的命令
4.3 可重定位目标elf格式
- ELF头 :ELF头以一个16字节的序列开始,这个序列描述了生成该文件的系统的字的大小和字节顺序。ELF头剩下的部分包含了帮助链接器语法分析和解释目标文件的信息,其中包括ELF头的大小、目标文件的类型(如可重定位、可执行或者共享的)、机器类型(如x86-64)、节头部表(section header table)的文件偏移,以及节头部表中条目的大小和数量。不同节的位置和大小是有节头部表描述的,其中目标文件中每个节都有一个固定大小的条目(entry)。
- 节头:记录各节名称、类型、地址、偏移量、大小、全体大小、旗标、链接、信息、对齐。
- 重定位节:重定位节保存的是需要被修正的信息。
- 符号表:包含目标模块定义和引用的符号的信息
4.4 Hello.o的结果解析
通过objdump -d -r hello.o命令可以得到hello.o文件的反汇编代码
Hello.o的反汇编代码中,je后的代码不再是原来的段名,改成了确定的地址,这是因为段本身只是汇编语言中用于帮助编写的记忆符号,汇编成机器语言后不能继续使用
Call指令后不再接函数的名字,而是一条重定位条目指引的信息
4.5 本章小结
本章主要介绍了汇编过程,我们通过查看hello.elf文件内容了解了可重定位目标文件的格式,反汇编得到了hello.o文件的汇编代码并与hello.i进行了对比,了解了汇编语言转化为机器语言的过程。
第5章 链接
5.1 链接的概念与作用
1.概念:链接是将各种代码和数据片段收集并组合成为一个单一文件的过程,这个文件可以被加载到内存并执行
2.作用:允许我们把程序分解为更小,更好管理的模块,可以独立的修改和编译这些模块,不必重新编译整个程序。
5.2 在Ubuntu下链接的命令
5.3 可执行目标文件hello的格式
通过readelf -a hello>hello1.elf命令可以生成hello1.elf文件,文件部分内容如下图:
2. 节头对 hello中所有的节信息进行了声明,包括大小和偏移量
5.4 hello的虚拟地址空间
在0x400000~0x401000段中,程序被载入,虚拟地址0x400000开始,到0x400fff结束,可以通过edb找到各个节的信息,虚拟地址开始于0x4010f0,大小为0x145
5.5 链接的重定位过程分析
命令:objdump -d -r hello > hello.txt
2.重定位节中的符号引用这一步中,连接器修改代码节和数据节中对每个符号的引用,使他们指向正确的运行时地址。
3.重定位条目当编译器遇到对最终位置未知的目标引用时,它会生成一个重定位条目。代码的重定位条目放在.rel.txt中。
5.6 hello的执行流程
通过edb打开hello文件,运用step into指令调试,遇到函数会发生跳转
5.7 Hello的动态链接分析
5.8 本章小结
本章研究了链接的过程。通过edb查看hello的虚拟地址空间,对比hello与hello.o的反汇编代码
第6章 hello进程管理
6.1 进程的概念与作用
1.概念:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
2.作用:进程作为一个执行中程序的实例,系统中每个程序都运行在某个进程的上下文中。
6.2 简述壳Shell-bash的作用与处理流程
1.shell程序的作用:Linux系统中,Shell是一个命令解释程序,它为用户提供操作命令和文件的界面,用户可以直接通过在shell程序上输入的指令调用相应的程序
a.在shell命令行中输入命令:$./hello,解释器构造argv和envp;
c. 调用execve()函数在当前进程(新创建的子进程)的上下文中加载并运行hello
程序。将hello中的.text节、.data节、.bss节等内容加载到当前进程的虚拟地址空
d. 调用hello程序的main()函数,hello程序开始在一个进程的上下文中运行。
6.3 Hello的fork进程创建过程
6.4 Hello的execve过程
创建了一个子进程时,子进程调用exceve函数在当前子进程的上下文加载并运行一个新的程序,会经过以下步骤:
3.映射共享区域。先动态链接共享对象,然后再映射到用户虚拟地址空间中的共享区域。
4.设置程序计数器(PC)。Exceve会设置当前进程的上下文中的程序计数器,使之指向代码区域的入口点。
6.5 Hello的进程执行
1.进程上下文切换:如果系统调用因为等待某个事件发生而阻塞,那么内核可以让当前进程休眠,切换到另一个进程
2.进程时间片:进程的运行本质上是CPU不断从程序计数器 PC 指示的地址处取出指令并执行,值的序列叫做逻辑控制流。在一个程序被调运行开始到被另一个进程打断,中间的时间就是运行的时间片
3.用户态和核心态: 进程只有故障、中断或陷入系统调用时才会得到内核访问权限,其他情况下始终处于用户权限之中,这样可以保证系统的安全性。
6.6 hello的异常与信号处理
2.CTRL+Z: 输入ctrl-z默认结果是挂起前台的作业,hello进程并没有回收,而是运行在后台下,用ps命令可以看到,hello进程并没有被回收。
内核发送一个SIGINT信号到前台进程组的每个进程,默认情况是终止前台作业,用ps查看前台进程组发现没有hello进程,如图所示。
6.7本章小结
本章了解了hello进程的执行过程。内核为程序调度,异常处理程序处理各种异常。不同信号有不同的处理机制,不同的shell命令,hello也有不同的响应结果。
第7章 hello的存储管理
7.1 hello的存储器地址空间
2.线性地址:逻辑地址向物理地址转化过程中的一步,逻辑地址经过段机制后转化为线性地址
4.物理地址:CPU通过地址总线的寻址,找到真实的物理内存对应地址。
7.2 Intel逻辑地址到线性地址的变换-段式管理
2.逻辑地址的组成:一个逻辑地址由段标识符和段内偏移量组成。段标识符是一个16位长的字段。其中前13位是一个索引号。后面3位包含一些硬件细节。
看段选择符的T1=0还是1,了解当前要转换是全局段描述符表中的段还是局部段描述符表中的段。
根据段选择符的前13位查找到对应的段描述符,确定Base基地址。
7.3 Hello的线性地址到物理地址的变换-页式管理
1.基本原理:将 程序的逻辑地址空间划分为固定大小的页,而物理内存划分为同样大小的页框。程序加载时,可将任意一页放人内存中任意一个页框,这些页框不必连续,从而实现了离散分配。
7.4 TLB与四级页表支持下的VA到PA的变换
7.5 三级Cache支持下的物理内存访问
7.6 hello进程fork时的内存映射
7.7 hello进程execve时的内存映射
execve 函数调用加载器代码,在当前进程中加载并运行hello 需要以下几个步骤:
1. 删除已存在的用户区域,删除当前进程虚拟地址的用户部分中的已存在的区域结构。
2. 映射私有区域,为新程序的代码、数据、 bss和栈区域创建新的区域结构,所有这些新的区域都是私有的、写时复制的。
7.8 缺页故障与缺页中断处理
缺页故障:当指令引用一个虚拟地址,在 MMU中查找页表时发现与该地址相对应的物理地址不在内存中,因此必须从磁盘中取出的时候就会发生故障。
7.9动态存储分配管理
程序运行时使用动态内存分配器获得虚拟内存。动态内存分配器维护着一个进程的虚拟内存区域,称为堆。
隐式分配器:要求分配器检测一个已分配块何时不再使用,那么就释放这个块,垃圾收集:自动释放未使用的已经分配的块的过程。
隐式空闲链表:空闲块通过头部中的大小字段隐含地连接着。分配器可以通过遍历堆中所有的块,从而间接地遍历整个空闲块的集合。
显式空闲链表:每个空闲块中,都包含一个前驱和后继指针。使用双向链表使首次适配的时间减少到空闲块数量的线性时间。
7.10本章小结
本章介绍了存储器地址空间、段式管理、页式管理,VA 到 PA 的变换、物理内存访问, h内存映射、缺页故障与缺页中断处理、包括隐式空闲链表和显式空闲链表的动态存储分配管理。
第8章 hello的IO管理
8.1 Linux的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本章小结
结论
抽象对计算机系统是很重要的概念,底层信息用二进制来抽象表示,进程是对处
理器、主存和I/O设备的抽象,虚拟内存是对主存和磁盘设备的抽象,文件是对I/O
附件
4.hello.i 预处理后的文件,可以对比查看预处理的内容
参考文献
[2] 哈尔滨工业大学计算机系统大作业2022春_Drama_coder的博客-CSDN博客
[3] https://blog.csdn.net/yueyansheng2/article/details/78860040
哈工大计算机系统2022春 大作业 程序人生相关推荐
- 哈工大2022年大作业——程序人生
- 哈尔滨工业大学-计算机系统-2022春-大作业
摘 要 本文分析Hello程序的全生命周期,首先编写hello.c的源程序,然后运行C预处理器进行预处理,创建hello.i文件,运行C编译器.翻译生成汇编语言文件hello.s,然后运行汇编器,翻 ...
- 【2022】哈工大计算机系统大作业——程序人生Hello’s P2P
2022哈工大计算机系统大作业--程序人生Hello's P2P 摘要 第1章 概述 1.1 Hello简介 1.2 环境与工具 1.3 中间结果 1.4 本章小结 第2章 预处理 2.1 预处理的概 ...
- HIT 深入理解计算机系统 大作业 程序人生-Hello’s P2P
HIT 深入理解计算机系统 大作业 程序人生-Hello's P2P 本论文旨在研究 hello 在 linux 系统下的整个生命周期.结合 CSAPP 课本, 通过 gcc 等工具进行实验,从而将课 ...
- HITICSAPP2019大作业——程序人生-Hello’s P2P
俺是Hello,额是每一个 程序猿 ¤的初恋(羞羞--)却在短短几分钟后惨遭每个菜鸟的无情抛弃(呜呜--),他们很快喜欢上sum.sort.matrix.PR.AI.IOT.BD.MIS--,从不回头 ...
- 哈工大2022春计算机系统大作业:程序人生-Hello‘s P2P
计算机系统 大作业 题 目 程序人生-Hello's P2P 专 业 计算机类 学 号 120L021305 班 级 2003002 学 生 李一凡 指 导 教 ...
- 2022春哈工大ICS大作业——程序人生-hello‘sP2P
计算机系统(初发布于2022/5/15,修改于2022/5/20) 大作业 题 目 程序人生-Hello's P2P 专 业 学 号 班 级 学 生 沈业力 ...
- 哈工大2022秋计算机系统大作业——程序人生
目录 第1章 概述 1.1 Hello简介 1.2 环境与工具 1.3 中间结果 1.4 本章小结 第2章 预处理 2.1 预处理的概念与作用 2.2在Ubuntu下预处理的命令 2.3 Hello的 ...
- 2022哈工大计算机系统大作业——程序人生
计算机系统 大作业 题 目 程序人生-Hello's P2P 专 业 人工智能(未来技术) 学 号 120L020301 班 级 2036011 学 生 张思远 ...
- 哈工大2022秋计算机系统大作业-程序人生(Hello‘s P2P)
计算机系统 大作业 题 目 程序人生-Hello's P2P 专 业 计算机科学与技术 学 号 班 级 学 生 指 导 教 师 刘宏伟 计算机科学与技术学院 ...
最新文章
- 【Qt】Qt再学习(七):QLocalServer、QLocalSocket
- 我的第一个python web开发框架(1)——前言
- 让Updatepanel中的控件触发整个页面Postback
- 算法笔记_204:第四届蓝桥杯软件类决赛真题(Java语言C组)
- 直播内容不合规怎么办?智能AI为您解决审核难题
- Linux中srch出现bash,Shell练习题(3)
- 翻译:Intel CPU架构的历史
- Session为null 问题
- 洛谷——P2440 木材加工
- Visual Entity 手册(一)简介
- 认识“腔体滤波器”一二三事
- Tampermonkey油猴插件——使用教程整理
- C语言基础丨运算符之条件运算符(七)
- specular BRDF
- Make the most of your 20s
- IOS开发大神装逼神器
- amd RX6800和rtx3070哪个好
- netkeeper客户端_星空极速下载-NetKeeper官方版下载[电脑版]-华军软件园
- 4.2 char类型介绍
- jsp基于java廉价房屋租赁管理系统