程序人生—Hello‘s P2p

守听  金牌会员 | 2025-2-12 20:59:23 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 871|帖子 871|积分 2613




计算机系统


大作业



题     目  程序人生-Hello’s P2P 

 






计算机科学与技术学院

2023年4月

摘  要


关键词:预处理、编译、汇编、链接、可实行文件、历程管理、存储管理、I/O
以hello程序从C文件如何变化为可实行文件的全过程为例,包括预处理、编译、汇编、链接阶段,如何对旧文件进行操作形成新文件的过程。深入了解hello历程在shell实行的过程,历程管理、存储管理的过程,I/O处理的过程。节奏这些过程的分析,了解程序与计算机的共同,深化对计算机系统的明白。






目  录


第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简介

根据Hello的自白,利用计算机系统的术语,简述Hello的P2P,020的整个过程。
一、P2P:预处理器(cpp)将源程序文本hello.c根据以#开头的命令,转换成修改了的源程序(仍为文本文件)hello.i,接着编译器(ccl)将文本文件hello.i翻译成一个包含汇编语言程序的文本文件hello.s,接下来汇编器(as)将hello.s翻译成呆板语言指令,指令打包成可重定位目的程序格式并保存在目的文件hello.o中(二进制文本),最后由链接器将多个可重定位目的程序(比方printf.o)与hello.o合成一个可实行文件hello,并存放在磁盘上。
然后为了在Unix系统上运行,将文件名输入到shall命令行表明器中,fork一个子历程,并用execve运行程序,最终天生一个历程。
      二、020:shell对其子历程调用execve函数,然后映射出假造内存(为每个历程提供一致的地点空间并保护其不被其他历程破坏的功能),并在程序开始运行时载入物理内存,运行中CPU为程序分配时间片实行逻辑控制流,程序结束时,父历程回收并释放子历程的程序数据与空间占用,最终实现程序实行的全过程。
1.2 环境与工具

硬件环境:X64 CPU;16CPUs;3.2GHz;16384MB RAM;BIOS J6CN40WW
软件环境:Windows11 64位;Codeblocks;Ubantu 16.04 LTS 64位
开发与测试工具:gcc,vim,edb/gdb,readelf等
1.3 中间结果

列出你为编写本论文,天生的中间结果文件的名字,文件的作用等。
      hello.c:程序源代码
      hello.i:预处理之后得到的修改了的文本文件
      hello.s:编译器编译后得到的汇编语言文本文件
      hello.o:汇编器天生的可重定位目的文件(二进制文件)
      hello:  链接得到的可实行目的文件(二进制文件)
      hello_elf1:可重定位文件天生的elf格式文件
      hello_elf2:可实行文件天生的elf格式文件
      asm1.txt: 可重定位文件反汇编天生的汇编语言文本文件
      asm2.txt: 可实行文件反汇编天生的汇编语言文本文件
1.4 本章小结

介绍了hello程序天生到运行的过程,了解实验环境及实验所需天生的文件,介绍了hello的p2p和020的过程和程序实行时的中间结果。


第2章 预处理

2.1 预处理的概念与作用

