2025春计算机系统大作业

摘  要

本文以经典的"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.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简介

一、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, 说明了本实验所需的硬件配置、软件平台、开发工具以及本实验生成的各个中间结果文件的名称和功能。

第2章 预处理

2.1 预处理的概念与作用

1.预处理概念

预处理的概念:在源程序被编译器处理之前,cpp根据源文件中的宏定义、条件编译等命令对源文件作以修改,执行一些预处理命令,如宏替换,头文件包含,条件编译,注释删除等。

2.预处理作用

作用:把源代码分割或处理成为特定的单位,为编译器提供一个经过处理的源代码文件,以便进行后续的编译工作。

2.2在Ubuntu下预处理的命令

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值