深入理解计算机系统:从预处理到进程管理

需积分: 11 0 下载量 22 浏览量 更新于2024-06-29 收藏 2.47MB DOCX 举报
"哈工大CSAPP大作业" 这篇哈工大的计算机系统应用实践(CSAPP)大作业,主要探讨了源代码从高级语言到可执行文件的生命周期,以及执行过程中涉及的关键步骤,如预处理、编译、汇编、链接和进程管理。学生通过分析一个名为"Hello"的示例程序,深入理解了这些概念。 首先,预处理是程序开发的初始阶段,它负责处理源代码中的宏定义、条件编译指令等,将其转化为标准C语言形式。在Ubuntu环境下,这通常通过`cpp`命令完成。预处理结果是.i文件,其中包含了所有预处理指令的扩展。 接着,编译阶段将预处理后的代码转换为汇编语言。在这个过程中,编译器检查语法并生成相应的汇编代码。在Ubuntu中,我们使用`gcc -S`命令进行编译,得到的中间结果是.s文件。编译器还负责优化代码以提高效率。 汇编阶段将汇编代码转换为机器码,这是一个更接近硬件的过程。在Ubuntu中,使用`as`命令将.s文件转换为可重定位的目标文件(.o文件),这是以ELF(Executable and Linkable Format)格式存在的。此阶段还涉及到符号表的生成,用于后续链接阶段的引用解析。 链接阶段将多个目标文件和库函数合并成单一的可执行文件。`gcc -o`命令在这里扮演关键角色,它不仅连接目标文件,还将动态库与之关联,解决符号引用,并为程序分配内存地址。链接器还会进行重定位,确保程序在内存中的正确布局。 在进程管理部分,作业详细讲解了进程的创建、执行以及管理。这里,以fork()系统调用创建新进程,然后用execve()替换子进程的地址空间,使得子进程开始执行新的程序(Hello)。同时,讨论了进程异常和信号处理,这些都是操作系统确保程序正确执行的重要机制。 最后,存储管理部分探讨了程序在内存中的布局,包括逻辑地址、线性地址和物理地址的转换。在Intel处理器中,采用了段式和页式存储管理来实现地址映射,确保程序能够高效、安全地访问内存。 这份大作业全面覆盖了计算机系统的基础原理,从源代码的翻译到程序的执行,再到内存管理和进程控制,为学生提供了深入理解计算机系统运作的宝贵实践。