HIT-ICS 2025春计算机系统大作业 程序人生-Hello’s P2P

article/2025/8/27 15:53:22

摘  要

本报告通过分析hello程序从hello.c源代码到进程终止的完整生命周期,系统阐述了计算机系统的多层次协作机制。首先,通过预处理、编译、汇编与链接阶段,将C语言源代码转换为可执行文件;其次,结合进程管理、存储管理及输入输出管理,深入探讨了进程创建、地址空间转换、动态链接、信号处理等核心机制。实验部分利用GCC、GDB、ReadELF等工具,验证了逻辑地址到物理地址的页式转换、动态链接的PLT/GOT机制、异常处理与终端I/O交互等关键技术。本报告通过理论与实践结合,揭示了操作系统、编译器与硬件的协同设计原理,为深入理解计算机系统提供了完整案例。

关键词:预处理;编译;动态链接;进程管理;存储管理;输入输出管理

目  录

第1章 概述... - 4 -

1.1 Hello简介... - 4 -

1.2 环境与工具... - 4 -

1.3 中间结果... - 4 -

1.4 本章小结... - 5 -

第2章 预处理... - 6 -

2.1 预处理的概念与作用... - 6 -

2.2在Ubuntu下预处理的命令... - 6 -

2.3 Hello的预处理结果解析... - 6 -

2.4 本章小结... - 7 -

第3章 编译... - 8 -

3.1 编译的概念与作用... - 8 -

3.2 在Ubuntu下编译的命令... - 8 -

3.3 Hello的编译结果解析... - 8 -

  3.3.1 数据类型与变量... - 8 -

  3.3.2 赋值与表达式... - 9 -

  3.3.3 算术与逻辑操作... - 10 -

  3.3.4 控制转移... - 10 -

  3.3.5 函数操作... - 12 -

  3.3.6 指针与数组操作... - 12 -

  3.3.7 其他操作... - 13 -

3.4 本章小结... - 13 -

第4章 汇编... - 14 -

4.1 汇编的概念与作用... - 14 -

4.2 在Ubuntu下汇编的命令... - 14 -

4.3 可重定位目标elf格式... - 14 -

4.4 Hello.o的结果解析... - 17 -

  4.4.1 反汇编与汇编代码对照分析... - 18 -

  4.4.2 机器语言与汇编语言的映射特点... - 20 -

  4.4.3 关键结论... - 21 -

4.5 本章小结... - 21 -

第5章 链接... - 22 -

5.1 链接的概念与作用... - 22 -

5.2 在Ubuntu下链接的命令... - 22 -

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

5.4 hello的虚拟地址空间... - 27 -

5.5 链接的重定位过程分析... - 29 -

5.6 hello的执行流程... - 32 -

5.7 Hello的动态链接分析... - 34 -

5.8 本章小结... - 35 -

第6章 hello进程管理... - 36 -

6.1 进程的概念与作用... - 36 -

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

6.3 Hello的fork进程创建过程... - 36 -

6.4 Hello的execve过程... - 37 -

6.5 Hello的进程执行... - 37 -

6.6 hello的异常与信号处理... - 37 -

  6.6.1 异常类型与信号生成... - 37 -

  6.6.2 键盘操作与信号响应... - 38 -

6.7本章小结... - 42 -

第7章 hello的存储管理... - 43 -

7.1 hello的存储器地址空间... - 43 -

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

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

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

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

7.6 hello进程fork时的内存映射... - 46 -

7.7 hello进程execve时的内存映射... - 47 -

7.8 缺页故障与缺页中断处理... - 48 -

7.9动态存储分配管理... - 48 -

7.10本章小结... - 49 -

第8章 hello的IO管理... - 50 -

8.1 Linux的IO设备管理方法... - 50 -

8.2 简述Unix IO接口及其函数... - 50 -

8.3 printf的实现分析... - 51 -

8.4 getchar的实现分析... - 52 -

8.5本章小结... - 53 -

结论... - 54 -

附件... - 56 -

参考文献... - 57 -

第1章 概述

1.1 Hello简介

Hello程序的完整生命周期可概括为P2P(Program to Process)和020(Zero to Zero)两个核心过程:

1. P2P(从程序到进程)

预处理(Preprocessing):hello.c通过宏替换、头文件展开和条件编译生成hello.i,消除注释与冗余信息。

编译(Compilation):将hello.i转换为汇编代码hello.s,完成语法语义分析并生成机器无关的低级表示。

汇编(Assembly):将hello.s翻译为机器指令,生成可重定位目标文件hello.o,包含二进制代码和符号表。

