logo资料库

HIT-CSAPP 大作业 Hello的一生.docx

第1页 / 共57页
第2页 / 共57页
第3页 / 共57页
第4页 / 共57页
第5页 / 共57页
第6页 / 共57页
第7页 / 共57页
第8页 / 共57页
资料共57页,剩余部分请下载后查看
第1章 概述
1.1 Hello简介
1.2 环境与工具
1.3 中间结果
1.4 本章小结
第2章 预处理
2.1 预处理的概念与作用
2.2在Ubuntu下预处理的命令
2.3 Hello的预处理结果解析
2.4 本章小结
第3章 编译
3.1 编译的概念与作用
3.2 在Ubuntu下编译的命令
3.3 Hello的编译结果解析
3.4 本章小结
第4章 汇编
4.1 汇编的概念与作用
4.2 在Ubuntu下汇编的命令
4.3 可重定位目标elf格式
4.4 Hello.o的结果解析
通过objdump指令可以看到hello.o文件的.text段的具体情况,此时的.text段只是一串
③全局变量的引用对比
4.5 本章小结
第5章 链接
5.1 链接的概念与作用
5.2 在Ubuntu下链接的命令
5.3 可执行目标文件hello的格式
5.4 hello的虚拟地址空间
5.5 链接的重定位过程分析
5.6 hello的执行流程
5.7 Hello的动态链接分析
5.8 本章小结
第6章 hello进程管理
6.1 进程的概念与作用
6.2 简述壳Shell-bash的作用与处理流程
6.3 Hello的fork进程创建过程
Hello的执行是通过在终端中输入./Hello来完成的。接下来shell会执行fork函数。for
6.4 Hello的execve过程
在父进程fork后,父进程重拾自己的老本行,继续运行shell的程序,而子进程将通过execve加载
对于正在运行的Hello来说,除了自己的父进程是Shell之外,其它的一切都与调度运行没有区别。
6.5 Hello的进程执行
在Hello进程执行的时候,操作系统为其维持着上下文。Hello进程就是在其上下文中稳定运行的。
上下文是内核重新启动一个被抢占的进程所需的状态,它由一些对象的值组成,这些对象包括通用目的寄存器、浮
Hello进程在内存中执行的过程中,并不是一直占用着cpu的资源。因为当内核代表用户执行系统调用时,
6.6 hello的异常与信号处理
当程序正常执行直到结束时,显示如下:
如果在程序运行时按下ctrl+z,会产生如下情况:
由于键盘输入的ctrl+z给程序传入了一个SIGSTP信号,这个信号使程序暂时挂起。此时可以输入p
6.7本章小结
第7章 hello的存储管理
7.1 hello的存储器地址空间
逻辑地址:包含在机器语言中用来指定一个操作数或一条指令的地址。每一个逻辑地址都由一个段(segmen
Linux中逻辑地址等于线性地址。因为Linux所有的段(用户代码段、用户数据段、内核代码段、内核数
虚拟地址将贮存看成是一个存储在磁盘上的地址空间的高速缓存,再主存中只保存活动区域,并根据需要再磁盘和
而物理地址则是对应于主存的真实地址,是能够用来直接在主存上进行寻址的地址。几乎无法直接用物理地址直接
7.2 Intel逻辑地址到线性地址的变换-段式管理
在多段模式下,每个程序都有自己的局部段描述符表,而每个段都有独立的地址空间在80386 的段机制中,
(1)段的基地址(Base Address):在线性地址空间中段的起始地址。
(2)段的界限(Limit):表示在逻辑地址中,段内可以使用的最大偏移量。
(3)段的属性(Attribute):表示段的特性。例如,该段是否可被读出或写入,或者该段是否作为一
7.3 Hello的线性地址到物理地址的变换-页式管理
虚拟内存被组织为一个由存放在磁盘上的N个连续的字节大小的单元组成的数组。每字节都有一个唯一的虚拟地址
7.4 TLB与四级页表支持下的VA到PA的变换
7.5 三级Cache支持下的物理内存访问
不同存储技术的访问时间差异很大,速度较快的计数每字节的成本要比速度较慢的计数高,而且容量较小。计算的
三级Cache的核心思想就是每次访问数据的时候都将一个数据块存放到更高一层的存储器中,根据计算的局部
7.6 hello进程fork时的内存映射
当fork函数被当前进程调用的时候,内核会为新进程创建各种数据结构,并分配给它一个唯一的PID。为了
7.7 hello进程execve时的内存映射
这个过程有以下几个步骤:
2.映射私有区域:为新程序的代码、数据、bss和栈区域创建新的区域结构。所有这些新的区域
7.8 缺页故障与缺页中断处理
当CPU想要读取虚拟内存中的某个数据,而这一片数据恰好存放在主存当中时,就称为页命中。相对的,如果D
7.9动态存储分配管理
7.10本章小结
第8章 hello的IO管理
8.1 Linux的IO设备管理方法
8.2 简述Unix IO接口及其函数
1.打开文件。一个应用程序通过要求内核打开相应的文件,来宣告它想要访问一个I/O设备。内核返回一个小
2.Linux创建的每个进程开始时都有三个打开的文件:标准输入(描述符为0)、标准输出(描述符为1)
3.改变当前的文件位置。对于每个打开的文件内核保持着一个文件位置k,初始为0.这个文件位置是从文件开
4.读写文件。一个读操作就是从文件复制n>0个字节到内存,从当前文件位置k开始,然后将k增加到k+n
5.关闭文件。当应用完成了对文件的访问之后,它就通知内核关闭这个文件。作为响应,内核释放文件打开时创
unix io 函数(需要包含头文件
int open(char *filename, int flags, mode_t mode);
open函数将filename转换为一个文件描述符,并且返回描述符数字,返回的描述符总是在进程中当前
O_RDONLY 只读
O_WRONLY 只写
O_RDWR 可读可写
O_CREAT 如果文件不存在,就创建它的一个截断的文件
O_TRUNC 如果文件已存在,就截断它
O_APPEND 在每次写操作前,设置文件位置到文件的结尾处
int close(int fd) 关闭一个打开的文件
ssize_t read(int fd, const void *buf, size_t n)
从描述符为fd的当前文件位置复制最多n个字节到内存位置buf。返回值-1表示一个错误,而返回值0表示
ssize_t write(int fd, const void *buf, size_t n) 从
8.3 printf的实现分析
需要注意,这里的系统调用试运行在内核模式中的。
接下来,系统已经确定了所要显示在屏幕上的符号。根据每个符号所对应的ascii码,系统会从字模库中提取
显卡使用的内存分为两部分,一部分是显卡自带的显存称为VRAM内存,另外一部分是系统主存称为GTT内存
translation table和后面的GART含义相同,都是指显卡的页表,GTT
内存可以就理解为需要建立GPU页表的显存)。在嵌入式系统或者集成显卡上,显卡通常是不自带显存的,而是
显示芯片按照刷新频率逐行读取vram,并通过信号线向液晶显示器传输每一个点(RGB分量)。
8.4 getchar的实现分析
8.5本章小结
结论
附件
参考文献
计算机系统 大作业 题 专 学 班 学 目 程序人生-Hello’s P2P 业 号 级 生 计算机类 1170300707 1736101 郑胜文 指 导 教 师 刘宏伟 计算机科学与技术学院 2018 年 12 月
计算机系统课程报告 摘 要 计算机可以完成成千上万个我们给它的指令,看似很简单,但是隐藏在内部 的是一个非常非常复杂的系统,一个简单的命令的顺利执行必须依赖于各部分紧 密的配合。 本文通过介绍一个 hello.c 从一个简单的 c 源文件一步步执行下去最终变为 屏幕上显示的文字的过程,会为你粗略地讲述每一步的执行原理,带你看到更深 层的执行步骤,会让你对计算机系统的整体运行流程有个初步的认识。 关键词:GCC,汇编,链接,shell,I/O,可重定向文件,edb,readelf,内存; (摘要 0 分,缺失-1 分,根据内容精彩称都酌情加分 0-1 分) - 1 -
计算机系统课程报告 目 录 第 1 章 概述................................................................................................................- 4 - 1.1 HELLO 简介........................................................................................................ - 4 - 1.2 环境与工具....................................................................................................... - 4 - 1.3 中间结果........................................................................................................... - 4 - 1.4 本章小结........................................................................................................... - 5 - 第 2 章 预处理............................................................................................................- 6 - 2.1 预处理的概念与作用....................................................................................... - 6 - 2.2 在 UBUNTU 下预处理的命令............................................................................ - 6 - 2.3 HELLO 的预处理结果解析................................................................................ - 7 - 2.4 本章小结........................................................................................................... - 7 - 第 3 章 编译................................................................................................................- 8 - 3.1 编译的概念与作用........................................................................................... - 8 - 3.2 在 UBUNTU 下编译的命令................................................................................- 8 - 3.3 HELLO 的编译结果解析.................................................................................... - 9 - 3.4 本章小结......................................................................................................... - 13 - 第 4 章 汇编..............................................................................................................- 14 - 4.1 汇编的概念与作用......................................................................................... - 14 - 4.2 在 UBUNTU 下汇编的命令..............................................................................- 14 - 4.3 可重定位目标 ELF 格式..................................................................................- 14 - 4.4 HELLO.O 的结果解析.......................................................................................- 19 - 4.5 本章小结......................................................................................................... - 19 - 第 5 章 链接..............................................................................................................- 23 - 5.1 链接的概念与作用......................................................................................... - 23 - 5.2 在 UBUNTU 下链接的命令..............................................................................- 23 - 5.3 可执行目标文件 HELLO 的格式..................................................................... - 24 - 5.4 HELLO 的虚拟地址空间...................................................................................- 27 - 5.5 链接的重定位过程分析................................................................................. - 29 - 5.6 HELLO 的执行流程...........................................................................................- 33 - 5.7 HELLO 的动态链接分析.................................................................................. - 34 - 5.8 本章小结......................................................................................................... - 36 - 第 6 章 HELLO 进程管理.......................................................................................- 37 - 6.1 进程的概念与作用......................................................................................... - 37 - - 2 -
计算机系统课程报告 6.2 简述壳 SHELL-BASH 的作用与处理流程....................................................... - 37 - 6.3 HELLO 的 FORK 进程创建过程........................................................................- 37 - 6.4 HELLO 的 EXECVE 过程....................................................................................- 37 - 6.5 HELLO 的进程执行.......................................................................................... - 38 - 6.6 HELLO 的异常与信号处理...............................................................................- 38 - 6.7 本章小结..........................................................................................................- 38 - 第 7 章 HELLO 的存储管理...................................................................................- 44 - 7.1 HELLO 的存储器地址空间...............................................................................- 44 - 7.2 INTEL 逻辑地址到线性地址的变换-段式管理.............................................. - 44 - 7.3 HELLO 的线性地址到物理地址的变换-页式管理.........................................- 44 - 7.4 TLB 与四级页表支持下的 VA 到 PA 的变换............................................... - 45 - 7.5 三级 CACHE 支持下的物理内存访问............................................................ - 45 - 7.6 HELLO 进程 FORK 时的内存映射.................................................................... - 45 - 7.7 HELLO 进程 EXECVE 时的内存映射................................................................ - 46 - 7.8 缺页故障与缺页中断处理............................................................................. - 46 - 7.9 动态存储分配管理..........................................................................................- 47 - 7.10 本章小结........................................................................................................- 48 - 第 8 章 HELLO 的 IO 管理....................................................................................- 50 - 8.1 LINUX 的 IO 设备管理方法............................................................................ - 50 - 8.2 简述 UNIX IO 接口及其函数..........................................................................- 50 - 8.3 PRINTF 的实现分析.......................................................................................... - 50 - 8.4 GETCHAR 的实现分析......................................................................................- 52 - 8.5 本章小结..........................................................................................................- 54 - 结论............................................................................................................................- 54 - 附件............................................................................................................................- 55 - 参考文献....................................................................................................................- 56 - - 3 -
计算机系统课程报告 第 1 章 概述 1.1 Hello 简介 现在有一段现成的 Hello 的 c 源文件,即 hello.c。 首先我们需要把源文件通过 gcc 编译器预处理,编译,汇编,链接,最终 我们可以完成一个可以加载到内存执行的可执行目标文件。 之后我们通过终端(shell)输入文件名称,shell 通过 fork 创建一个新的 进程,然后子进程里通过 execve 函数将 Hello 程序加载到内存。虚拟内存机 制为 hello 规划了一片空间,调度器为 hello 规划进程执行的时间片,使其 能够与其他进程合理利用 cpu 与内存的资源。 接下来,cpu 从 Hello 的.text 中逐条地取指令执行,从.data 段去除数 据,异常处理监视键盘输入。Hello 中地 syscall 系统调用语句使内核执行进 程,执行 write 函数,将字符串传递给屏幕 I/O 映射。 文件对传入地字符串分析,读取 vram,然后在屏幕上打印字符,最终程 序结束,shell 回收进程,完成 Hello 程序的执行。 1.2 环境与工具 列出你为编写本论文,折腾 Hello 的整个过程中,使用的软硬件环境,以及开 发与调试工具。 硬件环境:X64 CPU;2GHz;2G RAM;256GHD Disk 以上 软件环境:Windows7 64 位以上;VirtualBox/Vmware 11 以上;Ubuntu 16.04 LTS 64 位/优麒麟 64 位; 开发工具和调试工具:CodeBlocks,Visual Studio 2017,ebd,gdb,gcc 1.3 中间结果 -->hello 的 c 源代码 原文件:hello.c ①:hello.i -->hello.c 预编译产生的 ASCII 文件 ②:hello.s -->hello.i 编译后产生的汇编代码文件 ③:hello.o -->汇编后产生的可重定位目标文件 ④:hello.elf ⑤:hello_o-objdump-d-r.txt -->生成 hello.o 的 elf 文件 -->hello.o 的代码以及重定位条目 - 4 -
计算机系统课程报告 -->链接生成的可执行目标文件 ⑥:hello-ld ⑦:hello-ld-readelf-a.txt ⑧:hello-ld-readelf-d-r.txt -->hello-ld 对应的 elf 条目 -->hello-ld 对应的汇编代码 1.4 本章小结 在本章节当中,我简单介绍了 Hello 程序的执行过程,说明了自己写大作业时 的环境和工具,并且列出了完成大作业的过程中生成的 Hello 的中间文件及其作 用。 (第 1 章 0.5 分) - 5 -
计算机系统课程报告 第 2 章 预处理 2.1 预处理的概念与作用 预处理的概念:预处理又叫做预编译,是指在对 C 源代码文件进行词法扫描 和语法分析之前所做的工作。 预处理的作用: 1. 删除#define,展开所有宏定义。 2. 处理条件预编译 #if, #ifdef, #if, #elif,#endif 3. 处理“#include”预编译指令,将包含的“.h”文件插入对应位置。这可 是递归进行的,文件内可能包含其他“.h”文件。 4. 删除所有注释。/**/,//。 5. 添加行号和文件标识符。用于显示调试信息:错误或警告的位置。 6. 保留#pragma 编译器指令。 2.2 在 Ubuntu 下预处理的命令 预处理命令:gcc -E hello.c -o hello.i 截图: - 6 -
2.3 Hello 的预处理结果解析 计算机系统课程报告 观察 hello.i 文件,发现文件有几千行,远远大于源代码的行数,这是为什么 呢? 首先,最显著的变化就是 hello.c 中所有的头文件的代码,都被写入了 hello.i 当中,也就是说 hello.i 中包含了头文件的代码,这样产生的预处理文件就有了能 够独立运行的源代码,所以 hello.i 才会如此庞大,再根据预处理的作用来看 hello.i 文件,发现 hello.i 中本应该出现注释的位置没有注释,也就是说预处理之后注释 被成功删除了。 这就是预处理的结果解析。 2.4 本章小结 这个步骤是进行 hello.c 的预处理,生成 hello.i,我们通过这一步把 c 文件改变 成了统一格式,对之前代码进行了一些修正,为下一步汇编文件的生成进行做准 备。 (第 2 章 0.5 分) - 7 -
分享到:
收藏