CS程序人生大作业

摘  要

报告以一个简单的hello.c文件为基础与示例,跟踪了在计算机系统中一个程序从程序员敲完的.c文件一步步被执行的过程,展现了一个代码项目文件Program如何经过计算机的预处理,编译,汇编,链接最终形成计算机的可执行文件的过程,这一部分体现在第二至第五章,至这一部分我们的hello文件已经做好了被计算机系统执行的准备工作。第六,七,八章进一步展现了操作系统是如何执行这一“准备好的”可执行文件的。具体体现在第六章介绍的操作系统对这一进程的创建,执行,信号处理等进程管理,第七章介绍的进程存储空间管理,第八章介绍的IO管理上。至此,正如大作业题目一样,hello.c程序走完了他的一生,而我们的报告也跟踪记录完毕了hello程序这一生的完整过程。

关键词:hello;计算机系统;预处理;编译;汇编;链接;进程;进程管理;存储空间;IO;                            

目  录

第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的结果解析

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进程创建过程

6.4 Hello的execve过程

6.5 Hello的进程执行

6.6 hello的异常与信号处理

6.7本章小结

第7章 hello的存储管理

7.1 hello的存储器地址空间

7.2 Intel逻辑地址到线性地址的变换-段式管理

7.3 Hello的线性地址到物理地址的变换-页式管理

7.4 TLB与四级页表支持下的VA到PA的变换

7.5 三级Cache支持下的物理内存访问

7.6 hello进程fork时的内存映射

7.7 hello进程execve时的内存映射

7.8 缺页故障与缺页中断处理

7.9动态存储分配管理

7.10本章小结

第8章 hello的IO管理

8.1 Linux的IO设备管理方法

8.2 简述Unix IO接口及其函数

8.3 printf的实现分析

8.4 getchar的实现分析

8.5本章小结

结论

附件

参考文献


第1章 概述

1.1 Hello简介

P2P:P2P,即From Program to Process,由项目程序到进程的过程。当我们程序员敲完了一个hello代码并将其保存为.c文件时,Hello作为一个C程序就诞生了。如果我们要执行这个C程序,让Hello实现她的人生价值,就要对其经过一系列的处理使其由项目文件转变为一个进程来等待计算机的执行,这一过程就是P2P 。在P2P过程中,hello.c文件先进行预处理,这一环节处理了文件中的宏,以#include开头为代表的头文件等等,这一环节结束后hello.c就摇身一变变成了hello.i。接下来编译器对hello.i进行编译,将其由方便我们程序员阅读的高级语言编译成更接近计算机逻辑的汇编语言,这一环节结束后hello.i就变成了hello.s,然而汇编语言依然不是计算机语言,难以被计算机理解,所以接下来hello.s需要进行一步汇编过程,这一环节中hello.s将由汇编语言转换为二进制代码的机器语言,这一语言是可以被计算机解读的,生成的文件为hello.o,即可重定位文件。虽然转变为了机器语言,但离可以直接被计算机执行还缺少一步,hello内的一些函数,数据等可能不存在与hello本身的文件当中,最后还需要进行一步链接,将符号进行解析和重定位,生成可执行文件hello。

020:020,即From Zero-0 to Zero-0。从零开始以令结束,即程序从无开始戴胜至完全被系统回收结束不会产生“残留”。这一环节依靠于计算机系统的进程管理设计。在上一步我们最后生成的可执行文件hello等待被系统执行,在我们冲控制台shell输入./hello命令后,系统开始执行这一可执行文件。系统首先会调用Fork函数生成一个只有pid与父进程不同的子进程(父进程此时应为shell),然后调用evecve函数,这一函数会启动加载器loader,将子进程原内容丢弃并新建task_struct及其目录下包括mm_struct等的数据结构,映射私有区域和共享区域,然后设置程序计数器到代码区域的入口点,系统下一步开始执行hello程序。hello程序运行结束后会成为一个zombie进程等待父进程shell回收,父进程将其回收后hello的生命周期彻底结束。

1.2 环境与工具

硬件环境:Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz   2.21 GHz 64位操作系统

系统环境:Ubuntu 18.04 LTS64位,Vmware 11

开发与调试工具:codeblocks,gedit,gdb,objdump,gcc,readelf,HEXEdit

1.3 中间结果

Hello.c:敲完的源程序

Hello.i:经过预处理得到的文本文件

Hello.s:经过编译得到的汇编语言文件

Hello.o:经过汇编得到的二进制可重定向文件

Hello:经过链接得到的最终可执行文件

1.4 本章小结

本章主要从P2P以及020的角度概括了hello从被程序员编写完成正式诞生到转换为可执行文件,作为进程被系统执行到最终执行完毕被系统回收的一生,对接下来的报告整体内容做了简要介绍与概括并列出了所使用的环境与工具,列出了操作过程中得到的中间结果。

(第1章0.5分)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值