计算机系统大作业

本文详细剖析了一篇关于计算机系统基础大作业,涵盖预处理、编译、汇编、链接及进程管理等多个方面。通过对hello.c程序的逐阶段分析,展示了从源代码到可执行文件的生成过程,包括预处理引入头文件、编译成汇编代码、汇编成机器码、链接到最终的可执行文件,并探讨了动态链接、进程创建、内存管理和I/O设备控制等核心概念。
摘要由CSDN通过智能技术生成

本次为辅修人工智能中,《计算机系统基础》的大作业。
提前声明:本人仅代表工大最低水准,不能体现工大的水平。无奈为母校丢人十分抱歉。此处隐去教师的姓名也是怕丢老师的脸。

计算机系统

大作业

题 目 程序人生-Hello’s P2P
专 业 能源动力类
学   号 1180200704
班   级 1802007
学 生 肖家豪    
指 导 教 师

计算机科学与技术学院
2020年3月
摘 要
本文主要论述了hello.c程序,在linux系统下的运行情况。详细陈述了其在机器级别的编译,内存的调用,及存储器的使用,系统级别的连接,虚拟内存的使用已经I/O设备的管理等方面的内容。详细介绍了hello.c如何一步步的编译解析成为机器码的过程。

关键词:程序的编译;连接;内存;虚拟内存;

目 录

第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简介
P2P:
在这里插入图片描述
如上图所示,hello.c文件通过cpp成为hello.i文件,再由编译器生成hello.o文件,由连接器与其他的文件连接生成可执行文件。由shell启动程序,调用fork创建子进程。
O2O:由shell通过execve在fork产生的子进程中加载hello。映射虚拟内存,进入程序的入口,载入物理内存,执行main函数。之后通过I/O设备输入输出。程序结束后,shell回收hello进程,删除hello的痕迹。

1.2 环境与工具
硬件环境:AMD Ryzen 5 2500U ,8GB RAM
软件环境:windos10 64位,Ubuntu64位
开发与调试工具:edb,Ultraedit,gdb
1.3 中间结果
1.hello.i:cpp根据以字符#开头的命令,修改原始的C程序。主要是将头文件,例如stdio文件插入程序文本中,得到新的C程序。
2.hello.s:编译器将C语言翻译成汇编语言,作为中间的过度阶段。
3.hello.o:汇编器将汇编语言转化为机器可读的机器语言。
4.hello:源程序中调用了printf,getchar,sleep,atoi等函数。利用连接器,将C语言函数库中相应的可连接文件与3中的文件连接,生成可执行的文件。
5.hello.elf:hello.o的可执行可连接格式。
6.hello1.elf:hello文件的elf格式。
7.hello0.txt:hello.o的反汇编代码。
8.hello1.txt:hello的返回编码。
9.a.out:可执行文件。
1.4 本章小结
本章主要讲述了P2P和O2O的过程,程序的开发环境以及文件生成的中间过程。

(第1章0.5分)
第2章 预处理
2.1 预处理的概念与作用
概念:程序设计领域中,预处理一般是指在程序源代码被翻译为目标代码的过程中,生成二进制代码之前的过程。
作用:最常见的预处理是C语言和C++语言。ISO C和ISO C++都规定程序由源代码被翻译分为若干有序的阶段(phase) ,通常前几个阶段由预处理器实现。预处理中会展开以#起始的行,试图解释为预处理指令(preprocessing directive) ,其中ISO C/C++要求支持的包括#if/#ifdef/#ifndef/#else/#elif/#endif(条件编译)、#define(宏定义)、#include(源文件包含)、#line(行控制)、#error(错误指令)、#pragma(和实现相关的杂注)以及单独的#(空指令) 。预处理指令一般被用来使源代码在不同的执行环境中被方便的修改或者编译。
2.2在Ubuntu下预处理的命令
对hello.c文件预处理命令:gcc -E -o hello.i hello.c。
在这里插入图片描述
目录下会增加一个hello.c文件。
在这里插入图片描述
hello.c截图:
在这里插入图片描述
hello.i文件部分截图:
在这里插入图片描述
2.3 Hello的预处理结果解析
在这里插入图片描述
从截图中可以看到C的源程序其实依然存在,多出的3000多行带代码实际上是源文件中头文件的源代码。

2.4 本章小结

本章主要利用Linux下的预处理命令,对hello.i文件进行了分析。
(第2章0.5分)

第3章 编译
3.1 编译的概念与作用
概念:
1、利用编译程序从源语言编写的源程序产生目标程序的过程。 2、用编译程序产生目标程序的动作。 编译就是把高级语言变成计算机可以识别的2进制语言
注意:这儿的编译是指从 .i 到 .s 即预处理后的文件到生成汇编语言程序
作用:
将高级语言转化为机器可以读懂的2进制机器码。
3.2 在Ubuntu下编译的命令
对hello.i进行编译的命令是:gcc -S -o hello.s hello.i。
在这里插入图片描述
目录下会有一个hello.文件。
在这里插入图片描述
3.3 Hello的编译结果解析
3.3.1处理变量(包含赋值
源程序中只有局部变量,int i;分析汇编码知,该变量由系统默认初始化为0,存在寄存器地址-4(%rbp)处。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值