链接(Linking):将hello.o与C标准库(如libc.so)动态链接,解析外部符号(如printf),生成可执行文件hello。

进程加载(Process Loading):Shell通过fork创建子进程,execve将hello加载至内存,形成独立进程空间,CPU执行指令直至终止。

2. 020(从零到零)

进程执行结束后,操作系统回收其占用的内存、文件描述符等资源,进程控制块(PCB)被销毁,状态回归初始“零”状态。

1.2 环境与工具

硬件环境:

处理器 13th Gen Intel(R) Core(TM) i7-13700H   2.40 GHz

机带 RAM 16.0 GB (15.7 GB 可用)

系统类型    64 位操作系统, 基于 x64 的处理器

软件环境:Windows11 64位,VMwareUbuntu

开发与调试工具:Visual Studiovim objump edb gcc readelf等工具

1.3 中间结果

表1-1 中间结果

文件名称

功能

hello.c

源程序

hello.i

预处理后得到的文本文件

hello.s

编译后得到的汇编语言文件

hello.o

汇编后得到的可重定位目标文件

hello.elf

用readelf读取hello.o得到的ELF格式信息

hello.asm

反汇编hello.o得到的反汇编文件

hello

链接后得到的可执行文件

hello1.elf

用readelf读取hello得到的ELF格式信息

hello1.asm

反汇编hello得到的反汇编文件

1.4 本章小结

本章概述了Hello程序从源代码到进程的完整生命周期(P2P)及其终止后的资源回收(020),明确了预处理、编译、汇编、链接与进程加载的关键步骤。同时,列出了实验所需的软硬件环境与工具,并展示了生成的中间结果文件。后续章节将基于此框架,逐步深入分析每个环节的实现细节。

第2章 预处理

2.1 预处理的概念与作用

预处理是C程序编译过程中的第一阶段,其核心任务是对源代码进行文本级别的处理,为后续的编译阶段提供“纯净”的输入。具体作用包括:

1. 宏替换:处理#define定义的宏,将其替换为实际值或代码片段。

2. 头文件展开:递归展开#include指令,将头文件内容插入源文件中。

3. 条件编译:根据#ifdef、#ifndef等指令选择性保留或删除代码块。

