【无标题】hello程序人生

摘  要

从对hello的预处理,汇编,链接和hello的进程管理,存储管理,IO分析,展现了程序的具体实现过程和计算机系统的工作原理

关键词:hello;编译;汇编;链接;进程;存储……;                           

(摘要0分,缺失-1分,根据内容精彩称都酌情加分0-1分

目  录

第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.写好的hello.c程序经过预处理器预处理后得到hello.i文件,再经过编译器编译后生成hello.s文件,汇编器再将hello.s翻译成机器语言指令,得到hello.o文件,最后经过链接器链接得到可执行文件hello.通过shell输入执行hello的命令后,进程管理就fork一个子进程。

020:from Zero to Zero.shell为刚fork的子进程execve,映射虚拟内存。然后程序开始载入物理内存,CPU为程序分配时间片执行逻辑控制流。执行阶段把这个程序分解成几个阶段,分别执行对应的指令,最后输出字符串。输出的字符串通过主存、寄存器,最后显示到屏幕上。当程序运行结束后,父进程回收hello,删除相关数据,shell等待下个指令输入。

1.2 环境与工具

列出你为编写本论文,折腾Hello的整个过程中,使用的软硬件环境,以及开发与调试工具。

硬件环境:AMD Ryzen 7 5800H with Radeon Graphics            3.20 GHz

          RAM 16.0 GB

软件环境:Windows 11  ;ubuntu-20.04.6-desktop-amd64.iso

调试工具:Codeblocks gedit,gcc,notepad++,readelf, objdump, hexedit, edb

1.3 中间结果

hello.i     预处理文件

hello.s     汇编语言文件

hello.o    可重定位目标文件

hello      可执行目标文件

hello.elf    hello.o的elf格式文件

hello1.elf   hello的elf格式文件

1.4 本章小结

简述了hello的P2P,020的过程。调试环境。

(第1章0.5分)

第2章 预处理

2.1 预处理的概念与作用

预处理一般是指在程序源代码被翻译为目标代码的过程中,生成二进制代码之前的过程。

主要作用就是把通过预处理的内建功能对一个资源进行等价替换。

2.2在Ubuntu下预处理的命令

gcc -E hello.c -o hello.i

2.3 Hello的预处理结果解析

预处理结果:内容增多。

解析:#include展开,并加入了程序文本。

2.4 本章小结

    介绍了预处理生成.i文件的过程

(第2章0.5分)

第3章 编译

3.1 编译的概念与作用

预处理.i文件到.s文件;

将.i文件进行语法分析,翻译为汇编程序文件

3.2 在Ubuntu下编译的命令

gcc -S helo.i -o hello.s

3.3 Hello的编译结果解析

数据分析:

①变量

hello.c程序main函数中定义局部变量i;

编译器将它存入栈中

②数组

在main函数参数中出现char指针数组;

编译处理将其存储到栈中

③立即数

立即数以$加数字的形式直接出现在汇编代码中

④字符串

赋值

赋值操作通过mov指令实现

算术操作

类似的i++操作使用add进行操作

关系操作

在hello.c中涉及到两处关系操作

图3.3.4.1 关系

在汇编代码中使用cmp进行比较

 控制转移指令

两次输出字符串,而编译处理时,因为字符串被提前声明,所以输出时使用控制转移

其中第一条,若argc==4则跳转至L2,即不进入该条件

  • 若小于等于7,则跳转至L4,即进入循环

函数操作

hello.c中包含main()函数,并且调用了printf()、exit()、sleep(),使用call调用

Printf()

Exit()

Sleep(0

3.4 本章小结

    本章说明了编译的概念和作用,并且阐述了编译器将预处理后得到的hello.i文件进一步翻译为存储在hello.s中的汇编语言的过程。

(第32分)

第4章 汇编

4.1 汇编的概念与作用

将.i文件翻译为机器语言指令,.o文件,即可重定位目标程序文件,翻译成机器语言指令后机器可以直接读取分析。

4.2 在Ubuntu下汇编的命令

Gcc -c hello.s -o hello.o

4.3 可重定位目标elf格式

    指令:readelf -h hello.o     查看ELF头

指令: readelf -s hello.o    查看ELF节

指令:readelf -r hello.o    查看重定位信息

4.4 Hello.o的结果解析

区别:

(1)操作数

在hello.s中为十进制

在反汇编中为十六进制

(2)地址表示

在hello.s中为”L2”等段名称

在反汇编中为相对偏移地址

图4.4.4 地址表示(2)

(3)函数调用

在hello.s中为函数名

在反汇编中是调用函数的相对偏移地址

(4)全局变量访问

hello.s上通过“.LC1(%rip)”的形式访问

反汇编中以“0x0()%rip”的形式访问

4.5 本章小结

汇编操作将汇编语言转化为机器语言

(第41分)

5章 链接

5.1 链接的概念与作用

链接是将各种代码和数据片段收集并组合成一个单一文件的过程,这个文件可被加载(复制)到内存并执行。将工程的各个部分合整为大工程。

5.2 在Ubuntu下链接的命令

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

指令:readelf -a hello

ELF头:

文件格式:EXEC 可执行目标文件

节数:27

节头:可知各段的基本信息

[19] .dynamic          DYNAMIC          0000000000403e50  00002e50

       00000000000001a0  0000000000000010  WA       7     0     8

  [20] .got              PROGBITS         0000000000403ff0  00002ff0

       0000000000000010  0000000000000008  WA       0     0     8

  [21] .got.plt          PROGBITS         0000000000404000  00003000

       0000000000000048  0000000000000008  WA       0     0     8

  [22] .data             PROGBITS         0000000000404048  00003048

       0000000000000004  0000000000000000  WA       0     0     1

  [23] .comment          PROGBITS         0000000000000000  0000304c

       000000000000002b  0000000000000001  MS       0     0     1

  [24] .symtab           SYMTAB           0000000000000000  00003078

       00000000000004c8  0000000000000018          25    30     8

  [25] .strtab           STRTAB           0000000000000000  00003540

       0000000000000158  0000000000000000           0     0     1

  [26] .shstrtab         STRTAB           0000000000000000  00003698

       00000000000000e1  0000000000000000           0     0     1

5.4 hello的虚拟地址空间

    使用edb加载hello,查看本进程的虚拟地址空间各段信息,并与5.3对照分析说明。  

虚拟地址从0x00401000开始

5.5 链接的重定位过程分析

指令:objdump -d -r hello

分析:hello汇编代码中地址与引用数据的地址也确定,汇编代码中出现了_init,.plt,puts@plt,printf@pl函数。

在重定位过程中,链接器将符号解析完成,将代码中的所有符号引用与一个符号定义关联。链接器按照各个内容的具体大小重定位,合并输入模块,为每个符号分配运行时的地址。

5.6 hello的执行流程

_start ();

__libc_start_main@plt ();

__libc_csu_init ();

_init ();

frame_dummy ();

register_tm_clones ();

main ();

puts@plt ();

exit@plt ();

__do_global_dtors_aux ();

deregister_tm_clones ();

_fini ();

 5.7 Hello的动态链接分析

动态链接库中的函数在程序执行的时候才会确定地址,所以编译器无法确定其地址。为避免运行时修改调用模块的代码段,链接器采用延迟绑定的策略。延迟绑定通过两个数据结构之间简洁但又有些复杂的交互来实现,即过程链接表(PLT)和全局偏移量表(GOT)。

    过程链接表(PLT):PLT是一个数组,其中每个条目是16字节代码。PLT [0]是一个特殊条目,它跳转到动态链接器中。每个被可执行程序调用的库函数都有它自己的PLT条目。每个条目都负责调用一个具体的函数。每个条目都负责调用一个具体的函数。

全局偏移量表(GOT):GOT是一个数组,其中每个条目是8字节地址。和PLT联合使用时,GOT [0]和GOT [1]包含动态链接器在解析函数地址时会使用的信息。GOT [2]是动态链接器在1d-linux.so模块中的入口点。其余的每个条目对应于一个被调用的函数,其地址需要在运行时被解析。每个条目都有一个相匹配的PLT条目。

通过节头目表可知,hello的.got.plt段的起始位置是0x404000,使用edb查看

调用前的内容:

调用后的内容:

5.8 本章小结

  本章中主要介绍了链接的概念与作用,并且详细阐述了hello.o是怎么链接成为一个可执行目标文件的过程,详细介绍了hello.o的ELF格式和各个节的含义,并且分析了hello的虚拟地址空间、重定位过程、执行流程、动态链接过程。详细了解了重定位过程以及用edb进行动态链接的分析,在最后对hello进行了动态链接分析。

(第51分)

6章 hello进程管理

6.1 进程的概念与作用

进程是一个执行中的程序的实例。系统中的每个程序都运行在某个进程的上下文中。

进程为用户提供了这样的假象,我们的程序好像是系统中当前运行的唯一程序一样,我们的程序好像是独占的使用处理器和内存,处理器好像是无间断地执行我们程序中地指令,我们程序中的代码和数据好像是系统内存中唯一的对象。

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

shell是用户和Linux内核之间的接口程序。在提示符下输入的每个命令都由shell先解释然后传给Linux内核。可以调用其他程序,给其他程序传递数据和参数,并且获取程序的处理结果。同时可以在多个程序之间传递数据,把一个程序的输出作为另外一个程序的输入。并且shell本身也可以被其他程序进行调用。

   流程:

(1)从终端读入输入的命令。

(2)将输入字符串切分,分析输入内容,解析命令和参数。

(3)如果命令为内置命令则立即执行,如果不是内置命令则创建新的进程调用相应的程序执行。

(4)在程序执行期间始终接受键盘输入信号,并对输入信号做相应处理。

6.3 Hello的fork进程创建过程

运行hello程序,调用fork()函数创建子进程。通过fork函数,子进程得到与父进程用户级虚拟地址空间相同但独立的一份副本,包括代码和数据段、堆、共享库、用户栈。hello进程还获得与父进程任何打开文件描述符相同的副本,这就意味着当父进程调用fork时,子进程还可以读写父进程中打开的任何文件。父进程和新创建的子进程之间最大的区别在于它们有不同的PID。

6.4 Hello的execve过程

  子进程创建后,shell调用execve函数加载并运行可执行目标文件hello,且带参数列表argv和环境变量列表envp。之后当出现错误时,例如找不到hello,execve才会返回到调用程序。

在execve加载了hello后,它调用启动代码,启动代码设置栈,并将控制转移给新程序的主函数main,此时用户栈已经包含了命令行参数和环境变量,进入main函数后开始逐步运行程序。

6.5 Hello的进程执行

从hello进程进入内核;

内核进行上下文切换,执行和hello并发的其他进程;

Sleep休眠时间结束;

并发进程进入内核;

内核进行上下文切换,继续执行hello进程。

6.6 hello的异常与信号处理

异常:中断、陷阱、故障、终止

信号:SIGSTP、SIGCONT、SIGKILL、SIFGINT等。

中断是来自I/O设备的信号,异步发生,中断处理程序对其进行处理,返回后继续执行调用前待执行的下一条代码,就像没有发生过中断。

陷阱是有意的异常,是执行一条指令的结果,调用后也会返回到下一条指令,用来调用内核的服务进行操作。帮助程序从用户模式切换到内核模式。

故障是由错误情况引起的,它可能能够被故障处理程序修正。如果修正成功,则将控制返回到引起故障的指令,否则将终止程序。

终止是不可恢复的致命错误造成的结果,处理程序会将控制返回给一个abort例程,该例程会终止这个应用程序。

1.程序运行时,随意输入: 程序不受影响

2.程序运行途中ctrl+c:程序终止

3.程序运行途中ctrl+z: 程序挂起

4.在ctrl+z之后fg:程序继续

5.程序运行中ctrl+z,kill: 程序被杀死

6.程序运行ctrl+z,ps查看信息:程序挂起

6.7本章小结

本阶段通过在hello运行过程中执行各种操作,了解了与系统相关的若干概念、函数和功能。

(第61分)

7章 hello的存储管理

7.1 hello的存储器地址空间

逻辑地址:逻辑地址指的是机器语言指令中,用来指定一个操作数或者是一条指令的地址,即程序的机器代码中保存的地址。

线性地址(也叫虚拟地址):现代系统提供了一种对主存的抽象概念,叫做虚拟内存。使用虚拟寻址,CPU通过生成一个虚拟地址来访问主存,这个虚拟地址在被送到内存之前先转换为适当的物理地址。

物理地址:物理地址是用于内存芯片级的单元寻址,与处理器和CPU连接的地址总线相对应。

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

一个逻辑地址由两部分组成,段标识符和段内偏移量。段标识符是由一个16位长的字段组成,称为段选择符。其中前13位是一个索引号。后面3位包含一些硬件细节。可以通过段标识符的前13位,直接在段描述符表中找到一个具体的段描述符,这个描述符就描述了一个段。一些全局的段描述符,就放在“全局段描述符表(GDT)”中,一些局部的,例如每个进程自己的,就放在所谓的“局部段描述符表(LDT)”中。

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

使用虚拟寻址,CPU通过生成一个虚拟地址来访问主存,这个虚拟地址被送到内存之前首先转换为适当的物理地址。将一个虚拟地址转换为物理地址叫做地址翻译,需要CPU硬件和操作系统之间的紧密合作。CPU芯片上叫做内存管理单元(MMU)的住哪用硬件,利用主存中的查询表来动态翻译虚拟地址。

虚拟地址作为到磁盘上存放字节的数组的索引,磁盘上的数组内容被缓存在主存中。同时,磁盘上的数据被分割成块,这些块作为磁盘和主存之间的传送单元。虚拟内存分割被成为虚拟页。物理内存被分割为物理页,物理页和虚拟页的大小是相同的。

同任何缓存一样,虚拟内存系统必须用某种方法来判定一个虚拟页是否缓存在DRAM中的某个地方。如果是,系统还必须确定这个虚拟页存放在哪个物理页中。如果不命中,系统必须判断这个虚拟页存放在磁盘的哪个位置,在物理内存中选择一个牺牲页,并将虚拟页从磁盘复制到DRAM,替换这个牺牲页。

页表是一个存放在物理内存中的数据结构,将虚拟页映射到物理页。每次地址翻译硬件将一个虚拟地址转换为物理地址时读取页表。操作系统负责维护页表中的内容,以及再磁盘与DRAM之间来回传送页。

内存分页管理的基本原理是将整个内存区域划分成固定大小的内存页面。程序申请使用内存时就以内存页位单位进行分配。转换通过两个表,页目录表PDE(也叫一级目录)和二级页表PTE。进程的虚拟地址需要首先通过其局部段描述符变换为CPU整个线性地址空间中的地址,然后再使用页目录表和页表PTE映射到实际物理地址上。

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

Core i7 MMU 使用四级的页表将虚拟地址翻译成物理地址。36位VPN 被划分成四个9 位VPN,分别用于一个页表的偏移量。

CPU产生虚拟地址VA,VA传送给MMU,MMU使用前36位VPN作为TLBT+TLBI向TLB中匹配,如果命中,则得到40位PPN+12位VPO组合成52位物理地址PA。如果没有命中,MMU向页表中查询,CR3确定第一级页表的起始地址,9位VPN1确定在第一级页表中的偏移量,查询出第一部分PTE,以此类推最终在四级页表都访问完后获得PPN,与VPO结合获得PA,并向TLB中更新。

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

得到物理地址之后,先将物理地址拆分成CT(标记)+CI(索引)+CO(偏移量),然后在一级cache内部找,如果未能寻找到标记位为有效的字节(miss)的话就去二级和三级cache中寻找对应的字节,找到之后返回结果。

7.6 hello进程fork时的内存映射

Shell通过fork函数为hello创建新进程,当fork函数被当前进程调用时,内核为新进程创建各种数据结构,并分配给它一个唯一的PID。为了给这个新进程创建虚拟内存,它创建了当前进程的mm_struct、区域结构和页表的原样副本。它将两个进程中的每个页面都标记为只读,并将两个进程中的每个区域结构都标记为私有的写时复制。

7.7 hello进程execve时的内存映射

删除已存在的用户区域,创建新的区域结构,代码和初始化数据映射到.text和.data区(目标文件提供),.bss和栈映射到匿名文件,设置PC,指向代码区域的入口点。

7.8 缺页故障与缺页中断处理

DRAM 缓存不命中称为缺页,即虚拟内存中的字不在物理内存中。缺页导致页面出错,产生缺页异常。缺页异常处理程序选择一个牺牲页,然后将目标页加载到物理内存中。最后让导致缺页的指令重新启动,页面命中。

7.9动态存储分配管理

在程序运行时程序员使用动态内存分配器(如malloc)获得虚拟内存。动态内存分配器维护着一个进程的虚拟内存区域,称为堆。分配器将堆视为一组不同大小的块的集合来维护,每个块要么是已分配的,要么是空闲的。分配器的类型包括显式分配器和隐式分配器。前者要求应用显式地释放任何已分配的块,后者在检测到已分配块不再被程序所使用时,就释放这个块。

动态内存管理的策略包括首次适配、下一次适配和最佳适配。首次适配会从头开始搜索空闲链表,选择第一个合适的空闲块。搜索时间与总块数(包括已分配和空闲块)成线性关系。会在靠近链表起始处留下小空闲块的“碎片”。下一次适配和首次适配相似,只是从链表中上一次查询结束的地方开始。比首次适应更快,避免重复扫描那些无用块。最佳适配会查询链表,选择一个最好的空闲块,满足适配,且剩余最少空闲空间。它可以保证碎片最小,提高内存利用率。

7.10本章小结

    本章介绍了hello的存储地址和存储空间,说明了虚拟内存相关知识,展示了各种地址表示的一步步转化,模拟了系统内部的一部分操作。(第7 2分)

8章 hello的IO管理

8.1 Linux的IO设备管理方法

所有的IO设备都被模型化为文件,而所有的输入和输出都被当做对相应文件的读和写来执行,这种将设备优雅地映射为文件的方式,允许Linux内核引出一个简单低级的应用接口,称为Unix I/O。

设备的模型化:文件

设备管理:unix io接口

8.2 简述Unix IO接口及其函数

1)打开文件。一个应用程序要求通过内核打开相应的文件,来宣告它想要访问一个I/O设备。

(2)Linux shell创建的每个进程开始时都有三个打开的文件:标准输入、标准输出和标准错误。

(3)改变当前的文件位置。对于每个打开的文件,内核保持着一个文件位置k,初始为0。这个文件位置是从文件开始的字节偏移量。应用程序能够通过执行seek操作,现显式地设置文件的位置为k。

(4)读写文件。一个读操作就是从文件复制 n>0 个字节到内存,从当前文 件位置 k 开始,然后将 k 增加到 k+n,给定一个大小为 m 字节的而文 件,当 k>=m 时,触发 EOF。类似一个写操作就是从内存中复制 n>0 个字节到一个文件,从当前文件位置 k 开始,然后更新 k。

(5)关闭文件。当应用程序完成了对文件的访问后,它就通知内核关闭这个文件。作为响应,内核释放文件打开时创建的数据结构,并将这个描述符恢复到可用的描述符池中。

Unix IO函数:

(1)open:进程是通过调用open函数来打开一个已存在的文件或者创建一个新文件的。open将filename转换为一个文件描述符,并且放回描述符数字。

(2)close:进程通过调用close函数关闭一个打开的文件。关闭一个已关闭的描述符会出错。

(3)read:应用程序通过read函数来执行输入。read函数从描述符为fd的当前文件位置复制最多n个字节到内存位置buf。返回值-1表示一个错误;返回值0表示EOF;否则,返回值表示的是实际传扫的字节数量。

(4)write:应用程序通过write函数来执行输出。write函数从内存位置buf复制至多n个字节到描述符fd的当前文件位置。

8.3 printf的实现分析

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;

}

