程序生命的旅程:从预处理到执行

3星 · 超过75%的资源 需积分: 9 7 下载量 50 浏览量 更新于2024-07-16 1 收藏 4.77MB DOCX 举报
"1180300403-王心雷-计算机系统大作业.docx" 这篇文档是关于计算机系统大作业的详细报告,主题是“程序人生-Hello’sP2P”,作者通过剖析一个简单的C语言程序Hello.c,深入浅出地解释了计算机系统如何将源代码转化为可执行程序的过程。该程序经历了预处理、编译、汇编和链接四个主要阶段,每一个阶段都在计算机系统的管理下有序进行。 预处理阶段,是程序生命周期的起点。在这个阶段,预处理器处理宏定义、条件编译指令以及包含的头文件,生成预处理后的.i文件。预处理器的作用在于扩展源代码中的特殊指令,使其更适合编译器处理。 编译阶段,预处理后的代码被转换成汇编代码,这一过程由编译器完成。在Ubuntu环境下,通常使用gcc命令进行编译。编译器会检查源代码的语法,优化代码,并生成中间的汇编代码文件.o。 汇编阶段,汇编器将编译后的汇编代码转化为机器语言,生成可重定位的目标文件,即.o文件。这个阶段涉及到指令的翻译和符号表的管理,使得代码更接近硬件可执行的形式。 链接阶段,链接器将多个.o文件(包括系统库)合并成一个可执行文件,解决程序中的外部引用,生成最终的可执行文件hello。链接器还会进行地址重定位,确保程序在内存中的正确布局。动态链接则是在程序运行时加载必要的库文件,使程序能够使用这些库提供的功能。 在计算机系统中,程序的执行涉及到进程管理。Hello.c被加载到内存中,形成一个进程,操作系统负责为其分配资源,如内存空间,调度其执行。当程序运行时,可能会涉及到I/O操作,如标准输入输出,这时计算机系统会协调缓存、内存、磁盘等存储设备的工作,保证数据传输的高效性。如果程序出现错误,系统会调用异常处理程序进行诊断和恢复。 此外,文档还提到了shell(如bash)在进程启动和管理中的作用,例如通过fork和execve系统调用来创建和执行新的进程。异常和信号处理是进程运行中不可或缺的一部分,它们帮助程序对错误和特定事件作出响应。 这份大作业详尽地阐述了从源代码到程序执行的全过程,揭示了计算机系统如何支持程序运行的底层机制,对于理解计算机系统的工作原理具有极大的价值。
2023-05-25 上传
Last revision date: 13 December 2020. Last revision date: 13 December 2020. 计算机操作系统作业 1.为什么要配置层次式存储器? 在计算机执行时,几乎每一条指令都涉及对存储器的访问,因此要求对存储器的访问速度能跟得上处理机的运行速度。或者说,存储器的速度必须非常快,能与处理机的速度相匹配,否则会明显的影响到处理机的运行。此外还要求存储器具有非常大的容量,而且存储器的价格还应很便宜。对于这样十分严格的三个条件,目前是无法同时满足的。于是正在现代计算机系统中都无一例外的采用了多层结构的存储器系统。 2.可采用哪几种方式将程序装入内存它们分别适用于何种场合 (1)绝对装入方式 当计算机系统很小,且仅能运行单道程序时,完全有可能知道程序将驻留在内存的什么位置。此时可以采用绝对装入方式。用户程序编译后,将产生绝对地址的目标代码。 (2)可重定位装入方式 绝对装入方式只能将目标模块装入到内存中事先指定的位置,这只适用于单道程序环境。而在多道程序环境下,编译程序不可能预知经编译后所得到的目标模块应放在内存的何处。因此,对于用户程序编译所形成的若干个目标模块,它们的起始地址通常都是从0开始的,程序中的其他地址也都是想对于起始地址计算的。此时,不可能再采用绝对装入方式,而应采用可重定位装入方式,他可以根据内存的具体情况将装入模块装入到内存的适当位置。 (3)动态运行时的装入方式 可重定位装入方式可将装入模块装入到内存中任何允许的位置,故可用于多道程序环境,但该方式并不允许程序运行时在内存中移动位置。因为,程序在内存中的移动,意味着它的物理位置发生了变化,这时必须对程序和数据的地址(绝对地址)进行修改后方能运行。然而,实际情况是,在运行过程中他在内存中的位置肯能经常要改变。动态运行时的装入程序在把装入模块装入内存后,并不立即把装入模块中的逻辑地址转换为物理地址,而是把这种地址转换推迟到程序真正要执行时才进行。因此,装入内存后的所有地址都仍然是逻辑地址。 3.何谓静态链接静态链接时需要解决两个什么问题 在程序运行之前,先将各目标模块及他们所需的库函数链接成一个完整的装配模块,以后不再拆开,我们把这种事先进行链接的方式称为静态链接方式。 需要解决的两个问题是: 对相对地址进行修改。 变换外部调用符号。 4.何谓装入时动态链接装入时动态链接方式有何优点 这是指将用户源程序编译后所得到的一组目标模块,再装入内存时,采用边装入边链接的链接方式。即在装入一个目标模块时,若发生一个外部模块调用事件,将引起装入程序去找出对应的外部目标模块,并将它装入内存。 装入时动态链接方式有以下优点: 便于修改和更新。采用动态链接方式,由于各目标模块是分开存放的,所以要修改或更新个目标模块是件非常容易的事。 便于实现对目标模块的共享。再采用静态链接方式时,每个应用模块都必须含有其目标模块的拷贝,无法实现对目标模块的共享。但采用装入时动态链接方式时,OS就很容易将一个目标模块链接到几个应用模块上,实现多个应用程序对该模块的共享。 5.何谓运行时动态链接运行时动态链接有何优点 在许多情况下,应用程序在运行时,每次要运行的模块可能都是不相同的。但由于事先无法知道本次要运行哪些模块,故只能是将所有可能要运行到的模块全部都装入内存,并在装入时全部链接在一起,显然这是低效的,因为往往会有部分目标模块根本就不运行。近几年流行起来的运行时动态链接方式,是对上述装入时链接方式的一种改进。这种链接方式是,将对某些模块的链接推迟到程序执行时才进行。亦即,在执行过程中,当发现一个被调用模块尚未装入内存时,立刻由OS去找到该模块,将之装入内存,将其链接到调用者模块上,这样不仅能加快程序的装入过程,而且可节省大量的内存空间。 6.在动态分区分配方式中,应如何将各空闲分区链接成空闲分区链? 为了实现对空闲分区的分配和链接,在每个分区的起始部分设置一些用于控制分区分配的信息,,以及用于链接各分区所用的前向指针,在分区尾部则设置一后向指针。通过前、后向链接指针,可将所有的空闲分区链接成一个双向链。为了检索方便,在分区尾部重复设置状态位和分区大小表目。当分区被分配出去以后,把状态位 "0"改为"1",此时,前、后向指针已无意义。 7.为什么要引入动态重定位如何实现 在动态运行时装入的方式中,作业装入内存后的所有地址仍然都是相对(逻辑)地址。而将相对地址转换为绝对(物理)地址的工作被推迟到程序指令要真正执行时进行。为使地址的转换不会影响到指令的执行速度,必须有硬件地址变换机构的支持,即须在系统中增设一个重定位寄存器,用它来存放数据在内存中的起始地址。程序在执行时,真正访问的内存地址是相对地址与重定位寄存器中的地址相加而形成的。地址变换过程