计算机系统
大作业
题 目 程序人生-Hello’s P2P
专 业 计算机类
学 号 1190400614
班 级 1903003
学 生 李海涵
指 导 教 师 郑贵滨
计算机科学与技术学院
2021年6月
摘 要
文章主要内容是利用计算机系统本学期的学习内容,通过以hello.c为例的程序,从编写代码的编写经过诸多处理(如汇编,连接,重定位)到可执行程序,到展现在我们眼中等,对一个程序在计算机系统的全部过程进行顺序性的解读。整个过程展现个人对于所学知识的理解和掌握,并帮助总结这门课程的收获和进步。不仅仅是回顾对课程的学习过程,更是回顾自己与计算机的恩怨情仇,回忆那一点一滴的成长。
关键词:计算机系统;大作业论文;程序处理;成长;一生;
目 录
X64 CPU; 1.80GHz; 12G RAM; 512GHD SSD; - 6 -
windows10 家庭中文版;Vmware 15; Ubuntu 20.04LTS 64位... - 6 -
codeblocks; vim+gcc; gdb; objdump; readelf; edb; - 6 -
3.3.3 类型转换和sizeof,未出现... - 11 -
6.2 简述壳Shell-bash的作用与处理流程... - 31 -
6.3 Hello的fork进程创建过程... - 31 -
7.2 Intel逻辑地址到线性地址的变换-段式管理... - 37 -
7.3 Hello的线性地址到物理地址的变换-页式管理... - 38 -
7.4 TLB与四级页表支持下的VA到PA的变换... - 39 -
7.5 三级Cache支持下的物理内存访问... - 41 -
7.6 hello进程fork时的内存映射... - 42 -
7.7 hello进程execve时的内存映射... - 42 -
第1章 概述
1.1 Hello简介
P2P:from program to process即从项目到进程
在Linux中,hello.c经过cpp的预处理成hello.i、ccl的编译——hello.s、as的汇编->hello.o、ld的链接最终成为可执行目标程序hello,在shell(bash)中键入启动命令(./hello或绝对路径下的hello)后,shell为其fork产生一个子进程,在程序中运行execve类函数,导入数据段,代码段,用户栈等,形成一个程序,访问程序接口,从磁盘等位置导入,然后hello便从程序变为了进程。
O2O:From Zero-0 to Zero-0即从为加载,经过运行后,被覆盖。
进程的概念:让程序有独享CPU的错觉,独立的地址和内存空间。
shell在fork之后,在子程序里运行execve函数,execve函数调用加载器,将hello文件代码和数据从磁盘复制到内存,hello程序加载,。
复制完代码段和数据段之后,加载器跳转到程序的入口点,即_start函数地址,是一个系统的目标文件定义,_start调用___libc_start_main函数,初始化执行环境,调用用户层面的main函数。
运行过程中,由操作系统,协调分配对各个程序的资源分配,为hello分配主存,时间片等。程序可以接受信号,若内核运行中遇到异常,会向用户级程序返回信号,根据信号的不同类型,和程序的信号的处理模式,可以选择忽略处理信号,默认处理信号,或按照指定程序处理信号等,有的信号等不能被修改。
运行结束的情况:程序运行至正常返回,运行exit()函数,与程序异步的操作端输入,诸如Ctrl-C,Ctrl-Z等。
hello程序状态由运行变为终止后,由它的父进程进行回收,父进程shell,若父进程回收之前终止,由所有程序的父进程init进行回收僵死进程。内核会对相关的数据页进行回收,但数据还在缓存中,等待之后的程序覆盖,从回收的那刻起,hello变为0。
全过程从无到有到无。
1.2 环境与工具
1.2.1 硬件环境
X64 CPU; 1.80GHz; 12G RAM; 512GHD SSD;
1.2.2 软件环境
windows10 家庭中文版;Vmware 15; Ubuntu 20.04LTS 64位
1.2.3 开发工具
codeblocks; vim+g