2022哈工大计算机系统大作业

在这里插入图片描述

计算机系统

大作业

题 目 程序人生-Hello’s P2P
专 业 计算机
学   号 120L020918
班   级 2003001
学 生 王昕宇
指 导 教 师 史先俊

计算机科学与技术学院
2022年5月
摘 要
本篇论文进行了对hello程序从编写到终止的全过程的分析,揭示了在Linux操作系统下程序的运行机制和操作系统内部的传递、异常处理的机制。hello.c通过一系列的操作,生成了hello可执行文件。在shell中接收到对应指令后调用fork创建子进程,调用execve加载可执行文件,通过一系列的处理后,结束进程,由父进程回收。

关键词:计算机系统;hello world;进程管理;

目 录

第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 本章小结 - 8 -
第3章 编译 - 9 -
3.1 编译的概念与作用 - 9 -
3.2 在Ubuntu下编译的命令 - 9 -
3.3 Hello的编译结果解析 - 9 -
3.4 本章小结 - 11 -
第4章 汇编 - 12 -
4.1 汇编的概念与作用 - 12 -
4.2 在Ubuntu下汇编的命令 - 12 -
4.3 可重定位目标elf格式 - 12 -
4.4 Hello.o的结果解析 - 14 -
4.5 本章小结 - 16 -
第5章 链接 - 17 -
5.1 链接的概念与作用 - 17 -
概念:链接是将各种代码和数据片段收集并组合为一个单一文件的过程,这个文件可被加载或复制到内存并执行。链接可以执行于编译时,也就是在源代码被编译成机器代码时;也可以执行于加载时,也就是在程序被加载器加载到内存并执行时;甚至于执行于运行时,也就是由应用程序来执行。 - 17 -
5.2 在Ubuntu下链接的命令 - 17 -
5.3 可执行目标文件hello的格式 - 17 -
5.4 hello的虚拟地址空间 - 20 -
5.5 链接的重定位过程分析 - 21 -
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的异常与信号处理 - 25 -
6.7本章小结 - 26 -
第7章 hello的存储管理 - 27 -
7.1 hello的存储器地址空间 - 27 -
7.2 Intel逻辑地址到线性地址的变换-段式管理 - 27 -
7.3 Hello的线性地址到物理地址的变换-页式管理 - 27 -
线性地址即虚拟地址(VA)到物理地址(PA)之间的转换通过分页机制完成,而分页机制是对虚拟地址内存空间进行分页。CPU对于一个线性地址会取它的高若干位,通过它们去存储在内存中的页表里查询对应的页表条目,得到这个线性地址对应的物理页起始地址,然后与线性地址的低位(页中的偏移)相加就是物理地址。 - 27 -
7.4 TLB与四级页表支持下的VA到PA的变换 - 27 -
7.5 三级Cache支持下的物理内存访问 - 28 -
7.6 hello进程fork时的内存映射 - 28 -
7.7 hello进程execve时的内存映射 - 28 -
7.8 缺页故障与缺页中断处理 - 29 -
7.9动态存储分配管理 - 29 -
7.10本章小结 - 30 -
第8章 hello的IO管理 - 31 -
8.1 Linux的IO设备管理方法 - 31 -
8.2 简述Unix IO接口及其函数 - 31 -
8.3 printf的实现分析 - 32 -
8.4 getchar的实现分析 - 32 -
8.5本章小结 - 32 -
结论 - 32 -
附件 - 34 -
参考文献 - 35 -

第1章 概述
1.1 Hello简介
1.1.1 P2P(From Program to Process):
(1)编写代码,编辑正确的hello.c代码,并建立hello.c文件
(2)通过预处理器(cpp),处理生成hello.i文件
(3)通过编译器(ccl),将hello.i文件编译成汇编语言文件hello.s
(4)通过汇编器(as),将hello.s文件生成可重定位目标文件hello.o
(5)通过链接器(ld),将hello.o文件和系统目标文件结合,生成可执行文件hello
(6)shell会调用fork函数创建新进程,调用execve函数加载运行此进程
1.1.2 020(From Zero-0 to Zero-0):
系统调用execve函数加载运行时CPU为其分配内存等资源,先删除当前虚拟地址的数据结构并为hello创建新的区域结构,新进程执行完毕后,shell父进程负责回收hello进程,内核删除相关数据结构。
1.2 环境与工具
1.2.1 硬件环境
X64 CPU;2GHz;2G RAM;256GHD Disk 以上
1.2.2 软件环境
Windows10 ;Vmware;Ubuntu 16.04
1.2.3 开发和调试工具
Codeblocks;Objdump;gdb;gcc;edb等
1.3 中间结果
hello.c 源程序
hello.i 预处理后文件
hello.s 编译后的汇编文件
hello.o 汇编后的可重定位目标执行文件
hello 链接后的可执行文件
hello.elf hello.o的ELF格式
hello1.txt hello的反汇编代码
hello1.elf hello的ELF格式

1.4 本章小结
本章主要介绍了hello.c从源代码到可执行文件,再到运行回收的过程(P2P、020),列举环境和使用工具、中间文件
(第1章0.5分)

第2章 预处理
2.1 预处理的概念与作用
概念:预处理一般是指在程序源代码被翻译为目标代码的过程中,生成二进制代码之前的过程。
作用:
(1)宏定义:#define 将宏名替换为实际的字符串、值等
(2)文件包含:#include将其头文件内容插入程序中
(3)条件编译:条件编译为了令程序中的一部分内容在满足一定条件下才进行编译,也就是这部分内容指定了编译条件提高了C语言的通用性,使得不同的计算机能兼容的执行C语言的代码程序
2.2在Ubuntu下预处理的命令
预处理命令:gcc -E -o hello.i hello.c
在这里插入图片描述

生成hello.i
在这里插入图片描述

2.3 Hello的预处理结果解析
hello.c源代码:
在这里插入图片描述

hello.i部分代码:
在这里插入图片描述

在经过预处理之后,代码从23行扩展到3060行,分析hello.i代码可以发现,其大部分代码是头文件的展开,其中stdio.h扩展到868行,unistd.h扩展到2035&

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值