4. 删除注释:移除所有单行(//)和多行注释(/* ... */)。

5. 添加行号标记:插入#line指令,便于编译器报错时定位原始代码位置。

2.2在Ubuntu下预处理的命令

使用的命令是:gcc -E hello.c -o hello.i

同时,通过ls命令验证文件的存在。

图2-1 预处理

如图2-1所示, hello.i出现在了目录下。

2.3 Hello的预处理结果解析

打开hello.i文件,分析预处理后的代码变化:

图2-2 hello.i

1. 头文件展开

原始代码:

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

预处理结果:

#include指令被替换为对应头文件的全部内容。例如,stdio.h展开后包含printf、getchar等函数的声明,以及FILE、size_t等类型的定义,代码量从几行扩展至近千行。

2. 宏与条件编译处理

原始代码中未定义自定义宏,但标准库中的宏(如NULL)被展开为((void*)0)。

条件编译指令(如#ifdef)未被使用,因此预处理后无变化。

3. 注释删除与代码格式

所有注释(如// 秒数=手机号%5)被完全删除。

代码保留原始缩进结构,但行号因头文件插入而大幅增加。

2.4 本章小结

预处理阶段通过宏替换、头文件展开和注释删除,将原始的hello.c转换为仅包含有效代码的hello.i。此阶段未修改程序的逻辑结构,但为后续编译提供了标准化的输入。生成的hello.i文件是后续编译阶段的起点,其内容直接决定了汇编代码的生成方式。

第3章 编译

3.1 编译的概念与作用

编译是将预处理后的高级语言代码转换为目标机器架构相关的汇编语言代码的过程。其主要作用包括:

1. 语法与语义检查:验证代码是否符合C语言规范,检测类型错误、未声明变量等问题。

2. 中间代码生成与优化:生成抽象语法树(AST)或中间表示(IR),并进行初步优化(如常量折叠、死代码删除)。

3. 汇编代码生成:将优化后的中间代码转换为特定架构(如x86-64)的汇编指令,为后续汇编阶段提供输入。

hello程序中,编译阶段将hello.i文件转换为hello.s,为机器码生成奠定基础。

3.2 在Ubuntu下编译的命令

使用的命令是:gcc -S hello.i -o hello.s

图3-1 编译

如图3-1所示,hello.s出现在了目录下。

3.3 Hello的编译结果解析

3.3.1 数据类型与变量

1. 局部变量

C代码:int i;(未赋初值)

汇编实现:

图3-2 局部变量

变量i存储在栈帧偏移-4(%rbp)处,初始值通过movl $0显式赋0。

subq $32, %rsp为main函数分配32字节栈空间,包含局部变量和参数对齐。

2. 字符串常量

C代码:

"用法: Hello 学号 姓名 手机号 秒数!"

"Hello %s %s %s\n"

汇编实现:

图3-3 字符串常量

字符串常量存储在只读数据段(.rodata),通过标签(如.LC0)引用。编译器将字符串中的汉字编码成UTF-8格式,一个汉字占3个字节。字节之间用\分割开。

3.3.2 赋值与表达式

1. 赋值操作</


http://www.hkcw.cn/article/wWmymPYDEQ.shtml

相关文章

Hello的程序人生

计算机系统 大作业 题 目 程序人生-Hello’s P2P 专 业 未来技术模块 学   号 2023111680 班   级 23WLR14 学 生 姜虹伯 指 导 教 师 吴锐   计算机…

程序人生hello.c

计算机科学与技术学院 2024年5月 摘 要 本文系统分析了HELLO程序从源代码到执行的完整生命周期&#xff0c;揭示了编译系统与操作系统协同工作的底层机制。研究以Ubuntu环境和GCC工具链为基础&#xff0c;覆盖预处理、编译、汇编、链接四大阶段&#xff1a;预处理阶段展开宏…

哈尔滨工业大学HIT-ICS2024大作业-程序人生-Hello‘s P2P

第1章 概述 1.1 Hello简介 ①P2P&#xff1a;这一过程是指 Hello如何从C源文件经过预处理转变为可执行文件&#xff0c;这一过程共需经历四个阶段&#xff1a; 1&#xff09;预处理器处理&#xff0c;生成文本文件hello.i 2&#xff09;编译器处理&#xff0c;生成汇编程序…

开源项目的认识理解

目录 开源项目有哪些机遇与挑战&#xff1f; 1.开源项目的发展趋势 2.开源的经验分享&#xff08;向大佬请教与上网查询&#xff09; 3.开源项目的挑战 开源项目有哪些机遇与挑战&#xff1f; 1.开源项目的发展趋势 1. 持续增长与普及 - 开源项目将继续增长&#xff0c…

HIT-CSAPP大作业-程序人生

摘 要 本文概述了hello.c源文件从预处理、编译、汇编、链接到最终执行的关键步骤&#xff0c;阐述了程序在操作系统中的加载与运行过程。同时&#xff0c;通过对hello程序在进程管理、存储结构和输入输出控制方面的介绍&#xff0c;帮助读者对程序的整个生命周期有了基础认识…

普通人的四年程序人生

还记得当初自己为什么选择计算机&#xff1f; 当初你问我为什么选择计算机&#xff0c;我笑着回答&#xff1a;“因为我梦想成为神奇的码农&#xff01;我想像编织魔法一样编写程序&#xff0c;创造出炫酷的虚拟世界&#xff01;”谁知道&#xff0c;我刚入门的那天&#xff0…

【老张的程序人生】一天时间,我成软考高级系统分析师

今年下半年&#xff0c;我心血来潮报考了软考高级系统分析师。彼时的我&#xff0c;工作繁忙至极&#xff0c;一周十四节课&#xff0c;班主任的职责压身&#xff0c;还兼任教学管理事务&#xff0c;每日忙得晕头转向&#xff0c;那点可怜的闲暇时光&#xff0c;也都奉献给了游…

HIT-2024CSAPP 程序人生-Hello‘s P2P大作业

摘要 本文借助hello.c程序&#xff0c;结合本学期计算机系统课程所学习的大部分内容&#xff0c;分析了hello.c这个程序的一生&#xff0c;探讨了从源程序到可执行程序转变的全过程&#xff0c;包含预处理&#xff0c;编译&#xff0c;链接&#xff0c;生成等步骤&#xff0c;在…

第七届下一代数据驱动网络国际学术会议(NGDN 2025)

在线投稿: 学术会议-学术交流征稿-学术会议在线-艾思科蓝 张彦,挪威奥斯陆大学信息工程学院教授,IEEE Fellow,IET Fellow。入选欧洲科学院院士,挪威皇家科学院院士,挪威工程院院士,2018-2022连续五年全球“高被引科学家”近期主要研究方向为新一代无线通信网络和智…

Selenium 测试框架 - Kotlin

🚀Selenium Kotlin 实践指南:以百度搜索为例的完整测试示例 随着测试自动化的普及,Selenium 已成为 Web 自动化测试的事实标准,而 Kotlin 凭借其简洁语法和高安全性,越来越受到开发者欢迎。本指南将通过一个完整的实战案例——在百度中执行搜索操作,来展示如何使用 Sele…

记录一次wkhtmltopdf生成pdf造成oom问题

问题现象 有个生成pdf的接口&#xff0c;到处pdf为空&#xff1b;docker环境必现&#xff0c;但是本地环境无法复现 1、代码增加各处错误判断&#xff0c;发现docker环境调用接口出现 Loading pages (1/6) [> …

YOLOX 的动态标签分类(如 SimOTA)与 Anchor-free 机制解析2025.5.29

YOLOX 的动态标签分类&#xff08;如 SimOTA&#xff09;与 Anchor-free 机制是其核心改进中的两个关键部分&#xff0c;它们在目标检测中的作用和实现方式存在显著差异。以下从原理、实现细节及效果三个方面进行详细对比&#xff1a; 一、核心原理与目标 1. Anchor-free 机制…

netTAP 100:在机器人技术中将 POWERLINK 转换为 EtherNet/IP

工业机器人服务专家 年轻的 More Robots 公司成立仅一年多&#xff0c;但其在许多应用领域的专业技术已受到广泛欢迎。这是因为More Robots提供 360 度全方位服务&#xff0c;包括从高品质工业机器人和协作机器人到咨询和培训。这包括推荐适合特定任务或应用的机器人&#xff0…

Allegro 16.6 aidt(自动等长)巧用

在我刚刚进入这个圈子的时候,身边的人都在用allegro16.3,但近一年隐约觉得用16.6的人多了起来,但对于16.6的理解是少有人去探究的,这也急不来,让我们慢慢道来 今天带给大家的是aidt的使用,不仅仅是功能的使用,相信你读了会有所启发。 使用方法 首先连好需要做等长的线,…

SSH免密登录其它用户脚本

这个是同一个网段下免密互联的脚本仅供大家参考 首先我们先需要安装一个sshpass文件 我的是rocky系统 yum install sshpass -y 否则会有报错 这个版本只能是第一台主机&#xff08;即执行此脚本命令的主机&#xff09;登录到其他主机免密&#xff0c;反之不免密。 #!/bin/ba…

DeepSeek R1开源模型的技术突破与AI产业格局的重构

引言​ 2025年&#xff0c;中国AI企业深度求索&#xff08;DeepSeek&#xff09;推出的开源模型DeepSeek-R1&#xff0c;以低成本、高性能和开放生态为核心特征&#xff0c;成为全球人工智能领域的技术焦点。这一模型不仅通过算法创新显著降低算力依赖&#xff0c;更通过开源策…

从“刚性扩容”到“弹性供给”:移动充电服务重构配电网边际成本

随着新能源技术的快速发展&#xff0c;电动汽车的普及对传统配电网提出了新的挑战。传统的“刚性扩容”模式依赖基础设施的物理扩建&#xff0c;不仅投资成本高&#xff0c;且难以应对动态变化的电力需求。在此背景下&#xff0c;“弹性供给”理念逐渐兴起&#xff0c;特别是移…

利用海外代理IP,做Twitter2026年全球趋势数据分析

近年来&#xff0c;社交媒体趋势分析逐渐成为品牌监控、市场洞察和消费者研究的必备工具。而当谈到全球趋势数据分析&#xff0c;很多人都会立即想到 Twitter趋势&#xff08;逼近连美丽国的总统都喜欢在上面发表自己的看法- -!!!&#xff09;。Twitter趋势&#xff0c;即Twitt…

台曜的高速PCB板材有哪些

在当今高速发展的电子信息时代&#xff0c;电子产品的性能不断提升&#xff0c;电子产品对高速PCB的需求也日益增长。台曜科技作为行业内的重要参与者&#xff0c;推出了一系列性能卓越的高速板材料&#xff0c;以满足不同领域的应用需求。本文将详细介绍台曜的几种高速PCB板材…

三大AI开发平台深度对比:Coze、Dify、n8n全方位解析

名人说&#xff1a;博观而约取&#xff0c;厚积而薄发。——苏轼《稼说送张琥》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、平台概述与定位1. Coze&#xff1a;对话智能的先锋2. Dify&#xff1a;企业级A…