csapp深入理解计算机系统大作业

摘 要
本文从hello.c的一生入手,利用Ubuntu下的操作工具,介绍了它的诞生,即计算机系统是如何将一个文本文件转化为可执行文件的;运行,即可执行文件在计算机底层的实现逻辑,包括如何被加载到进程中,进程的上下文切换,参数的保存形式以及如何利用系统级I/O实现输入输出交互等。最后hello被回收,结束了它的一生,本文也就完整地梳理了计算机系统这门课程要教给我们的知识。
关键词:hello.c的一生,Ubuntu,计算机系统

(摘要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简介
hello程序生命周期是从一个源文件开始的,即程序员通过文本编辑器创建并保存的文本文件,命名为hello.c。

P2P:Program to Process

Program:利用编辑器键入代码得到hello.c程序

Process:hello.c经过cpp的预处理,得到.i文件;再经过ccp编译,得到.s文件;再经过as汇编,得到.o文件;最后经过ld得链接,hello.c最终变成了可执行目标文件。在shell中键入启动命令./hello后,shell会为其fork产生子进程。

020: From Zero to Zero

shell为前面产生的hello进程调用execve,映射虚拟内存,进入程序入口后载入物理内存。进入main函数执行代码,代码执行完毕后,shell父进程回收hello进程,内核删除相关数据结构。

1.2 环境与工具
列出你为编写本论文,折腾Hello的整个过程中,使用的软硬件环境,以及开发与调试工具。
硬件环境:X86CPU;2.4GHZ;8GB RAM;512GB SSD
软件环境:Windows10 ;VMware Workstation pro 15.5;Ubuntu 20.04
开发与调试工具:visual studio2015;codeblocks;edb;
1.3 中间结果
预处理后的文本文件:hello.i
编译后的文本文件:hello.s
汇编后的二进制文件:hello.o
链接后的可执行(二进制)文件:hello
hello.o的ELF格式:helloo.elf
hello的ELF格式:hello.elf
hello.o的反汇编代码:obj_o.txt
hello的反汇编代码:obj_hello.txt
1.4 本章小结
本章对hello的一生进行了简要的概括,简单说明了P2P,020的含义即过程,声明了实验过程中涉及到的硬件、软件环境和开发工具。总体展示了实验过程中产生的中间结果文件。

第2章 预处理
2.1 预处理的概念与作用
概念:
预处理阶段,预处理器(cpp)根据以字符#开头的命令,修改原始的C程序。预处理指令将引用的所有库展开合并成为一个完整的文本文件,一般被用来使源代码在不同的执行环境中被方便地修改或编译。

作用:
1.将源文件中用#include 形式声明的文件复制到新的程序中。比如 hello.c 第 6-8 行中的#include<stdio.h> 、#include <unistd.h> 、#include <stdlib.h>命令告诉预处理器读取系统头文件 stdio.h unistd.h stdlib.h 的内容,并把它直接插入到程序文本中。
2.用实际值替换用#define定义的字符串
3.根据#if 后面的条件决定需要编译的代码
4.删除所有的注释
5.特殊符号,预编译程序可以识别一些特殊的符号, 预编译程序对于在源程序中出现的这些串将用合适的值进行替换。

预处理的结果是产生另一个C程序,通常是以.i作为文件扩展名。
2.2在Ubuntu下预处理的命令
在控制台输入命令:gcc -E hello.c -o hello.i

2.3 Hello的预处理结果解析
打开hello.i文件,可以看到整个程序的规模达到了3060行,文件开始部分是头文件stdio.h unistd.h stdlib.h的依次展开。

对stdio.h的展开进行举例说明,找到.i文件中对应部分

根据其提供的地址,可以看到cpp 到Ubuntu 中默认的环境变量下寻找 stdio.h,根据路径/usr/include/stdio.h打开文件。

可以看到其中的内容包含#define、#include开头的命令,cpp会继续对其进行递归展开。对于#ifdef #ifndef 条件编译的语句, cpp 会对条件值进行判断来决定是否执行包含其中的逻辑。同时,预编译程序可识别一些特殊的符号,预编译程序对在源程序中出现的这些串将用合适的值进行替换。

2.4 本章小结
本章主要介绍了预处理的概念及功能,包括对头文件进行展开、宏替换、条件编译、删除注释。利用Ubuntu下控制台对实验提供的hello.c文件进行了预处理,并对产生的hello.i文件以及预处理过程进行了分析。

第3章 编译
3.1 编译的概念与作用
概念:
编译是指将预处理后的高级语言文本代码转化为中间代码或汇编代码的过程。程序会通过词法分析、语法分析确认所有的指令都符合语法规则,再通过语义分析确定语句是否真正有意义,最终将其转化为汇编代码。

作用:
1.判断代码的词法(如关键字、标识符、运算符等)和语法(语言的语法规则)是否合法。
2.判断代码语句是否有意义,如两个指针做乘法运算就是没有实际意义的。
3.产生中间代码。有一些在编译期间就能确定的值,会被直接确定。
4.代码优化,如选择合适的寻址方式、优化乘除法、删除多余的指令等。
5.产生目标代码,此处指将高级语言文本代码和产生的中间代码转化为汇编代码。

3.2 在Ubuntu下编译的命令
命令:gcc -S hello.i -o hello.s

3.3 Hello的编译结果解析
3.3.1文件声明

所有以‘.'开头的行都是指导汇编器和链接器工作的伪指令。如.file 指示源文件名、.align指示对齐方式、.globl指示全局变量、 .type指定是对象类型或是函数类型等。

3.

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值