vsprintf的作用是格式化,按照格式fmt结合参数生成格式化之后的字符串。返回生成字符串的长度。从vsprintf生成显示信息,到write系统函数,到陷阱-系统调用 int 0x80或syscall等.

字符显示驱动子程序:从ASCII到字模库到显示vram(存储每一个点的RGB颜色信息)。

显示芯片按照刷新频率逐行读取vram,并通过信号线向液晶显示器传输每一个点(RGB分量)。

8.4 getchar的实现分析

以下格式自行编排,编辑时删除

异步异常-键盘中断的处理:键盘中断处理子程序。接受按键扫描码转成ascii码,保存到系统的键盘缓冲区。

getchar等调用read系统函数,通过系统调用读取按键ascii码,直到接受到回车键才返回。

8.5本章小结

本章主要介绍了 Linux 的 IO 设备管理方法、Unix IO 接口及其函数,分析了 printf 函数和 getchar 函数的实现。

(第81分)

结论

过程:hello.c通过预处理器将hello.c预处理成为文本文件hello.i;编译器将hello.i翻译成汇编语言文件hello.s;汇编器将hello.s汇编成可重定位二进制代码hello.o;链接器将外部文件和hello.o链接起来形成可执行二进制文件hello。shell通过fork和execve创建进程,然后把hello加载到其中。shell创建新的内存区域,并加载代码、数据和堆栈。hello在执行的过程中遇到异常,会接受shell的信号完成处理。hello在执行的过程中需要使用内存,那么就通过CPU和虚拟空间进行地址访问。

感悟:计算机的发展凝聚了很多前人的心血。

(结论0分,缺失 -1分,根据内容酌情加分)

附件

hello.c        源文件

hello.i         预处理文件

hello.s        汇编语言文件

hello.o               可重定位目标文件

hello           可执行目标文件

hello.elf      hello.o的elf格式文件

hello1.elf    hello的elf格式文件

(附件0分,缺失 -1分)

参考文献

为完成本次大作业你翻阅的书籍与网站等

[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.

(参考文献0分,缺失 -1分)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值