程序人生-Hello’s P2P

摘  要

本文通过在unbuntu虚拟机下对hello.c文件的预处理、编译、汇编、链接等操作的实现原理分析,还原了hello程序的生命历程,并且对hello程序的进程管理、存储管理和IO管理也做简要的说明。回顾了计算机系统的几乎全部的知识,希望能通过总结对于计算机系统的工作与原理有更深的了解。

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

目  录

第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的预处理结果解析... - 7 -

2.4 本章小结... - 8 -

第3章 编译... - 9 -

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

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

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

3.3.1 数据... - 9 -

3.3.2 赋值... - 10 -

3.3.3 算术操作... - 10 -

3.3.4 关系操作... - 11 -

3.3.5 数组、指针、结构体操作... - 11 -

3.3.6 控制转移... - 11 -

3.3.7 函数调用... - 12 -

3.4 本章小结... - 13 -

第4章 汇编... - 14 -

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

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

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

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

4.5 本章小结... - 19 -

第5章 链接... - 20 -

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

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

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

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

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

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

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

5.8 本章小结... - 28 -

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

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

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

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

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

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

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

6.6.1 异常... - 33 -

6.6.2 信号... - 34 -

6.6.3 Hello运行时的异常与信号... - 35 -

6.7本章小结... - 38 -

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

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

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

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

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

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

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

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

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

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

7.10本章小结... - 46 -

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

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

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

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

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

8.5本章小结... - 51 -

结论... - 51 -

附件... - 53 -

参考文献... - 54 -

第1章 概述

1.1 Hello简介

       P2PFrom Program to Process

      Hello.c代码文件从本质上来说,只是一个文本文件,可以说是一个program的雏形。经过预处理器的预处理,得到Hello.i(预编译文件),Hello.i又被编译为Hello.o(目标文件),而Hello.o文件再经过汇编器翻译,得到Hello.s,成为了机器语言命令汇编文件,最后通过链接器进行链接,才能得到可执行文件hello,这个hello通过shell运行最终得到一个进程Process。

 

图 1-1 编译系统

       020From Zero-0 to Zero-0

      程序本身从虚无中走来,当程序员敲下第一个字母,它便逐渐成型。从最开始的Hello.c文件成型,经历上述P2P过程,最终得到属于自己的进程、内存和CPU时间周期,走向自己的辉煌。在一切落幕后,进程终止,Hello又被回收,删除上下文,释放所有它占有的资源。这个从虚无到存在再次走向虚无的过程就是020。

1.2 环境与工具

硬件工具:X64 I7 CPU,8G RAM,521G SSD

软件工具:Windows10 64位,Vmware 16,Ubuntu 20.04

开发者与调试工具:gcc,gdb,edb,vim,ld,readelf,objdump

1.3 中间结果

中间结果文件名

文件作用

Hello.i

预处理后的文件

Hello.s

编译后的汇编文件

Hello.o

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

Hello

连接后的可执行文件

Hello_o.elf

Hello.o的ELF格式

Hello.elf

Hello的ELF格式

Hello_o_ass.txt

Hello.o的反汇编代码

Hello_ass.txt

Hello的反汇编代码

1.4 本章小结

       本章对Hello.c文件的执行总流程进行了简要概述,解释了P2P和020的概念,随后阐明了实验中的软硬件条件,列出了实验中会用到的中间文件和它们的作用。

第2章 预处理

2.1 预处理的概念与作用

  1. 概念

程序设计领域中,预处理一般是指在程序源代码被翻译为目标代码的过程中,生成二进制代码之前的过程。这个过程并不对程序的源代码进行解析,但它把源代码分割或处理成为特定的单位。预处理器(CPP)根据以字符#开头的命令,修改原始的C程序,从而得到另一个C程序,通常以Hello.i命名。

  1. 作用
  1. 处理头文件

对于本程序来说,6-8行存在代码#include <stdio.h>、#include <unistd.h>、#include <stdlib.h>,预处理器会据此读取系统的头文件,并将它们直接插入程序文本中

  1. 处理宏定义

对于源代码中存在的#define,对所有引用到define的程序语句进行宏替换,使用实际值替换使用宏定义处的符号。

  1. 处理条件编译

是根据某类条件进行代码静态编译的手段,可通过表达式的值是否满足要求或某个宏是否被定义来判断编译条件。比如,#ifdef和#if命令等。

  1. 处理特殊符号

预处理器(CPP)可以识别一些特殊符号,并在后续过程中进行合适的替换。例如#error命令。

  1. 删除注释

2.2在Ubuntu

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值