呼噜嘟噜噜头像
关注
CSAPP:程序人生-Hello’s P2P封面图

CSAPP:程序人生-Hello’s P2P

题    目  程序人生-Hello’s P2P 

学    号          2023113180       

姓    名              李显龙            

班    级             23L0514          

指导教师             史先俊           

计算机科学与技术学院

2025年5月

摘  要

本论文围绕 “Hello’s P2P” 展开,深入研究从程序(program)到进程(process)的全过程。首先介绍了在 Ubuntu 环境下,利用 GCC 等工具将hello.c依次进行预处理、编译、汇编和链接,生成可执行文件的详细过程,并对各阶段的概念、作用、命令及结果进行解析。接着探讨了hello进程管理,涵盖进程概念、Shell 创建进程流程、fork和execve系统调用,以及进程执行中的异常与信号处理。在存储管理方面,阐述了hello程序运行时的存储器地址空间、地址变换机制、Cache 对物理内存访问的优化,以及进程fork和execve时的内存映射。最后分析了 Linux 的 IO 管理。通过对hello程序的研究,系统的展示了计算机系统各组件的协同工作,对理解计算机系统设计与实现具有重要意义。

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

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

目录

第1章 概述

1.1 Hello简介

1.2 环境与工具

1.3 中间结果

1.4 本章小结

第2章 预处理

2.1 预处理的概念与作用

2.2在Ubuntu下预处理的命令

2.3 Hello的预处理结果解析

2.4 本章小结

第3章 编译

3.1 编译的概念与作用

3.2 在Ubuntu下编译的命令

3.3 Hello的编译结果解析

3.4 本章小结

第4章 汇编

4.1 汇编的概念与作用

4.2 在Ubuntu下汇编的命令

4.3 可重定位目标elf格式

4.4 Hello.o的结果解析

4.5 本章小结

第5章 链接

5.1 链接的概念与作用

5.2 在Ubuntu下链接的命令

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

5.4 hello的虚拟地址空间

5.5 链接的重定位过程分析

5.6 hello的执行流程

5.7 Hello的动态链接分析

5.8 本章小结

第6章 hello进程管理

6.1 进程的概念与作用

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

6.3 Hello的fork进程创建过程

6.4 Hello的execve过程

6.5 Hello的进程执行

6.6 hello的异常与信号处理

6.7本章小结

第7章 hello的存储管理

7.1 hello的存储器地址空间

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

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

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

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

7.6 hello进程fork时的内存映射

7.7 hello进程execve时的内存映射

7.8 缺页故障与缺页中断处理

7.9 本章小结

第8章 hello的IO管理

8.1 Linux的IO设备管理方法

8.2 简述Unix IO接口及其函数

8.3 printf的实现分析

8.4 getchar的实现分析

8.5本章小结

结论

附件

参考文献


目  录

第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. P2P过程:programprocess

首先需要生成program,经过四个步骤。

先进行预处理(Preprocessing用户编写的hello.c首先经过预处理器(cpp)处理,展开头文件、宏定义,删除注释,生成预处理文件hello.i。

然后将程序进行编译(Compilation。编译器(gcc)将hello.i转换为汇编语言hello.s,完成词法分析、语法分析、语义检查及中间代码生成。此阶段将 C 语言的控制结构(如if/else)、数据类型(如int、char)映射为底层汇编指令,体现了高级语言到低级语言的抽象转换。

下一步是汇编(Assembly。汇编器(as)将hello.s转换为可重定位目标文件hello.o,生成二进制机器码并保留符号表和重定位信息。此时程序以 ELF 格式的可重定位文件存在,包含代码段(.text)、数据段(.data)和未初始化数据段(.bss)。

最后进行链接(Linking。链接器(ld)将hello.o与标准库(如printf所在的 C 运行时库)链接,解析外部符号引用(如main函数入口),生成最终的可执行文件hello。静态链接完成地址重定位,使程序具备在内存中独立运行的能力。

2. 020过程:进程的生命周期

程序的初始状态处于Zero。此时操作系统中无任何进程与hello.c关联,内存中无其地址空间,CPU 未分配资源。然后程序在运行过程中进行资源申请,进程创建时申请虚拟地址空间、文件描述符(如标准输出stdout)、CPU 时间片等。进程终止后进行资源回收。main函数返回或调用exit,触发进程清理:关闭文件描述符、释放堆内存(通过free或 C 库自动回收)、销毁线程栈,回归Zero状态。

1.2 环境与工具

硬件环境:X86-64 Intel i5 13th 16 GB RAM 512 GHD Disk

软件环境:Windows 11 VMware 17Pro Ubuntu 22.04.5 LTS

开发调试工具:GDB,EDB,Visual Studio Code,Vim,gcc

1.3 中间结果

文件名

说明

hello.c

源代码文件

hello.i

预处理后的文本文件

hello.s

编译后的汇编文件

hello.o

汇编后的可重定位文件

hello

链接后的可执行文件

ds_hello.s

反汇编hello.o的汇编代码

ds_hello_2.s

反汇编hello的汇编代码

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/weixin_67952355/article/details/147902084

文章来源转载

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--