哈工大csapp大作业报告
计算机系统
大作业
题 目 程序人生-Hello’s P2P
专 业 计算学部
学 号 120L022422
班 级 2003008
学 生 曹瑞麒
指 导 教 师 吴锐
计算机科学与技术学院
2021年5月
关键词:Hello程序;预处理;编译;汇编;链接;进程;存储;虚拟内存;I/O ;
第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的整个过程。
1.2 环境与工具
列出你为编写本论文,折腾Hello的整个过程中,使用的软硬件环境,以及开发与调试工具。
硬件:Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz ;16GB RAM;
软件:Windows 10 64位;VMware:Ubuntu 20.04.2 LTS 64位VMware;
开发工具:Vim 8.1.2269 64位;Visual studio 2019 64位;CodeBlocks 20.03 64位
1.3 中间结果
列出你为编写本论文,生成的中间结果文件的名字,文件的作用等。
6.hello.asm:由hello.o反汇编生成的汇编代码。
7.hello_o.asm:由hello反汇编生成的汇编代码文本。
1.4 本章小结
简介了hello 的 p2p,020 过程,阐述了本次实验的环境与开发工具,概述了整个过程的中间文件。
第2章 预处理
2.1 预处理的概念与作用
概念:预处理器根据以字符#开头的命令,修改原始的C程序,如头文件、宏定义和条件编译。生成一个.i文本文件。
作用:预处理器加入头文件、执行宏替换和条件编译。再进行正式的编译工作,便于编译的高效进行。
2.2在Ubuntu下预处理的命令
2.3 Hello的预处理结果解析
2.4 本章小结
本章介绍了预处理的概念和作用,将hello.c预处理为hello.i,并对预处理结果进行了分析。
第3章 编译
3.1 编译的概念与作用
概念:编译器将预处理文本文件hello.i翻译成汇编语言文本文件hello.s,该文件用汇编语言描述了程序的内容
作用:经过词法分析,语法分析,语义分析,和一定的优化来生成可以实现对应程序功能的汇编代码文件,与高级语言相比,汇编语言更接近计算机能够理解的语言,进一步有利于二进制机器语言的生成。
3.2 在Ubuntu下编译的命令
3.3 Hello的编译结果解析
在汇编代码中,指令后面出现过许许多多的形如-32(%rbp)形式的代码声明,其实这些就是寄存器存储的变量,通过特定的寻址方式进行引用。
例如下图中的例子,表示的就是将寄存器%rsi中存储的值,加载到以现在栈指针%rbp指向的位置基础上,减去32所对应的地址中去。
(4)数组/指针/结构操作:argv[0]指向输入程序的路径和名称,addq $16,%rax得到argv[1]。
(5)控制转移:通过上面一个条件判断与7做比较,如果相等则跳转到.L2处,否则忽略跳转指令,继续接下来的指令。
参数传递::第一个参数是argc(int型),第二个参数是argv[](char *型),分别存放在寄存器%rdi和%rsi中;
Call调用:main函数被系统函数__libc_start_main调用,call指令将main函数的地址分配给%rip,随后调用main函数。
函数操作中的栈维护:main函数使用栈指针,同时使用栈帧%rbp来记录使用情况。如图main函数在进入时先将rsp减去32形成一个栈空间结构,然后开始进行各种操作。
可以看到在cmpl处将4与-20(%rbp)比对,因此可以得出argc存放在-20(%rbp)处。若argc不等于4,进入下面的leaq语句
3.4 本章小结
第4章 汇编
4.1 汇编的概念与作用
概念:汇编器(as)将.s汇编程序翻译成机器语言,把这些机器语言指令打包成可重定位目标程序的格式,并将结果保存在.o目标文件中,这个过程就叫做汇编.
作用:同上述概念,即翻译成机器语言并打包成可重定位目标程序格式
4.2 在Ubuntu下汇编的命令
4.3 可重定位目标elf格式
(1)ELF Header:用命令:readelf -h hello.o,如图4.3.1ELF Header
根据头文件的信息,可以知道该文件是可重定位目标文件,有13个节。
(2) Section Headers:命令:readelf -S hello.o
(3)查看符号表.symtab :命令readelf -s hello.o
重定位节:一个.text 节中位置的列表,包含.text 节中需要进行重定位的信息,当链接器把这个目标文件和其他文件组合时,需要修改这些位置。
Offset:需要被修改的引用节的偏移Info:包括symbol和type两个部分,symbol在前面四个字节,type在后面四个字节,
Attend:一个有符号常数,一些重定位要使用它对被修改引用的值做偏移调整Name:重定向到的目标的名称。
4.4 Hello.o的结果解析
(1)操作数:1.hello.s中的操作数时十进制,hello.o反汇编代码中的操作数是十六进制。
(2)分支转移函数调用:跳转语句之后,hello.s中是.L2和.LC1等段名称,而反汇编代码中跳转指令之后是相对偏移的地址,也即间接地址。
(3)操作指令:机器指令中有许多mov,add,去掉了汇编指令中的该类的表示大小的后缀。
4.5 本章小结
汇编的过程相当于重定位,将汇编语言和机器语言以一一映射的关系对应起来翻译。使得程序进一步转化为可识别与可执行。
第5章 链接
5.1 链接的概念与作用
概念:链接是将各种代码和数据片段收集并组合成为一个单一文件的过程,这个文件可被加载到内存并执行。
5.2 在Ubuntu下链接的命令
5.3 可执行目标文件hello的格式
Type类型为EXEC表明hello是一个可执行目标文件,有12个节
5.4 hello的虚拟地址空间
1. 通过查看edb,看出hello的虚拟地址空间开始于0x400000,结束与0x400ff0
2. 由elf文件可看出.inerp偏移量为0x2e0,在edb对应位置找到
3. 同样可以在edb中找到.text段和.rodata 段等
5.5 链接的重定位过程分析
(1)hello中增加新的函数:在hello中链接加入了在hello.c中用到的函数,如exit、printf、sleep、getchar等函数。
(2)hello中增加了.init和.plt节,和一些节中定义的函数。
5.6 hello的执行流程
用edb的analyze功能可以发现动态链接库中依次出现了如下函数:
5.7 Hello的动态链接分析
分析hello程序的动态链接项目,通过edb调试,分析在dl_init前后,这些项目的内容变化。要截图标识说明。
5.8 本章小结
本章通过链接成功生成了可执行的目标文件,并介绍了动态链接库等内容
第6章 hello进程管理
6.1 进程的概念与作用
作用:进程给应用程序提供的关键抽象有两种:一个独立的逻辑控制流,提供一个假象,程序独占地使用处理器;一个私有的地址空间,提供一个假象,程序在独占地使用系统内存。
6.2 简述壳Shell-bash的作用与处理流程
shell是用户与系统交互作用界面。Shell是一个命令解释程序,也是一种程序设计语言。
6.3 Hello的fork进程创建过程
在shell中如果fork返回值小于0,说明fork时出现了一些问题这时需要进行处理。否则就成功创建了子进程。
用户在终端输入对应的指令(./hello 120L022422 曹瑞麒 1),这时shell就会读取输入的命令,并开始进行以下操作:
第一步:判断hello不是一个内置的shell指令,所以调用应用程序,找到当前所在目录下的可执行文件hello,准备执行。
6.4 Hello的execve过程
6.5 Hello的进程执行
逻辑控制流:一系列程序计数器PC的值的序列叫做逻辑控制流,这些值唯一地对应于包含在程序的可执行目标文件中的指令,或是包含在运行时动态链接到程序的共享对象中的指令。
时间片:一个进程执行它的控制流的一部分的每一时间段叫做时间片。
用户模式和内核模式:shell使得用户可以有机会修改内核,所以需要设置一些防护措施来保护内核,如限制指令的类型和可以作用的范围。
上下文切换:上下文就是内核重新启动一个被抢占的进程所需要的状态,是一种比较高层次的异常控制流。
过程:开始Hello运行在用户模式,收到信号后进入内核模式,运行信号处理程序,之后再返回用户模式。运行过程中,cpu不断切换上下文,使运行过程被切分成时间片,与其他进程交替占用cpu,实现进程的调度。
6.6 hello的异常与信号处理
hello执行过程中会出现哪几类异常,会产生哪些信号,又怎么处理的。
乱按的内容将会显示出来,如果包含回车,将会在程序结束之后作为命令输入。
在键盘下按下Ctrl-Z之后,会导致内核发送一个SIGTSTP信号到前台进程组的每个进程,默认情况下结果是停止(挂起)前台作业。
在键盘上按下Ctrl-C之后,会导致内核发送一个SIGINT信号到前台进程组中的每个进程,默认情况下结果是终止前台作业。
6.7本章小结
本章介绍了有关进程管理的多个概念。介绍了Shell的作用和处理流程,以及利用fork创建子进程、利用execve加载进程的方法。展示hello程序执行的具体过程,以及异常信号的处理机制。
第7章 hello的存储管理
7.1 hello的存储器地址空间
逻辑地址:程序代码经过编译后出现在 汇编程序中地址.逻辑地址指的是机器语言指令中,用来指定一个操作数或者是一条指令的地址.
线性地址:也叫虚拟地址,和逻辑地址类似,也是一个不真实的地址,如果逻辑地址是对应的硬件平台段式管理转换前地址的话,那么线性地址则对应了硬件也是内存的转换前地址。
7.2 Intel逻辑地址到线性地址的变换-段式管理
7.3 Hello的线性地址到物理地址的变换-页式管理
7.4 TLB与四级页表支持下的VA到PA的变换
7.5 三级Cache支持下的物理内存访问
现代计算机高速缓存Intel core i7层次结构:每个CPU芯片有四个核,每个核有自己私有的L1 i-cache、L1 d-cache和L2统一的高速缓存。所有的核共享片上的L3统一的高速缓存。
7.6 hello进程fork时的内存映射
7.7 hello进程execve时的内存映射
7.8 缺页故障与缺页中断处理
7.9动态存储分配管理
隐式空闲链表:分配器检测一个已分配块何时不再被程序所使用,那么就释放这个块
显式空闲链表:每次声明内存空间都保证至少分配size_t大小的内存,双字对齐,每次必须从空闲块中分配空间,在申请空间时将空闲的空间碎片合并,以尽量减少浪费。
7.10本章小结
第8章 hello的IO管理
8.1 Linux的IO设备管理方法
Linux中的I/O设备被表示为文件,输入输出用文件的读和写来执行。
8.2 简述Unix IO接口及其函数
打开文件:int open(char *filename, int flags, mode_t mode);
读文件: ssize_t read(int fd, void *buf, size_t n);
写文件: ssize_t write(int fd, const void *buf, size_t n);
8.3 printf的实现分析
从vsprintf生成显示信息,到write系统函数,到陷阱-系统调用 int 0x80或syscall等.
字符显示驱动子程序:从ASCII到字模库到显示vram(存储每一个点的RGB颜色信息)。
显示芯片按照刷新频率逐行读取vram,并通过信号线向液晶显示器传输每一个点(RGB分量)。
8.4 getchar的实现分析
异步异常-键盘中断的处理:键盘中断处理子程序。接受按键扫描码转成ascii码,保存到系统的键盘缓冲区。
8.5本章小结
本章主要介绍了 Linux 的 IO 设备管理方法、Unix IO 接口及其函数,分析了 printf 函数和 getchar 函数的实现。
结论
附件
参考文献
[3] CSDN Ubuntu系统预处理、编译、汇编、链接指令
[5] 《深入理解计算机系统》 Randal E.Bryant David R.O’Hallaron 机械工业出版社
哈工大csapp大作业报告相关推荐
- 2023春哈工大CSAPP大作业
计算机系统 大作业 题 目 程序人生-Hello's P2P 专 业 网络空间安全 学 号 2021112406 班 级 2103901 学 生 刘晓赟 指 导 ...
- 哈工大CSAPP大作业 2022
计算机系统 大作业 题 目 程序人生-Hello's P2P 专 业 计算学部 学 号 120L021920 班 级 2003006 学 生 李启明 指 导 教 师 吴锐 计算机科学与技术学院 202 ...
- 哈工大CSAPP大作业:程序人生-Hello’s P2P
计算机系统 大作业 题 目 程序人生-Hello's P2P 专 业 计算学部 学 号 120L021818 班 级 2003006 学 生 秦 ...
- 哈工大csapp大作业程序人生
大作业 题 目 程序人生-Hello's P2P 专 业 计算机科学与技术 学 号 2021111719 班 级 2103101 学 生 杨济荣 指 导 教 ...
- 哈工大 csapp大作业 120L021917
计算机系统 大作业 题 目 程序人生-Hello's P2P 专 业 计算学部 学 号 120L021917 班 级 2003006 学 生 艾浩林 指 导 ...
- 哈工大CSAPP大作业
计算机系统 大作业 题 目 程序人生-Hello's P2P 专 业 计算机 学 号 120L021022 班 级 2003009 学 生 管宇栋 指 导 教 ...
- 计算机硬件大型作业报告,计算机硬件技术大作业报告.doc
计算机硬件技术大作业报告 计算机硬件技术实践报告 题目 温度测量系统设计 姓名 专业 测控技术与仪器 班级 学号 上海电力学院自动化工程学院 目录: (1) 设计题目 () 开发目的 (3) 小组成员 ...
- 计算机软件技术大作业报告,多媒体技术大作业报告.doc
多媒体技术大作业报告.doc 华南理工大学 多媒体技术 大作业报告 专 业: 班 级: 学 号: 学生姓名: 完成时间: 目录 说 明 --------------------3 第一章概述 ---- ...
- 上海电力学院计算机软件技术大作业,计算机网络应用设计 大作业报告.doc
计算机网络应用设计 大作业报告 上 海 电 力 学 院 课程设计(大型作业)报告 设计名称 计算机网络应用课程设计 课程代码 1305312 院 (系) 电子与信息工程学院 专 业 通信工程 班 级 ...
最新文章
- 一个中心、三大原则,阿里这样做智能对话开发平台
- 基于相空间重构的混沌背景下微弱信号检测方法仿真
- C++二进制文件读写操作
- 【OS学习笔记】十四 保护模式二:段描述符
- java system.load()_System.load()与System.loadLibrary()
- java中的列表栈链表_Java数据结构(栈,队列,双链表)
- SpringCloud 从菜鸟到大牛之三 服务拆分 理论
- selenium IDE的基本命令
- 美国新泽西州,也有一个Menlo Park——门洛公园,尽管不太为人熟知,但爱迪生那里的一个发明却点亮了全世界。...
- 【第123期】面试攻略:谈谈对游戏策划的理解
- 《CSS世界》--张鑫旭 : 前端样式高手进阶CSS
- bitvise ssh client 连接linux,推荐SSH客户端Bitvise SSH Client
- 2022年微软暑期实习提前批面经(苏州STCA)
- 别踩白块游戏java项目总结_学习小游戏别踩白块总结
- UE4UMG系统入门
- C#基于RealPlayX.ocx视频监控整合程序
- 金融量化?金融市场?股票? 来,告诉你这些都是什么
- 详解Yarn中三种资源调度器(FIFO Scheduler、Capacity Scheduler、Fair Scheduler)和配置自定义队列实现任务提交不同队列
- 辞职两年:自由的代价
- 乳腺癌组织病理图像分类
热门文章
- 毕业设计 英雄联盟数据分析与预测 -大数据分析 可视化 机器学习
- 【Simulink】粒子群算法(PSO)整定PID参数(附代码和讲解)
- 卡其色裤子如何搭配鞋子
- Day2 - Wanan 么么哒。
- 随访系统学习笔记之ModelBinder
- BugkuCTF~Misc~WriteUp
- JS小数点保留后2位
- ERD Online 4.0.4 元数据在线建模(免费、私有部署)
- c语言程序设计医院就医,C语言程序设计(医院信息管理系统)附源代码[精品].doc...
- 李一鹏:一份让我无法拒绝的offer | OneFlow U