预处理的概念:
预处理(预编译),是预处理器(cpp)以字符#开头的命令,修改原始的C程序,最终天生.i文件的过程。
预处理的作用:
预处理的主要作用是将头文件中的内容插入(“include”格式包含的文件)到源文件中同时根据宏定义在源程序中进行替换(用“#define”定义的字符串)不带参数的宏定义就是在作用区间内简单的字符串替换,而带参数的宏定义还要在此底子上进行参数的替换。删除表明。
2.2在Ubuntu下预处理的命令

在命令行中输入gcc -E -o hello.i  hello.c实现预处理


2.3 Hello的预处理结果解析

Hello.c 文件:

Hello.i:


查看hello.i的信息,发现在hello.i文件中把宏定义展开成extern FILE *()形式
将声明内容加入到源文件,并且表明内容已经被删除。
2.4 本章小结

介绍了预处理阶段的概念和作用,对hello.c程序进行了预处理,通过hello.i深入了解了预处理的结果和洽处,探究了预处理阶段的机制。







第3章 编译

3.1 编译的概念与作用

概念:编译器(ccl)将预处理后的文本文件.i文件翻译成文本文件.s文件,即转化为汇编指令的过程,汇编指令可以将逻辑一致的代码转化为统一形式。编译过程中可以进行语法的检查、中间代码的天生、源程序的优化。
作用:把高级语言程序翻译成便于呆板明白的低级呆板指令同时编译时一些指令可以被简化和优化。
3.2 在Ubuntu下编译的命令


3.3 Hello的编译结果解析

输入gcc -S hello.i -o hello.s对hello.i进行编译得到汇编语言文件hello.s ,天生的hello.s文件如下:
 

3.3.1 数据
1、全局变量:
.globl :声明全局变量,这两个全局变量分别是字符串"用法: Hello 学号 姓名 秒数!\n"和"Hello %s %s\n"


argc:存储-20(%rbp)   argv[]:在-32(%rbp)。 i:在-4(%rbp)在每次循环中更新。

2、立刻数:常量表示形式为$数字:

3、局部变量:局部变量存储在寄存器中,局部变量不够被寄存器存放时将其存放在栈中。

3.3.2赋值:
赋值通过movb、movw movl movq 来实现。
hello.c中的i=0在 hello.s中的部门利用movl,把0赋值给i。

3.3.3算数运算:
hello.c中的i++在hello.s中,利用addl,实现i的增加。

3.3.4 条件转移

hello.c中比较argc!=4并转移在 hello.s中:

hello.c比较i<5并跳转,在hello.s是:

3.3.5数组/指针/结构操作
对于数组/指针/结构的操作是通过基址地点偏移寻址的方式存取,偏移量的巨细基于对应变量巨细。
argc[]通过首地点+偏移量访问
addq $16,%rax表明为argc[2]
addq $8,%rax表明为argc[1]
addq $24,%rax表明为argc[3]

3.3.6 函数操作
main函数
参数argc存储在%edi;argv[]存储在%rsi。将存储返回值的寄存器%eax赋值为0,然后再返回。


printf函数 printf("Hello %s %s\n",argv[1],argv[2]);
调用函数

将LCO的地点传递给%rdi

Exit函数
参数传递:把1通过movl指令传递给%edi

Atoi函数
运用atoi函数按位操作转换类型,将%rax中的值传入%rdi中然后使用call指令调用函数,返回值被传入sleep函数中


Sleep函数;

将atoi的返回值传入%rdi中,使用call指令调用函数。
3.4 本章小结

本章介绍了编译的概念与作用。将hello.i编译成hello.s,并且对编译结果进行各个方面的分析,详细地了解了编译的过程和形式。
第4章 汇编

4.1 汇编的概念与作用

概念:把汇编语言翻译成呆板语言的过程,汇编的过程中把呆板语言指令天生可重定位目的程序,保存在hello.o中。
作用:汇编将汇编代码翻译成呆板可以明白的语言,用于天生可实行文件。
4.2 在Ubuntu下汇编的命令

gcc -m64 -no-pie -fno-PIC -c -o hello.o hello.s

4.3 可重定位目的elf格式

   readelf -a hello.o >helloref.txt

文件如图所示:

1、ELF头
   ELF头以一个16字节的序列开始的,这个序列形貌了天生该文件的系统的字的巨细和字节顺序。头以下的部门帮助链接器语法分析和表明目的文件信息。

2、节头


不同节的位置和巨细是由节头部表形貌
3程序头
没有

4重定位节:
重定位的节记录引用外部变量的信息

4.4 Hello.o的结果解析

指令:objdump -d -r hello.o > helloob.txt


反汇编文件中不仅有汇编语言另有呆板语言,我们可以发现一条汇编语言的实现对应这相应的呆板语言,两者可以相互转化。
数据:hello.s是十进制数而反汇编是16进制数。
函数调用:hello.s使用call指令调用函数,函数名称为目的,而在反汇编文件中函数调用是用下一条指令的相对地点偏移量给出的。
全局变量:hello.s是将全局变量值直接赋给寄存器(使用$.LC0、$.LC1给%edi赋值)但是在反汇编代码中,将可重定位文件重定位之后计算出全局变量的地点,赋值给寄存器。
分支转移:hello.s中的跳转指令跳转到代码内部。而反汇编中的跳转指令跳转到详细的存储地点。
4.5 本章小结

了解了汇编这一过程的概念与作用, 将hello.s汇编得到hello.o文件,同时得到hello.o的ELF可重定位目的文件hello_o_elf.txt,和反汇编得到文件。通过对比分析,深入地探究了汇编的全过程。

第5章 链接

5.1 链接的概念与作用

概念:链接是指将一个或多个由编译器或汇编器天生的目的文件外加库链接为一个可实行文件,即天生可实行文件的过程。
作用:作用是将.o文件与其他可重定位文件组合共同天生可实行文件,并到内存运行。

5.2 在Ubuntu下链接的命令

ld -o hello -dynamic-linker /lib64/ld-linux-x86-64.so.2 /usr/lib/x86_64-linux-gnu/crt1.o /usr/lib/x86_64-linux-gnu/crti.o hello.o /usr/lib/x86_64-linux-gnu/libc.so /usr/lib/x86_64-linux-gnu/crtn.o


5.3 可实行目的文件hello的格式

 readelf -a hello > hello1.elf


  • ELF头




  • 节头


程序头:






程序头部表用于形貌一种映射关系,可实行文件的连续片被映射到连续的内存段。






Dynamic section:在偏移量为0x2e50的位置,包含21个条目。它是可实行文件新增的内容。



重定位节:可实行文件动态链接时还会须要重定位信息。


符号表:符号表有51个条目


5.4 hello的假造地点空间

程序在0x400000~0x401000段中载入。并且从0x400000开始,顺序与hello的elf格式文件顺序相同。




5.5 链接的重定位过程分析

指令:objdump -d -r hello




链接器完成了符号解析,就把代码中的每个符号和一个符号的定义关联,此时知道代码节数据节简直切的巨细,链接器开始将全部相同类型的节合并为同一类型的新的聚合节,然后把代码节和数据节中对每个符号的引用修改,指向准确的地点,这一过程依靠于重定位条目基于汇编器碰到的最终位置未知的目的引用时天生的。
5.6 hello的实行流程

实行main、printf、_exit、_sleep、_getchar;最后退出。
start  0x4010f0
libc_start_main   0x2f12271d
main       0x401125
printf        0x401040
exit     0x401070
sleep  0x401080
getchar  0x401050
5.7 Hello的动态链接分析

   GOT[1]保存的是指向已经加载的共享库的链表地点。GOT[2]是动态链接器在ld-linux.so模块中的入口。过程链接表PLT和全局偏移量表GOT进行动态链接。GOT采用耽误绑定的策略。GOT中保存着下一条指令的地点。dl_init实行后,通过重定位确定函数地点。
查看hello_elf.txt文件可以得到GOT的起始位置为0x403ff0。再用edb查看.got的内容。






比较可知,0x403ff0之后发生了变化,即全局偏移量表GOT[1]和GOT[2]的内容发生了变化。
5.8 本章小结

介绍了链接的过程。以hello.o链接后形成了hello可实行文件为例,对可实行文件的格式进行分析、hello的假造地点空间、hello的动态链接分析并通过反汇编hello文件,将其与hello.o反汇编文件进行了对比,详细了解了重定位过程。

第6章 hello历程管理

6.1 历程的概念与作用

概念:历程是操作系统对正在运行的程序的一种抽象,历程的定义是具有独立功能的一个程序关于数据集合的一次运行活动。历程会提供一种系统上好像只有某一个程序在运行,而且该程序看上去是独占地使用处理器、主存、I/O设备,该程序的代码和数据是系统内存中唯一的对象的假象。
作用:历程提供程序独占地使用处理器并且可以独占内存的假象。

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

作用:Shell-bash读取用户命令行,串联用户与内核,可以通过该界面访问操作系统内核。
处理流程:

  • 从命令行中读取用户输入
  • 解析命令行,检查第一个参数是否是一个内置的shell命令。
3、如果是内置命令,立刻表明,如果不是,创建子历程,实行程序。
6.3 Hello的fork历程创建过程

在终端输入./+可实行文件名,shell检查该命令是否为内置命令。判断出其为可实行文件后,shell将会调用fork创建一个新的子历程,然后在这个子历程中调用execve函数进入要实行的程序。
6.4 Hello的execve过程

调用函数fork创建新的子历程,会调用execve函数运行可实行目的文件hello。如果有错误,execve返回到调用程序。起首对可实行文件进行检查,删除当前用户假造地点中的已存在地区结构,并将堆栈初始化为0,为代码、数据和栈地区映射创建私有地区,并在写入时进行复制。设置程序计数器,下次运行时能从代码地区入口进入。
6.5 Hello的历程实行

shell接收到可实行文件的实行命令,fork函数创建一个子历程调用execve函数在现在历程的上下文中运行刚才的可实行文件。删除子历程现有的假造内存,并创建一块新的空间。然后,通过将假造地点空间中的页映射到可实行文件的页,代码段和数据段都会被设置为可实行文件的内容。运行调用printf函数,历程酿成内核模式,在printf函数实行完后返回到用户模式,然后调用sleep函数,内核进行上下文切换,调用其他历程运行,计数器记录休眠时间,计时器计到1s时,系统发生中断转换到hello历程原先运行的位置,将先前记录的历程重新放入运行队列中实行。之后调用getchar函数,进入内核模式,再进行上下文切换,运行其它历程,当数据传输结束,发生中断,重新回到hello历程,最后返回终止运行。
6.6 hello的异常与信号处理

中断
中断是处理器外部的I/O设备的信号的结果,中断处理程序运行,进行到下一条指令。
陷阱
陷阱是故意的异常,是实行一条指令的结果,返回到下一条指令。
故障
故障是由错误环境引起的,当故障发生时,是利器将控制转移给故障处理程序,如果错误环境可以修正,则将控制返回到引起故障指令,重新实行,否则处理程序返回到内核abort,终止故障的应用程序。
空格:历程不会被打断。

回车:历程回收。

输入Ctrl C:终止并回收hello历程。

输入Ctrl z:显示提示信息并挂起hello历程

使用ps可以查看历程的根本信息

使用jobs:查看历程状态

使用pstree:可以查看历程树

                                                                                                                                          
使用fg:重新运行


6.7本章小结

介绍了hello的历程管理。了解了历程的概念和应用,然后查询了shell-bash的作用与处理流程,fork历程创建过程和execve函数运行过程,hello的实行,hello的异常与信号处理。


第7章 hello的存储管理

7.1 hello的存储器地点空间

逻辑地点:汇编程序中地点。逻辑地点由选择符和偏移量组成。

假造地点:CPU通过假造地点来访问主存,这个假造地点在被送到主存前先转换成得当的物理地点,并与物理地点一一对应。

物理地点:在存储器里以字节为单位存储信息,每一个字节单元给以一个唯一的存储器地点,称为物理地点。

线性地点:逻辑地点经过段机制后转化为线性地点,为形貌符:偏移量的组合形

7.2 Intel逻辑地点到线性地点的变换-段式管理
段式管理:是指将一个程序分为若干个段进行储存和管理,每个段都是一个实体。8086共设计了20位宽的地点总线,通过将段寄存器左移4位加上偏移地点得到20位地点,这个地点就是逻辑地点。将内存分为不同的段,段有段寄存器对应,段寄存器有一个栈寄存器、一个代码寄存器、两个数据寄存器。
7.3 Hello的线性地点到物理地点的变换-页式管理

系统将每个段分割成假造页的巨细固定的快来作为数据传输单元,假造内存系统中MMU负责地点翻译,MMU使用存放在物理内存中的被称为页表的数据结构将假造页到物理页的映射,即假造地点到物理地点的映射。
7.4 TLB与四级页表支持下的VA到PA的变换

TLB:每次CPU产生一个假造地点,MMU就必须查阅相应的PTE,每次都必然造成缓存不命中等一系列时间开销,为了消除这样的开销,MMU中存在一个全相联高速缓存,称为TLB。
四级页表:如果只须要使用的假造内存很小,但仍然须要一个十分巨大的页表,造成了内存的浪费,或者在某些环境页表会变得十分巨大。所以假造地点到物理地点的转换过程中还存在多级页表的机制:上一级的页表映射到下一级页表,直到页表映射到假造内存。
7.5 三级Cache支持下的物理内存访问

物理地点被分为CT(标记)+CL(索引)+CO(偏移量),然后到1级cache里去找对应的标记位为有效的。若找不到再到2级,3级cache里去找对应的字节,找到后返回,若找不到,则启动替换策略,将新的条目逐级替换插入。
7.6 hello历程fork时的内存映射

父历程创建了本身的儿子历程之后,内核为新生儿历程分配唯一一个PID用以标识身份,然后子历程继续了与父历程当前完全一致的在假造内存中的副本
7.7 hello历程execve时的内存映射

将.text,.data,.bss都加载到假造地点空间之中。
7.8 缺页故障与缺页中断处理

若未分配状态则发生了缺页,先要根据捐躯策略决定一个捐躯页,然后进行页替换。
7.9动态存储分配管理

根本方法与策略:通过维护假造内存(堆),一种是隐式空闲链表,一种是显式空闲链表。显式空闲链表法是malloc(size_t size)每次声明内存空间都包管至少分配size_t巨细的内存,双字对齐,每次必须从空闲块中分配空间,在申请空间时将空闲的空间碎片合并,以尽量减少浪费。
7.10本章小结

假造内存使得程序的调用更加私密,也使得物理空间得到了最大利用。也使得每个历程都有一个本身的假造空间,让历程运行的更加效率。
第8章 hello的IO管理

8.1 Linux的IO设备管理方法

Linux中的I/O设备被表示为文件,输入输出用文件的读和写来实行
设备的模子化:文件
设备管理:unix io接口
8.2 简述Unix IO接口及其函数

打开文件:int open(char *filename, int flags, mode_t mode);
关闭文件:int close(int fd);
读文件: ssize_t read(int fd, void *buf, size_t n);
写文件: ssize_t write(int fd, const void *buf, size_t n);
8.3 printf的实现分析

https://www.cnblogs.com/pianist/p/3315801.html
从vsprintf天生显示信息,到write系统函数,到陷阱-系统调用 int 0x80或syscall.
字符显示驱动子程序:从ASCII到字模库到显示vram(存储每一个点的RGB颜色信息)。
显示芯片按照革新频率逐行读取vram,并通过信号线向液晶显示器传输每一个点(RGB分量)。
int printf(const char fmt, …)
{
int i;
char buf[256];
va_list arg = (va_list)((char)(&fmt) + 4);
i = vsprintf(buf, fmt, arg);
write(buf, i);
return i;
}
8.4 getchar的实现分析

异步异常-键盘中断的处理:键盘中断处理子程序。接受按键扫描码转成ascii码,保存到系统的键盘缓冲区。
getchar等调用read系统函数,通过系统调用读取按键ascii码,直到接受到回车键才返回。
int getchar(void)
{
char c;
return (read(0,&c,1)==1)?(unsigned char)c:EOF
}
8.5本章小结

本章简述了Linux的I/O设备管理机制,Unix I/O接口及函数,并扼要分析了printf函数和getchar函数的实现

结论

回顾hello运行,预处理器将.c文件中的宏定义与库先一步处理好天生.i文件,编译器将预处理完的源码转换成了汇编代码,完成了高级语言向低级语言的转化,
汇编器将汇编代码转化为二进制呆板代码。链接器将上述天生的可重定位文件链接后天生可实行文件。在shell中运行Hello,先fork后execve,访问内存以及可能出现的异常处理后Hello真正的运行了。
hello.c 源文件
hello.i 预处理后的文件
 hello.s 编译后的文件
hello.o 可重定位文件
hello.elf可重定位文件的ELF
hello 连接后的可实行文件
hellol.elf 可实行文件的ELF








参考文献

为完本钱次大作业你翻阅的册本与网站等

[1]  林来兴. 空间控制技术[M]. 北京:中国宇航出版社,1992:25-42.
[2]  辛希孟. 信息技术与信息服务国际研讨会论文集:A集[C]. 北京:中国科学出版社,1999.
[3]  赵耀东. 新时代的工业工程师[M/OL]. 台北:天下文化出版社,1998 [1998-09-26]. http://www.ie.nthu.edu.tw/info/ie.newie.htm(Big5).
[4]  谌颖. 空间交会控制理论与方法研究[D]. 哈尔滨:哈尔滨工业大学,1992:8-13.
[5]  KANAMORI H. Shaking Without Quaking[J]. Science,1998,279(5359):2063-2064.
[6]  CHRISTINE M. Plant Physiology: Plant Biology in the Genome Era[J/OL]. Science,1998,281:331-332[1998-09-23]. http://www.sciencemag.org/cgi/ collection/anatmorp.



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

守听

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表