本文以经典的"Hello World"程序为研究对象,全面剖析了计算机系统中程序从源代码到最终执行的完整生命周期。研究内容涵盖程序构建、进程管理、内存机制和输入输出等计算机系统核心领域,通过理论分析与实践验证相结合的方式,深入阐释了各环节的技术原理和实现细节。
在程序构建阶段,研究详细追踪了源代码到可执行文件的完整转换过程:预处理环节通过宏展开和头文件包含生成中间代码;编译阶段完成语法分析、语义检查和代码优化,输出平台相关的汇编指令;汇编阶段实现机器码转换并生成可重定位目标文件;链接阶段则整合系统库函数,构建最终的可执行映像。研究特别采用objdump、readelf等工具对ELF文件格式和指令映射关系进行了实证分析。
在系统运行层面,研究深入探讨了进程创建机制(fork/execve)、内存管理架构(段页式存储、TLB优化、缺页处理)以及I/O系统实现(系统调用流程、设备驱动交互)等关键技术。通过printf和getchar等标准库函数的案例分析,揭示了用户空间与内核空间的协同工作机制。
关键词:程序构建、动态链接、进程管理、虚拟内存、系统调用
目 录
第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.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简介
一、P2P:From Program to Process
1.代码阶段
文本编辑:用户编写 hello.c 源码,包含预处理指令(#include)、主函数(main)等。
预处理(Preprocess):预处理器(CPP)展开宏、包含头文件(如 stdio.h),生成 hello.i。
编译(Compile):编译器(如 GCC)将高级代码翻译为汇编语言(hello.s),优化(如 -O2)在此阶段生效。
汇编(Assemble):汇编器(AS)将汇编代码转换为机器指令,生成可重定位目标文件 hello.o。
链接(Link):链接器(LD)合并 hello.o 与库文件(如 libc.so),解析符号引用,生成可执行文件 hello。
2.进程阶段
Shell 调用:用户通过 Bash 输入 ./hello,Shell 解析命令并请求内核执行。
进程创建(fork + execve):
fork():Shell 调用 fork() 创建子进程,复制父进程的地址空间、文件描述符表等。
execve():子进程调用 execve() 加载 hello 可执行文件,替换代码段、数据段,重置堆栈。
进程上下文初始化:OS 分配进程控制块(PCB),设置程序计数器(PC)指向 _start,初始化寄存器、堆栈指针(SP)。
二、O2O:From Zero-0 to Zero-0
1.O2
CPU 调度与执行:进程加入就绪队列,OS 分配时间片,CPU 通过取指-译码-执行周期运行指令,流水线技术提升效率。
存储管理(VA→PA 转换):虚拟内存(VM):进程使用虚拟地址(VA),MMU 通过页表(4 级页表 x86_64)将其转换为物理地址(PA)。TLB 缓存常用页表项,多级 Cache(L1/L2/L3)减少内存访问延迟。Pagefile/交换空间:若物理内存不足,OS 将部分页面换出至磁盘。
I/O:printf 触发 write(),内核通过设备驱动将数据输出到屏幕。
2.2O
正常终止:main 函数返回后调用 exit(),或执行 return 0。OS 回收进程占用的内存(堆、栈、代码段)、关闭文件描述符、释放 PCB。Shell 调用 waitpid() 等待子进程结束,获取退出状态码,释放僵尸进程(Zombie)资源。
异常终止:用户按Ctrl-C(SIGINT)或Ctrl-Z(SIGTSTP)时,内核向进程发送信号强制结束进程。
1.2 环境与工具
硬件环境:12th Gen Intel(R) Core(TM) i9-12900H 2.50 GHz;RAM 16.0 GB
软件环境:Windows 11 64位;MobaXterm;visual studio;
开发与调试工具:Visual Studio 1.89.0;vim,gidit ,objdump,edb,gcc,readelf等开发工具
1.3 中间结果
原始代码hello.c
预处理后的代码hello.i
汇编语言代码hello.s
可重定位目标文件hello.o
可执行文件hello
1.4 本章小结
本章主要介绍了hello.c程序P2P,020, 说明了本实验所需的硬件配置、软件平台、开发工具以及本实验生成的各个中间结果文件的名称和功能。

最低0.47元/天 解锁文章
980

被折叠的 条评论
为什么被折叠?



