ICS大作业论文

计算机系统大作业

题     目  程序人生-Hello’s P2P 

专       业    计算机与电子通信类    

学     号        2023112178       

班     级         23L0504         

学       生          娄沛涛       

指 导 教 师           刘宏伟         

计算机科学与技术学院

2024年5月

摘  要

本文全面探讨了hello程序的整个生命周期,从源代码编写开始,经过预处理、编译、汇编、链接等阶段,生成可执行文件,并深入分析了进程管理、存储管理等操作系统层面的工作机制。报告详细描述了预处理阶段如何清洗和转换数据,编译过程如何将源代码转化为汇编代码,并通过汇编生成机器码目标文件。在进程管理方面,探讨了fork()和execve()系统调用的作用,以及进程调度和异常信号处理机制。之后本文深入研究了存储管理机制,包括逻辑地址到物理地址的转换、Cache支持下的物理内存访问、缺页故障处理等。通过实际示例和详细分析,展示了操作系统如何通过页表、TLB缓存、写时复制技术等手段,实现进程间的内存隔离与共享,以及高效的内存访问和动态存储分配管理。

关键词:hello;预处理;编译;汇编;链接;进程管理;存储管理

目  录

第1章 概述... - 4 -

1.1 Hello简介... - 4 -

1.2 环境与工具... - 4 -

1.3 中间结果... - 4 -

1.4 本章小结... - 4 -

第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 本章小结... - 13 -

第4章 汇编... - 14 -

4.1 汇编的概念与作用... - 14 -

4.2 在Ubuntu下汇编的命令... - 14 -

4.3 可重定位目标elf格式... - 14 -

4.4 Hello.o的结果解析... - 17 -

4.5 本章小结... - 21 -

第5章 链接... - 23 -

5.1 链接的概念与作用... - 23 -

5.2 在Ubuntu下链接的命令... - 23 -

5.3 可执行目标文件hello的格式... - 24 -

5.4 hello的虚拟地址空间... - 25 -

5.5 链接的重定位过程分析... - 26 -

5.6 hello的执行流程... - 31 -

5.7 Hello的动态链接分析... - 33 -

5.8 本章小结... - 34 -

第6章 hello进程管理... - 35 -

6.1 进程的概念与作用... - 35 -

6.2 简述壳Shell-bash的作用与处理流程... - 35 -

6.3 Hello的fork进程创建过程... - 36 -

6.4 Hello的execve过程... - 36 -

6.5 Hello的进程执行... - 36 -

6.6 hello的异常与信号处理... - 37 -

6.7本章小结... - 39 -

第7章 hello的存储管理... - 40 -

7.1 hello的存储器地址空间... - 40 -

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

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

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

7.6 hello进程fork时的内存映射... - 41 -

7.7 hello进程execve时的内存映射... - 42 -

7.8 缺页故障与缺页中断处理... - 42 -

7.9动态存储分配管理... - 42 -

7.10本章小结... - 43 -

结论... - 44 -

附件... - 45 -

参考文献... - 46 -

第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架构生成对应的汇编指令,将高级语言逻辑转化为底层机器可理解的指令表示。

编译的作用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值