计算机系统
大作业
题 目 程序人生-Hello’s P2P
专 业 计算机与电子通信大类
学 号 2023112301
班 级 23L0508
学 生 高涵
指 导 教 师 史先俊
计算机科学与技术学院
2025年5月
本文以“Hello's P2P”程序为研究对象,系统分析了从C语言源代码到进程执行的全生命周期。通过P2P(Program to Process)和O2O(Zero to Zero)两阶段模型,详细阐述了程序从预处理、编译、汇编、链接到进程创建、存储管理及终止回收的完整流程。在Linux环境下,结合GCC工具链和ELF文件格式,解析了程序在虚拟地址空间映射、动态链接、缺页中断处理等核心机制中的实现细节。实验通过生成中间文件(如hello.i、hello.s、hello.o)和可执行文件,验证了代码优化、符号解析、重定位等关键技术对程序执行的影响。此外,探讨了进程调度、信号处理、I/O接口(如printf和getchar)的实现原理。本文通过理论与实践结合,揭示了计算机系统中程序从静态代码到动态资源管理的底层逻辑。
关键词:预处理;编译;链接;ELF格式;进程管理;存储管理;虚拟地址空间;动态链接;I/O管理
目 录
2.2在Ubuntu下预处理的命令.......................................................................... - 5 -
3.2 在Ubuntu下编译的命令............................................................................. - 6 -
4.2 在Ubuntu下汇编的命令............................................................................. - 7 -
5.2 在Ubuntu下链接的命令............................................................................. - 8 -
5.3 可执行目标文件hello的格式.................................................................... - 8 -
6.2 简述壳Shell-bash的作用与处理流程..................................................... - 10 -
6.3 Hello的fork进程创建过程..................................................................... - 10 -
6.6 hello的异常与信号处理............................................................................ - 10 -
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 -
8.1 Linux的IO设备管理方法.......................................................................... - 13 -
8.2 简述Unix IO接口及其函数....................................................................... - 13 -
第1章 概述
1.1 Hello简介
1.1.1 P2P(From Program to Process)
从代码到进程的蜕变之旅
P2P(Program to Process)描述了从静态的C语言程序(如hello.c)到动态运行的进程(Process)的完整生命周期,其过程分为以下关键阶段:
1.1.1.1代码编写与静态程序生成
用户编写的hello.c源码(Program)通过以下步骤生成可执行文件:
预处理:预处理器(Cpp)展开宏定义(如#include <stdio.h>)、处理条件编译,生成扩展后的hello.i文件。
编译:编译器(Ccl)将hello.i翻译为汇编代码hello.s,期间进行语法分析、语义优化(如-Og选项平衡性能与调试)。
汇编:汇编器(As)将hello.s转换为机器指令,生成可重定位目标文件hello.o。
链接:链接器(Ld)合并hello.o与标准库(如libc.a),解析符号引用(如printf),生成可执行文件hello。
关键机制:静态链接确保程序包含运行所需的所有代码段(.text)、数据段(.data)及符号表。可执行文件格式(ELF)定义了程序头、段偏移等元数据,供操作系统加载时解析。
1.1.1.2进程创建与加载
在Bash中执行./hello时,操作系统通过以下步骤创建进程:
fork():复制Shell进程的上下文(PCB、文件描述符表),生成子进程。
execve():加载hello到子进程地址空间,重置代码段、数据段,并跳转到入口点_start。
内存映射:OS通过mmap为代码段(.text)、数据段(.data)、堆(malloc区域)、栈(局部变量)分配虚拟地址空间。
技术细节:进程地址空间初始时仅映射必要段,动态库(如libc.so)通过延迟绑定(PLT/GOT)按需加载。启动时_start调用__libc_start_main初始化环境,最终进入main函数执行逻辑。
1.1.1.3 硬件资源调度
进程运行时,系统资源通过以下机制协同运作:
CPU流水线:取指(Fetch)、译码(Decode)、执行(Execute)三级流水线处理指令,循环计数(for(i=0;i<10;i++))依赖分支预测加速。
存储管理:MMU通过四级页表(PGD→PUD→PMD→PTE)将虚拟地址(VA)转为物理地址(PA);TLB缓存热点页表项减少转换开销。
缓存层次:L1/L2/L3 Cache逐级缓存热点数据(如argv字符串),降低RAM访问延迟。
I/O管理:printf通过系统调用(write)将输出传递至显卡缓冲区,getchar()等待键盘输入触发中断(IRQ)唤醒进程。
1.1.2 O2O(From Zero to Zero)
从虚无到虚无的资源轮回
O2O(Zero to Zero)描述了进程从启动到终止的全生命周期,其核心是资源的动态分配与回收:
1.1.2.1进程启动:从零开始
虚拟内存初始化:execve调用时,内核为进程建立初始虚拟内存映射(代码段、数据段),但物理内存尚未分配(Copy-on-Write机制)。
物理内存按需加载:首次访问代码/数据触发缺页异常(Page Fault),内核分配物理页框并填充内容(从磁盘或零页)。
资源绑定:文件描述符(如stdin/stdout)、信号处理表(如SIGINT默认处理)由Shell继承或重新初始化。
-
-
-
- 执行阶段:短暂存在
-
-
时间片轮转:OS调度器分配CPU时间片,进程在运行态(Running)、就绪态(Ready)、阻塞态(Blocked,如sleep()