# 计算机系统
### 大作业
题 目 程序人生-Hello’s P2P
**摘 要**
摘要是论文内容的高度概括,应具有独立性和自含性,即不阅读论文的全文, 就能获得必要的信息。摘要应包括本论文的目的、主要内容、方法、成果及其理论与实际意义。摘要中不宜使用公式、结构式、图表和非公知公用的符号与术语, 不标注引用文献编号,同时避免将摘要写成目录式的内容介绍。
**关键词**:P2P;020;进程;计算机系统
本文主要是通过合理运用这个学期在计算机系统课程上学习的知识,分析研究 hello 程序在 Linux 下的 P2P 和 020 过程,通过熟练使用各种工具,学习 Linux 框架下整个程序的声明周期,加深对课本知识的印象。
#
# 第一章、概述
## 1.1 Hello 简介
1. P2P:Program to Process
在 Linux 中,hello.c 经过 cpp 的预处理、ccl 的编译、as 的汇编、ld 的链接最终成为可执行目标程序 hello,在 shell 中键入启动命令后,shell 为其 fork,产生子进程, 产生子进程后 shell 为 hello execve,于是 hello 便从 Program(个人理解为程序项目)变为 Process(进程),这便是 P2P 的过程。
2. O2O:Zero-0 to Zero-0
这里的 020 应该指的是 Process 在内存中 From Zero to Zero。产生子进程后 shell 为 hello execve,映射虚拟内存,进入程序入口后程序开始载入物理内存,然后进入 main 函数执行目标代码,CPU 为运行的 hello 分配时间片执行逻辑控制流。当程序运行结束后,shell 父进程负责回收 hello 进程,内核删除相关数据结构,这便是 020 的过程。
## 1.2 环境与工具
- 软件环境:Windows10、Ubuntu 19.04
- 硬件环境:Core i7-8770U
- 开发和调试工具: Codeblocks、Visual Studio 2017、gdb、gedit
## 1.3 中间结果
| 文件名 | 作用 |
| ------- | ------------------------------ |
| hello.c | 源程序 |
| hello.i | 预处理文件 |
| hello.s | 根据 hello.i 编译得到的.s 文件 |
| hello.o | 可重定位目标程序 |
| hello | 连接后的可执行文件 |
## 1.4 本章小结
本章对 hello 进行了简单的介绍,分析了其 P2P 和 020 的过程,列出了本次任务的环境和工具,并且阐明了任务过程中出现的中间产物及其作用。
# 第二章、预处理
## 2.1 预处理的概念与作用
预处理器(cpp)根据以#开头的命令,修改原始的 C 程序。比如 hello.c 中第 6 行的#include<stdio.h> 命令高速预处理器读取系统头文件 stdio.h 的内容,并把它直接插入程序文本中。结果就得到了另一个 C 程序,通常是以.i 作为文件拓展名
## 2.2 在 Ubuntu 下预处理的命令
```c++
gcc -E hello.c -o hello.i
```
![](https://www.writebug.com/myres/static/uploads/2021/11/9/8c00b5363efac1d881b6aea978e0d040.writebug)
## 2.3 Hello 的预处理结果解析
修改得到的 C 程序 hello.i 已经从原来 hello.c 的 534 个字节增加到 63364 个字节,并且增加到 3110 行。再用 gedit 打开 hello.i,发现在 main 函数在文件的最后部分。
而在 main 函数之前,预处理器(cpp)读取头文件 stdio.h 、stdlib.h 、和 unistd.h 中的内容,三个系统头文件依次展开。比如 stdio.h 的展开, 打开 usr/include/stdio.h 发现了其中还含有#开头的宏定义等,预处理器会对此继续递归展开,最终的.i 程序中没有#define,并且针对#开头的条件编译语句,cpp 根据#if 后面的条件决定需要编译的代码。
## 2.4 本章小结
本章介绍了 hello.c 的预处理阶段,根据预处理命令得到了修改后的 hello.i 程序,并且对 hello.i 程序进行了预处理结果解析,理解了预处理器读取系统头文件中内容,并把它插入程序文本中的过程
# 第三章、编译
## 3.1 编译的概念与作用
在这个阶段,编译器首先要检查代码的规范性,是否有语法错误等,以确定代码的实际要做的工作,再检查无误后,编译器(ccl)见文本文件 hello.i 翻译成文本文件 hello.s,它包含一个汇编语言程序。该程序包含函数 main 的定义,语句以一种文本格式描述了一条低级机器语言指令。汇编语言位不同高级语言的不同编译器提供了通用的输出语言。
## 3.2 在 Ubuntu 下编译的命令
```c++
gcc -S hello.i -o hello.s
```
![](https://www.writebug.com/myres/static/uploads/2021/11/9/96bea5a2522c2e981036b2b74659cb03.writebug)
## 3.3 Hello 的编译结果解析
hello.s 中的各种指令:
| .file | 源文件名 |
| -------- | -------------------------- |
| .globl | 全局变量 |
| .data | 数据段 |
| .align | 对齐 |
| .type | 指定是对象类型或是函数类型 |
| .size | 大小 |
| .long | 长整型 |
| .section | 节头表 |
| .rodata | 只读数据段 |
| .string | 字符串 |
| .text | 代码段 |
| ----- | ------ |
| | |
1. 数据:
```c++
hello.s 中 C 语言的数据类型有:局部变量,指针数组,无全局变量int argc;argc 是函数传入的第一个 int 型参数,存储在%edi 中
int i;局部变量,通常保存在寄存器或是栈中。根据 movl $0, -4(%rbp)操作可知 i 的数据类型占用了 4 字节的栈空间。
```
argv[1]、argv[2]和 argv[3]都声明在.rodata 只能读数据段中,并且给出了字符串的编码
![](https://www.writebug.com/myres/static/uploads/2021/11/9/fddea856b9a4c92e02350dcdd3aeab4b.writebug)
2. 赋值:i 在循环之前被赋值
在 main 函数第 41 行循环开始之前的第 14 行,i 被存储到 %ebx 中,赋值为 0
3. 类型转换
![](https://www.writebug.com/myres/static/uploads/2021/11/9/888ddc77c8c1c40311ed2d1ff21e0c3f.writebug)
这里涉及一处调用系统函数 atoi 函数将 argv[3]转换成 int 型的操作
4. 算数操作
![](https://www.writebug.com/myres/static/uploads/2021/11/9/f76809c6459ba2790a9c1a97e448d8ef.writebug)
这里有一处,通过不断增加 i 的值,并与 7 不断比较的例子
5. 逻辑操作/位操作
如果 cmp 按位比较算位操作/逻辑操作,那么在 4 的图中已经有了,并且已经加以说明了,除此之外没有位操作
6. 关系操作
![](https://www.writebug.com/myres/static/uploads/2021/11/9/be32a86eefe6ec403bd171f452276d3b.writebug)
第一处:看 argc 是否是 4 而进行的关系操作
第二处:在 for 循环中判断 i 是否到达临界条件而设计的
![](https://www.writebug.com/myres/static/uploads/2021/11/9/badb2579afd9de1ada9977f5a4709cf2.writebug)
7. 数组/指针/结构操作
这里有将参数导入 printf 函数和 atoi 函数的部分,是将 argv 字符串数组导入这两个函数的过程,如下图:
![](https://www.writebug.com/myres/static/uploads/2021/11/9/65bcd4ac432ba64c132b849d261fc42f.writebug)
8. 控制转移
![](https://www.writebug.com/myres/static/uploads/2021/11/9/37062de191783a009e9d0247b6ff0509.writebug)
判断 argc 是否为 4 而进行的控制转移:jne
判断 i 是否小于等于 7 而进行的控制转移:jle
![](https://www.writebug.com/myres/static/uploads/2021/11/9/7dc8d7cb3bf0f11b9f6732ce17b10538.writebug)
还有一处:jmp
这里是如果判断 argc 是 4,那么不必进行下面的部分代码,直接跳到 for 循环即可
![](https://www.writebug.com/myres/static/uploads/2021/11/9/1a5593150208abcdac2ca8f465795471.writebug)
9. 函数操作
- main 函数:
参数传递:传入参数 argc 和 argv,分别用寄存器 %rdi 和 %rsi 存储。
函数调用:被系统启动函数调用。
![](https://www.writebug.com/myres/static/
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
本文主要是通过合理运用这个学期在计算机系统课程上学习的知识,分析研究 hello 程序在 Linux 下的 P2P 和 020 过程,通过熟练使用各种工具,学习 Linux 框架下整个程序的声明周期,加深对课本知识的印象。
资源推荐
资源详情
资源评论
收起资源包目录
100013123-基于C语言完成计算机系统作业(程序人生-Hello’s P2P).zip (91个子文件)
hit-csapp-lunwen
hello.o 2KB
LICENSE 1KB
ICS2019大作业论文-1180301009-阚嘉良.pdf 1.85MB
010914443901
56ddce64-b647-4733-ad58-b72a90290a85.036.png 74KB
56ddce64-b647-4733-ad58-b72a90290a85.039.png 53KB
56ddce64-b647-4733-ad58-b72a90290a85.027.png 157KB
56ddce64-b647-4733-ad58-b72a90290a85.007.png 26KB
56ddce64-b647-4733-ad58-b72a90290a85.004.png 15KB
56ddce64-b647-4733-ad58-b72a90290a85.025.png 25KB
56ddce64-b647-4733-ad58-b72a90290a85.028.png 107KB
56ddce64-b647-4733-ad58-b72a90290a85.014.png 13KB
56ddce64-b647-4733-ad58-b72a90290a85.012.png 245KB
56ddce64-b647-4733-ad58-b72a90290a85.033.png 32KB
56ddce64-b647-4733-ad58-b72a90290a85.010.png 26KB
56ddce64-b647-4733-ad58-b72a90290a85.038.png 62KB
56ddce64-b647-4733-ad58-b72a90290a85.021.png 69KB
56ddce64-b647-4733-ad58-b72a90290a85.019.png 52KB
56ddce64-b647-4733-ad58-b72a90290a85.029.png 76KB
56ddce64-b647-4733-ad58-b72a90290a85.006.png 43KB
56ddce64-b647-4733-ad58-b72a90290a85.026.png 175KB
56ddce64-b647-4733-ad58-b72a90290a85.030.png 75KB
56ddce64-b647-4733-ad58-b72a90290a85.015.png 26KB
56ddce64-b647-4733-ad58-b72a90290a85.005.png 38KB
56ddce64-b647-4733-ad58-b72a90290a85.031.png 45KB
56ddce64-b647-4733-ad58-b72a90290a85.034.png 9KB
56ddce64-b647-4733-ad58-b72a90290a85.022.png 135KB
56ddce64-b647-4733-ad58-b72a90290a85.032.png 59KB
56ddce64-b647-4733-ad58-b72a90290a85.016.png 13KB
56ddce64-b647-4733-ad58-b72a90290a85.037.png 31KB
56ddce64-b647-4733-ad58-b72a90290a85.002.png 14KB
56ddce64-b647-4733-ad58-b72a90290a85.001.jpeg 10KB
56ddce64-b647-4733-ad58-b72a90290a85.024.png 57KB
56ddce64-b647-4733-ad58-b72a90290a85.009.png 104KB
56ddce64-b647-4733-ad58-b72a90290a85.018.png 7KB
56ddce64-b647-4733-ad58-b72a90290a85.013.png 28KB
56ddce64-b647-4733-ad58-b72a90290a85.017.png 27KB
56ddce64-b647-4733-ad58-b72a90290a85.003.png 7KB
56ddce64-b647-4733-ad58-b72a90290a85.020.png 181KB
56ddce64-b647-4733-ad58-b72a90290a85.008.png 43KB
010914443901.html 273KB
56ddce64-b647-4733-ad58-b72a90290a85.035.png 31KB
56ddce64-b647-4733-ad58-b72a90290a85.023.png 150KB
56ddce64-b647-4733-ad58-b72a90290a85.011.png 52KB
56ddce64-b647-4733-ad58-b72a90290a85.040.png 75KB
hello.i 62KB
hello.c 549B
READMEBEFORE.md 39B
010914443901.html 273KB
hello.s 1KB
README.md 45KB
hello 15KB
ICS2019大作业论文-1180301009-阚嘉良.docx-md
31-4fbcc3243fcb4754b6b9e3e415ddffce.png 40KB
8-0366ecb7d041f9966ac2604b61682359.png 27KB
25-6a191ad89ca8012443f99970b9db21f0.png 40KB
1-37ac6d67364d219c2d60892f328ba4bd.png 54KB
34-3ffda83e1723affbdd2dce8f9abc0368.png 12KB
14-01ff0b80b3eea4ec746127cad0c7846a.png 15KB
26-6057703cadc7ae54f68b747d83094fb5.png 23KB
38-94d041bb8a079c53cead5d92b5f35f49.png 45KB
35-7857bddb39a0321607ed25eb8b5e64f7.png 33KB
13-56b9f1090827bdea718488682ea7e865.png 140KB
9-4282330c2471908e18f6b693d182d4f4.png 59KB
22-c9f75637bc13af302ed0b6d555d6412e.png 96KB
21-0d4d98a4f881eb272384262446a100ef.png 150KB
27-9dda7ffb5c9b97bbc0e208705c7e00d4.png 1.02MB
10-e7ba7691a81e79bfad8f768c2b44e9b0.png 19KB
33-239ccfffee50362e9023188fa7ce41d6.png 28KB
17-5e78c07808a6b44dccefb2bb611e6c20.png 13KB
12-adfc1373a91bbe63fc906ff96527fd03.png 24KB
32-09b88581be2fbfc28fa9286d3a732156.png 53KB
5-51fe528dda1403b388adb4f0c4bd8ef3.png 27KB
36-16926dc6ed64a78151c29a93da7c1b30.png 62KB
28-9d8fa0818fb076d01057ad848c0819a1.png 64KB
24-9a9d1948a24988e914d74320fd9766b4.png 112KB
20-568deffb3daf6b4ba07a089b75ef4935.png 69KB
30-fe54a7d835b5dbcff96c20f55bfa8e66.png 94KB
15-96be364217bd2b8176a74ae7659a03c7.png 14KB
7-e7ba7691a81e79bfad8f768c2b44e9b0.png 19KB
18-ce9c410dbd78365328bc831ed29eb3a5.png 16KB
37-94093ce91c78fce8c1828253468cae62.png 27KB
6-0366ecb7d041f9966ac2604b61682359.png 27KB
19-d5ef030ea3e0817c65b1a84c22ba3014.png 8KB
23-7d2e5f775d4d1c25eb4fc5ad6277b9d0.png 112KB
29-03a02e6933b40d751c909ccab33afe45.png 92KB
4-98c89994aee877d5121852874340adf1.png 19KB
3-6e0ba87e0d80717aaf4ede647650a543.png 9KB
2-c955800b85e6448658f37a2617990b51.png 13KB
16-8287d52f2f52a4e055558221bd748ed8.png 13KB
11-0366ecb7d041f9966ac2604b61682359.png 27KB
40-a87c4d84d5674d8960ae25746d89d03e.png 76KB
39-2c617e167d52ae5de76c877df3601656.png 59KB
共 91 条
- 1
资源评论
神仙别闹
- 粉丝: 2681
- 资源: 7668
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- chromedriver-linux64.zip 是一个用于在 Linux 系统上运行 Chrome 浏览器的驱动程序
- 基于Python和PyTorch框架完成的一个手写数字识别实验源码(带MINIST手写数字数据集)+详细注释(高分项目)
- 基于Matlab在MNIST数据集上利用CNN完成手写体数字识别任务,并实现单层CNN反向传播算法+源代码+文档说明(高分项目)
- NVIDIA驱动、CUDA和Pytorch及其依赖
- html动态爱心代码一(附源码)
- c40539bc-071a-486c-9d52-9d0c18d62dac 4.html
- 基于物理的非视域成像(NLOS)算法,利用了nerf+python源码+文档说明
- yuluer知更鸟.7z(1).001
- python课程设计-基于tensorflow实现的图文生成程序,数据集flickr30k-images+源代码+文档说明+截图
- python作业-基于Flickr30k数据集实现图像文本跨模态搜索python源码+数据集+测试界面+项目说明(高分课程设计)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功