计算机系统大作业
题 目 程序人生-Hello’s P2P
专 业 计算机与电子通信类
学 号 2023112178
班 级 23L0504
学 生 娄沛涛
指 导 教 师 刘宏伟
计算机科学与技术学院
2024年5月
本文全面探讨了hello程序的整个生命周期,从源代码编写开始,经过预处理、编译、汇编、链接等阶段,生成可执行文件,并深入分析了进程管理、存储管理等操作系统层面的工作机制。报告详细描述了预处理阶段如何清洗和转换数据,编译过程如何将源代码转化为汇编代码,并通过汇编生成机器码目标文件。在进程管理方面,探讨了fork()和execve()系统调用的作用,以及进程调度和异常信号处理机制。之后本文深入研究了存储管理机制,包括逻辑地址到物理地址的转换、Cache支持下的物理内存访问、缺页故障处理等。通过实际示例和详细分析,展示了操作系统如何通过页表、TLB缓存、写时复制技术等手段,实现进程间的内存隔离与共享,以及高效的内存访问和动态存储分配管理。
关键词:hello;预处理;编译;汇编;链接;进程管理;存储管理
目 录
6.2 简述壳Shell-bash的作用与处理流程... - 35 -
6.3 Hello的fork进程创建过程... - 36 -
7.3 Hello的线性地址到物理地址的变换-页式管理... - 40 -
7.4 TLB与四级页表支持下的VA到PA的变换... - 40 -
7.5 三级Cache支持下的物理内存访问... - 41 -
7.6 hello进程fork时的内存映射... - 41 -
7.7 hello进程execve时的内存映射... - 42 -
第1章 概述
1.1 Hello简介
在P2P阶段,用户编写hello.c源代码文件,通过文本编辑器创建程序。此时,Hello是一个静态的文本文件,存储在磁盘中。之后通过预处理、编译、汇编、链接等工具链,将hello.c转换为可执行目标文件。这一过程涉及词法分析、语法优化、生成机器指令等。当用户在Shell(Bash)中输入./a.out后,OS通过fork创建一个子进程,复制父进程(Shell)的上下文。execve()加载a.out到子进程的地址空间,替换为Hello的代码段和数据段。之后OS动态映射共享库到进程的虚拟地址空间。硬件方面,CPU通过取指、译码、执行流水线运行Hello的指令,RAM存储运行时数据,I/O设备输出结果。
在020阶段,Hello进程从“零状态”开始,由OS分配初始资源。之后进入运行阶段, MMU通过页表将虚拟地址转换为物理地址,TLB和Cache加速访问。OS分配时间片,CPU分时执行Hello进程。而在调用printf时,内核通过系统调用将数据输出到屏幕;若收到中断信号信号,则OS中断处理。在生命终止阶段,Hello执行完毕后,OS通过exit()释放资源,父进程(Shell)调用wait()回收子进程状态。之后进程上下文彻底销毁,仅保留可能的返回值,最终回归“零状态”。
1.2 环境与工具
软件环境:MobaXterm的泰山服务器、VMware的UBUNTU虚拟机、VS
硬件环境:X64 CPU,、2GHz 2GB RAM、256GHD Disk
1.3 中间结果
表1 中间结果
文件名称 |
文件解释与作用 |
hello.c |
编写的C语言源代码文件 |
hello.i |
展开所有include头文件、处理宏定义和条件编译、删除注释 |
hello.s |
由编译器生成的汇编代码文件,内容为机器指令的文本表示 |
hello.o |
由汇编器生成的二进制目标文件,链接后可执行 |
hello |
由链接器将hello.o与库文件合并生成的可执行文件 |
1.4 本章小结
本章概述了hello程序的整个生命周期,从源代码编写到可执行文件的生成,再到进程的执行与资源管理,全面展示了操作系统与硬件如何协同工作。同时也交代了整个实验过程用到的环境以及整个项目的目标,起到提纲掣领的作用。嗯……祝我好运!
第2章 预处理
2.1 预处理的概念与作用
预处理是数据分析和机器学习流程中的重要步骤,指在正式建模或分析前对原始数据进行清洗、转换和规整,以提高数据质量或适应后续任务需求。其核心目标是让数据更规范、更易于算法处理,同时提升结果的准确性和可靠性。预处理的主要作用包括解决数据质量问题、统一数据格式与尺度、提升模型性能以及适应工具限制。常见的预处理技术涵盖数值数据、分类数据、文本数据和图像数据等。
预处理之所以至关重要,是因为低质量数据会导致“垃圾进,垃圾出”,直接影响模型效果。许多算法对数据尺度敏感,而合理的预处理能减少噪声和冗余,提升训练效率。
2.2在Ubuntu下预处理的命令
图1 Ubuntu下预处理的命令
2.3 Hello的预处理结果解析
使用cat指令,查看hello.i部分代码如下:
(a) (b)
(c)
图2 hello.i部分代码
首先最明显的就是代码变多了,而且多的不是一点半点……这是因为,预处理阶段会展开所有宏并且插入包含的头文件,而且在预处理阶段还会处理条件编译、删除注释同时生成干净的代码供后续编译阶段使用。
2.4 本章小结
预处理是数据分析和机器学习流程的关键步骤,旨在提高数据质量,使其更规范、易于算法处理,从而提升模型性能和结果准确性。通过清洗数据、统一格式与尺度,它能有效解决数据质量问题,并适应不同工具的限制。此外,在预处理的过程中包括展开宏、插入头文件、处理条件编译等内容,为后续的编译阶段生成干净的代码,简单来说就是基本的文本替换,这是程序运行的第一步。
第3章 编译
3.1 编译的概念与作用
编译是将预处理后的源代码转换为汇编代码的关键过程。这一阶段的核心任务包括语法和语义分析、中间代码生成、优化以及目标代码生成。编译器首先检查代码的合法性,随后可能生成与硬件无关的中间表示,并进行机器无关优化。最终,编译器根据目标CPU架构生成对应的汇编指令,将高级语言逻辑转化为底层机器可理解的指令表示。
编译的作用