哈工大CSAPP大作业之程序人生-Hello’s P2P

摘  要

核心内容概述

本文以经典程序 hello.c 为例,完整解析其从代码诞生到进程终止的全生命周期,聚焦编译阶段执行阶段,通过拆解各环节技术细节,揭示程序代码向进程的演化过程。核心分析维度

一、程序与系统的交互逻辑

重点剖析程序在全生命周期中与操作系统硬件设备的协同机制,展现软件与底层资源的动态联动。

二、编译阶段:从源代码到可执行文件

  1. 预处理:展开头文件、宏替换、条件编译等操作,生成预处理后的中间文件。
  2. 编译:将预处理文件转换为汇编代码,完成语法分析、语义检查及代码优化。
  3. 汇编:把汇编代码翻译成机器指令,生成目标文件(.o)。
  4. 链接:合并目标文件与库文件,解析符号引用,生成最终可执行文件。

三、执行阶段:操作系统视角的底层实现

  1. 程序加载:操作系统将可执行文件载入内存,建立进程地址空间。
  2. 进程管理:通过进程控制块(PCB)管理进程状态、资源分配及调度。
  3. 存储映射:将文件内容映射到内存地址空间,实现代码与数据的动态访问。
  4. 异常处理:操作系统捕获并处理程序运行中的错误(如段错误、除零异常),维护系统稳定性。

价值与意义

本文通过全景式分析,帮助读者理解计算机系统中程序运行的底层逻辑复杂机制,建立从代码到进程的系统性认知。

关键词:计算机系统;程序编译;程序周期;进程执行

