哈尔滨工业大学CSAPP大作业

计算机系统

大作业

题     目  程序人生-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管理                        

目  录

第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.1.1 P2PFrom 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 O2OFrom Zero to Zero

从虚无到虚无的资源轮回
O2O(Zero to Zero)描述了进程从启动到终止的全生命周期,其核心是资源的动态分配与回收:

1.1.2.1进程启动:从零开始

虚拟内存初始化​:execve调用时,内核为进程建立初始虚拟内存映射(代码段、数据段),但物理内存尚未分配(Copy-on-Write机制)。

物理内存按需加载​:首次访问代码/数据触发缺页异常(Page Fault),内核分配物理页框并填充内容(从磁盘或零页)。

资源绑定​:文件描述符(如stdin/stdout)、信号处理表(如SIGINT默认处理)由Shell继承或重新初始化。

        1. 执行阶段:短暂存在

时间片轮转​:OS调度器分配CPU时间片,进程在运行态(Running)、就绪态(Ready)、阻塞态(Blocked,如sleep()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值