哈尔滨工业大学计算机系统大作业程序人生-Hello’s P2P

06-02 1024阅读

摘  要

文章以C语言程序设计经典案例hello.c为研究对象,系统解析程序在计算机系统中的完整生命周期。剖析源代码通过预处理、编译、汇编、链接四阶段演化为可执行目标程序的编译系统工作机制,继而从进程视角揭示程序运行时计算机体系结构的协同运作:处理器执行指令流、存储器层次架构支撑数据存取,操作系统通过进程管理实现资源调度与状态维护。通过深度追踪hello.c从静态代码到动态进程的转化路径,构建对程序存储、加载、执行等计算机系统核心机制的完整认知框架。

在整个实验中使用泰山服务器进行。

关键词:预处理;编译;汇编;链接;进程;存储;计算机系统       

目  录

第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动态存储分配管理 

7.10本章小结 

第8章 hello的IO管理 

8.1 Linux的IO设备管理方法 

8.2 简述Unix IO接口及其函数 

8.3 printf的实现分析 

8.4 getchar的实现分析 

8.5本章小结 

结论 

附件 

参考文献 

第1章 概述

1.1 Hello简介

(1)P2P过程

代码阶段:hello.c作为文本文件(高级语言程序),通过预处理(处理#include等指令)、编译(转为汇编代码hello.s)、汇编(生成机器码hello.o)、链接(合并库函数生成可执行文件hello),最终成为磁盘上的二进制程序。

  

进程阶段;

用户在Shell中输入./hello后,操作系统通过fork()创建子进程,execve()加载hello到内存,CPU开始执行指令:

存储管理:MMU将虚拟地址(VA)转为物理地址(PA),TLB和页表加速映射。

CPU调度:进程在时间片内运行(取指、译码、执行),可能因中断或时间片耗尽切换。

I/O交互:printf通过系统调用write将字符串输出到屏幕,getchar等待键盘输入。

(2)020过程

Zero→运行:

进程从“无”到被OS创建,分配资源(内存、文件描述符等),进入就绪队列。

运行→Zero:

正常终止:main返回后,OS回收内存、关闭文件,父进程(如Shell)通过wait获取退出状态。

异常终止:用户按Ctrl-C(SIGINT)或Ctrl-Z(SIGTSTP)时,OS发送信号强制结束进程,清理资源。

1.2 环境与工具

硬件环境:x64 CPU;3.20GHz;16G RAM

软件环境:Windows 11 64位;MobaXterm

开发与调试工具:gcc,objdump,readelf

1.3 中间结果

原始代码hello.c

预处理后的代码hello.i

编译后的汇编语言代码hello.s

可重定位目标文件hello.o

可执行文件hello

1.4 本章小结

本章主要介绍了hello.c程序P2P,020的过程。列出了本次实验所需的环境和工具以及过程中所生成的中间结果。

第2章 预处理

2.1 预处理的概念与作用

预处理的概念:是在数据正式处理或分析前进行的预备性操作,旨在提升数据质量、统一格式或提取关键信息,为后续步骤提供更高效的输入。

预处理的作用:缩短计算时间、提升模型精度、增强数据可靠性,是机器学习和数据分析中不可或缺的环节。例如,图像预处理(去噪、裁剪)可提高AI识别准确率,文本预处理(分词、去停用词)能优化自然语言处理效果。

2.2在Ubuntu下预处理的命令

哈尔滨工业大学计算机系统大作业程序人生-Hello’s P2P

图2.1预处理命令展示

2.3 Hello的预处理结果解析

哈尔滨工业大学计算机系统大作业程序人生-Hello’s P2P

图2.2hello.i文件部分展示

(1)头文件包含展开:

#include 会被替换为stdio.h头文件的内容

#include 会被替换为unistd.h头文件的内容

#include 会被替换为stdlib.h头文件的内容

哈尔滨工业大学计算机系统大作业程序人生-Hello’s P2P

图2.3头文件预处理部分截图

(2)注释处理:原始代码中的注释大作业的 hello.c 程序等会被移除

哈尔滨工业大学计算机系统大作业程序人生-Hello’s P2P

图2.4移除注释后的原程序

(3)头文件内容:

stdio.h会提供printf、getchar等函数的声明

unistd.h会提供sleep函数的声明

stdlib.h会提供exit、atoi等函数的声明

(4)预处理指令消失:所有的#include、#define等预处理指令都会被处理掉,不会出现在预处理后的代码中

2.4 本章小结

预处理是在数据正式处理或分析前进行的预备性操作,旨在提升数据质量、统一格式或提取关键信息,为后续步骤提供更高效的输入。

在linux环境下使用 gcc -E 命令对源代码进行预处理,生成预处理后的代码(.i 文件)。

对C语言程序进行预处理中头文件包含展开、注释处理、预处理指令消失生成更干净的代码供编译器使用。

第3章 编译

3.1 编译的概念与作用

注意:这儿的编译是指从 .i 到 .s 即预处理后的文件到生成汇编语言程序

编译的概念:

编译是指将预处理后的源代码(.i 文件,即经过宏展开、头文件包含、去注释等处理后的代码)转换为汇编代码(.s 文件)的过程。

输入预处理后的 C 代码(.i 文件)输出:汇编语言代码(.s 文件)

编译的作用:

将高级的C语言转换为低级语言更接近机器指令,优化代码结构,为后续汇编阶段做准备

3.2 在Ubuntu下编译的命令

哈尔滨工业大学计算机系统大作业程序人生-Hello’s P2P

哈尔滨工业大学计算机系统大作业程序人生-Hello’s P2P

图3.1编译的命令

3.3 Hello的编译结果解析

哈尔滨工业大学计算机系统大作业程序人生-Hello’s P2P

图3.2hello.s文件展示

3.3.1 基本数据类型处理

整数类型局部变量 i:

哈尔滨工业大学计算机系统大作业程序人生-Hello’s P2P

图3.3基本数据类型处理

int 为 32 位,使用 w 系列寄存器(w0~w30)。

存储在栈偏移量 44 处(sp 为栈指针)。

指针类型参数访问 argv[1]:

哈尔滨工业大学计算机系统大作业程序人生-Hello’s P2P

图3.4基本数据类型处理

3.3.2控制结构处理

条件分支(if(argc!=5))

哈尔滨工业大学计算机系统大作业程序人生-Hello’s P2P

图3.5条件分支处理

cmp 指令比较后,beq(branch if equal)实现条件跳转。

循环 (for(i=0;i

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码