(摘要0分,缺失-1分,根据内容精彩称都酌情加分0-1分

目  录

第1章 概述................................................................................................................ - 4 -

1.1 Hello简介......................................................................................................... - 4 -

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

1.3 中间结果............................................................................................................ - 4 -

1.4 本章小结............................................................................................................ - 4 -

第2章 预处理............................................................................................................ - 5 -

2.1 预处理的概念与作用........................................................................................ - 5 -

2.2在Ubuntu下预处理的命令............................................................................. - 5 -

2.3 Hello的预处理结果解析................................................................................. - 5 -

2.4 本章小结............................................................................................................ - 5 -

第3章 编译................................................................................................................ - 6 -

3.1 编译的概念与作用............................................................................................ - 6 -

3.2 在Ubuntu下编译的命令................................................................................ - 6 -

3.3 Hello的编译结果解析..................................................................................... - 6 -

3.4 本章小结............................................................................................................ - 6 -

第4章 汇编................................................................................................................ - 7 -

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

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

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

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

4.5 本章小结............................................................................................................ - 7 -

第5章 链接................................................................................................................ - 8 -

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

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

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

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

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

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

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

5.8 本章小结............................................................................................................ - 9 -

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

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

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

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

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

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

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

6.7本章小结.......................................................................................................... - 10 -

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

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

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

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

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

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

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

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

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

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

7.10本章小结........................................................................................................ - 12 -

第8章 hello的IO管理.................................................................................... - 13 -

8.1 Linux的IO设备管理方法............................................................................. - 13 -

8.2 简述Unix IO接口及其函数.......................................................................... - 13 -

8.3 printf的实现分析........................................................................................... - 13 -

8.4 getchar的实现分析....................................................................................... - 13 -

8.5本章小结.......................................................................................................... - 13 -

结论............................................................................................................................ - 14 -

附件............................................................................................................................ - 15 -

参考文献.................................................................................................................... - 16 -

第1章 概述

1.1 Hello简介

1. Hello的P2P(From Program to Process)过程

Program阶段(hello.c生成):

初学者编写`hello.c`源程序,这是一个文本文件,包含了程序员想要实现的功能代码,处于程序的原始文本形式 ,是静态存储在硬盘等存储设备上的指令集合。

从Program到Process转换:

预处理:对`hello.c`进行预处理操作,比如展开头文件、处理宏定义等。预处理器根据源文件中的预处理指令,将相关内容插入到源文件中,生成一个新的中间文件。

编译:编译器将预处理后的文件转换为汇编语言代码。这个过程会进行词法分析、语法分析、语义分析以及代码优化等操作,把高级语言的语句转换为汇编指令。

汇编:汇编器把汇编语言代码转换为机器语言的目标代码(二进制形式),生成目标文件。目标文件包含了机器能够直接执行的指令,但还不能直接运行,因为其中的地址等可能还未完全确定。

链接:链接器将目标文件与其他必要的库文件等链接在一起,解决目标文件中未定义的符号引用等问题,生成可执行文件(假设为`hello` )。此时,`hello`可执行文件还是存储在硬盘上的静态程序。

加载执行(成为Process):当在操作系统(如Bash shell )中执行`./hello`命令时,操作系统的加载器将可执行文件`hello`从硬盘加载到内存中。操作系统为该程序分配进程控制块(PCB),分配内存空间(通过`mmap`等操作 ),设置寄存器等,将其转换为一个进程。然后CPU按照指令执行该进程,开始取指、译码、执行等操作,在硬件(CPU、内存、I/O设备等)上运行起来 。

2. Hello的O2O(From Zero - 0 to Zero - 0)过程

从Zero - 0开始(程序创建):最初`hello.c`并不存在,是程序员从零开始编写代码,创建了这个源程序,此时是程序生命周期的起始零点。

程序执行与运行:经过上述复杂的预处理、编译、汇编、链接过程,以及加载到内存成为进程并在硬件上执行的过程,`hello`程序在操作系统的支持下运行。在此过程中,操作系统的进程管理模块为其分配时间片、进行调度,存储管理模块处理虚拟地址到物理地址的转换(涉及MMU、TLB、页表等 ),I/O管理模块处理输入输出操作等。

回归Zero - 0(程序结束):当`hello`程序执行完毕,操作系统回收该进程所占用的资源,包括内存空间、进程控制块等,将其从内存中清除,一切回归到初始的零状态,就像这个程序从未存在过一样,完成了从零点开始又回到零点的过程 。

1.2 环境与工具

1、硬件环境

CPU:Intel Core i9 系列(以具备多核心高性能运算能力,快速处理编译、链接等复杂计算任务 )

内存:16GB(保证在同时运行编辑器、编译器等多个工具时系统的流畅性 )

存储设备:固态硬盘(SSD ),用于快速存储和读取源文件、编译中间文件以及可执行文件,加快文件操作速度 。

显示器:分辨率 1920×1080,以清晰显示代码编辑界面、编译错误提示等信息 。

2、软件环境

操作系统:

Linux 系统(以 Ubuntu 为例 ):具有丰富的开源开发工具,其命令行环境便于进行编译、链接等操作,并且对 C 语言开发有良好的支持。

Windows 系统(Windows 11 ):可搭配 MinGW 等工具链实现 C 语言开发,同时拥有众多图形化开发工具。

文本编辑器 / 集成开发环境(IDE ):

Vim:轻量级且功能强大的文本编辑器,在 Linux 系统下广泛使用,通过插件可实现代码高亮、自动补全等功能,适合熟练掌握快捷键操作的开发者进行代码编写。

Visual Studio Code(VS Code ):跨平台的代码编辑器,拥有丰富的插件生态,安装 C/C++ 插件后,可实现代码智能提示、调试等功能,适用于 Windows、Linux、macOS 系统。

3、开发与调试工具

编译器:

GCC(GNU Compiler Collection ):开源的编译器套件,支持多种编程语言,在 Linux 系统下是默认的 C 语言编译器,也可在 Windows 系统下通过 MinGW 等工具链使用。它功能强大,可进行预处理、编译、汇编、链接等操作,并且支持丰富的编译选项,用于优化代码、生成调试信息等。

                            图1:gcc的处理过程

GDB(GNU Debugger ):GNU 开源调试工具,与 GCC 紧密配合,可在程序运行过程中设置断点、查看变量值、单步执行代码等,用于定位程序中的错误,在 Linux 和 Windows(搭配 MinGW )系统下均可使用。

1.3 中间结果

Hello.c<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值