哈工大计算机系统大作业

计算机系统 大作业

题 目 程序人生-Hello’s P2P
专 业 计算机类_________
学   号 _____
班   级 _______
学 生 ________
指 导 教 师 __________

计算机科学与技术学院
2021年5月

摘 要

本文对hello程序的整个生命周期进行了系统的分析,一开始在键盘上手动编写hello.c源程序,之后运行C预处理器(cpp)将其进行预处理生成hello.i文件,运行C编译器(ccl)将其进行翻译生成汇编语言文件hello.s,然后运行汇编器(as)将其翻译成一个可重定位目标文件hello.o,最后运行链接器程序ld将hello.o和系统目标文件组合起来,创建了一个可执行目标文件hello。当shell接收到./hello的指令后开始调用fork函数创建进程,execve加载hello进入内存,由CPU控制程序逻辑流的运行,中断,上下文切换和异常的处理,最后结束进程并由父进程进行回收,hello走向“生命”的尽头。

关键词:预处理;编译;汇编;链接;进程;存储;IO管理;

(摘要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的预处理结果解析 - 6 -
    2.4 本章小结 - 7 - 第3章 编译 - 8 -
    3.1 编译的概念与作用 - 8 -
    3.2 在Ubuntu下编译的命令 - 8 -
    3.3 Hello的编译结果解析 - 8 -
    3.4 本章小结 - 11 - 第4章 汇编 - 12 -
    4.2 在Ubuntu下汇编的命令 - 12 -
    4.3 可重定位目标elf格式 - 12 -
    4.4 Hello.o的结果解析 - 14 -
    4.5 本章小结 - 16 - 第5章 链接 - 17 -
    5.1 链接的概念与作用 - 17 -
    5.2 在Ubuntu下链接的命令 - 17 -
    5.3 可执行目标文件hello的格式 - 17 -
    5.4 hello的虚拟地址空间 - 19 -
    5.5 链接的重定位过程分析 - 20 -
    5.6 hello的执行流程 - 22 -
    5.7 Hello的动态链接分析 - 22 -
    5.8 本章小结 - 23 - 第6章 hello进程管理 - 24 -
    6.1 进程的概念与作用 - 24 -
    6.2 简述壳Shell-bash的作用与处理流程 - 24 -
    6.3 Hello的fork进程创建过程 - 24 -
    6.4 Hello的execve过程 - 24 -
    6.5 Hello的进程执行 - 25 -
    6.6 hello的异常与信号处理 - 26 -
    6.7本章小结 - 27 - 第7章 hello的存储管理 - 29 -
    7.1 hello的存储器地址空间 - 29 -
    7.2 Intel逻辑地址到线性地址的变换-段式管理 - 29 -
    7.3 Hello的线性地址到物理地址的变换-页式管理 - 30 -
    7.4 TLB与四级页表支持下的VA到PA的变换 - 31 -
    7.5 三级Cache支持下的物理内存访问 - 31 -
    7.6 hello进程fork时的内存映射 - 31 -
    7.7 hello进程execve时的内存映射 - 32 -
    7.8 缺页故障与缺页中断处理 - 32 -
    7.9动态存储分配管理 - 33 -
    7.10本章小结 - 34 - 第8章 hello的IO管理 - 36 -
    8.1 Linux的IO设备管理方法 - 36 -
    8.2 简述Unix IO接口及其函数 - 36 -
    8.3 printf的实现分析 - 36 -
    8.4 getchar的实现分析 - 39 -
    8.5本章小结 - 39 - 结论 - 39 - 附件 - 41 - 参考文献 - 42 -

第1章 概述

1.1 Hello简介
1.最初通过编辑器编写hello的程序建立.c文件,得到hello.c的源程序。
2.运行C预处理器(cpp)将其进行预处理生成hello.i文件。
3.运行C编译器(ccl)将其进行翻译生成汇编语言文件hello.s。
4.运行汇编器(as)将其翻译成一个可重定位目标文件hello.o。
5.运行链接器程序ld将hello.o和系统目标文件组合起来,创建了一个可执行目标文件hello。(如图所示)
在这里插入图片描述

6.通过shell输入./shell,shell通过fork函数创建了一个新的进程,之后调用execve映射虚拟内存,通过mmap为hello程序开创了一片空间。
7.CPU从虚拟内存中的.text,.data节取代码和数据,调度器为进程规划时间片,有异常时触发异常处理子程序。
8.程序运行结束时,父进程回收hello进程和它创建的子进程,内核删除相关数据结构。
1.2 环境与工具
1.硬件环境:X64 CPU;2GHz;4GRAM;256Disk
2.软件环境:Windows10 64位;Vmware 10;Ubuntu 20.04 LTS 64位
3.工具:codeblocks;gdb;Objdump;HexEditor
1.3 中间结果
文件名称 功能
hello.c 源程序
hello.i 预处理后文件
hello.s 编译后的汇编文件
hello.o 汇编后的可重定位目标执行文件
hello 链接后的可执行文件
hello.elf hello.o的ELF格式
hello1.txt hello.o的反汇编
hello2.txt hello的反汇编代码
hello1.elf hello的ELF格式

1.4 本章小结
本章总体介绍了hello程序“一生”的过程,以及进行实验时的软硬件环境及开发与调试工具等基本信息。
(第1章0.5分)

第2章 预处理

2.1 预处理的概念与作用
1.预处理概念:预处理器(cpp)根据以字符#开头的命令,修改原始的C程序。
2.预处理作用:根据源代码中的预处理指令修改源代码,预处理从系统的头文件包中将头文件的源码插入到目标文件中,宏和常量标识符已全部被相应的代码和值替换,最终生成.i文件。
2.2在Ubuntu下预处理的命令
Linux中hello.c文件进行预处理的命令是:gcc -E -o hello.i hello.c
在这里插入图片描述

2.3 Hello的预处理结果解析
在这里插入图片描述

         (hello.i文件部分截图)

结果分析:
经过预处理之后,hello.c变为hello.i文件,打开该文件可以发现,文件变为3000多行内容大大增加,且仍为可以阅读的C语言程序文本文件。对原程序中的宏进行了宏展开,头文件中的内容被包含进该文件中。例如声明函数、定义结构体、定义变量、定义宏等内容,如果代码中有#define命令还会对相应的符号进行替换。
2.4 本章小结
本章介绍了预处理的相关概念和作用,进行实际操作查看了hello.i文件,是对源程序进行补充和替换。

(第2章0.5分)

第3章 编译

3.1 编译的概念与作用
1.编译的概念:编辑器(ccl)将文本文件hello.i翻译成文本文件hello.s,它包含一个汇编语言程序。
2.编译的作用:把源程序翻译成目标程序,进行词法分析和语法分析,分析过程中发现有语法错误,给出提示信息。
3.2 在Ubuntu下编译的命令
编译的命令:gcc -S hello.i -o hello.s
在这里插入图片描述

3.3 Hello的编译结果解析
3.3.1汇编初始部分
节名称 作用
.file 声明源文件
.text 代码节
.section.rodata 只读数据段
.globl 声明全局变量
.type 声明一个符号是函数类型还是数据类型
.size 声明大小
.string 声明一个字符串
.align 声明对指令或者数据的存放地址进行对齐的方式
3.3.2数据
①字符串
程序中有两个字符串,这两个字符串都在只读数据段中,分别如图所示:
hello.c中唯一的数组是作为main函数的第二个参数,数组的每个元素都是一个指向字符类型的指针。数组的起始地址存放在栈中-32(%rbp)的位置,被两次调用找参数传给printf
在这里插入图片描述

这两个字符串作为printf函数的参数,如图所示:
在这里插入图片描述

②局部变量i
main函数声明了一个局部变量i,编译器进行编译的时候将局部变量i会放在堆栈中。如图所示,局部变量i放在栈上-4(%rbp)的位置。
在这里插入图片描述

③参数argc
参数 argc 作为用户传给main的参数。也是被放到了堆栈中。
④数组:char *argv[]
char *argv[]是作为main函数的第二个参数,数组的每个元素都是一个指向字符类型的指针。数组的起始地址存放在栈中-32(%rbp)的位置,被两次调用传给printf
在这里插入图片描述

⑤立即数
立即数直接体现在汇编代码中。
3.3.2全局函数
hello.c声明了一个全局函数int main(int argc,char *argv[]),汇编代码说明main函数是全局函数,如图所示:
在这里插入图片描述

3.3.3赋值操作
hello.c中赋值操作是for循环中i=0;在汇编代码中使用mov指令实现,mov指令根据操作数的字节大小分为:
movb:一个字节
movw:“字”
movl:“双字”
movq:“四字”
3.3.4算数操作
hello.c中的算术操作是i++,汇编语言addl $1, -4(%rbp),其他算数操作如图所示:

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值