哈工大计算机系统

计算机系统

大作业

题     目  程序人生-Hellos P2P  

专       业        计算机            

学     号         120L022309       

班   级        2003009                

学       生         孙浩翔   

指 导 教 师           吴锐     

计算机科学与技术学院

2021年5月

摘  要

本论文旨在研究 hello 在 linux 系统下的整个生命周期。结合 CSAPP 课本, 通过 gcc 等工具进行实验,从而将课本知识落实、融会贯通,通过一个程序深入 挖掘知识点,对于学生对于课程的理解以及知识的升华有很大帮助

关键词:CSAPP;HIT;大作业;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:

  1. Program:在editor中输入代码之后得到hello.c程序
  2. Process:hello.c(在Linux中),经过过cpp的预处理、ccl的编译、as的汇编、ld的链接最终成为可执目标程序hello。在 shell 中键入启动命令后,shell 为其 fork,产生子进程。

图1 编译过程

020:

    1. shell为hello进程execve,映射虚拟内存,进入程序入口后程序开始载入物理内存。
    2. 进入 main 函数执行目标代码,CPU为运行的hello分配时间片执行逻辑 控制流。
    3. 当程序运行结束后,shell父进程负责回收hello进程,内核删除相关数据 结构。

1.2 环境与工具

硬件环境:AMD Ryzen 5 5600H with Radeon Graphics 3.30 GHz,16G RAM,256G SSD.

软件环境:Ubuntu20.04.4 

开发与调试工具:vim,gcc,as,ld,edb,readelf,HexEdit,VSCODE

1.3 中间结果

列出你为编写本论文,生成的中间结果文件的名字,文件的作用等。

文件名

功能

hello.i

预处理之后的文本文件

hello.s

编译之后的汇编文件

hello.o

汇编之后可重定位目标执行文件

hello.elf

链接之后的可执行目标文件

hello.asm

测试程序代码

hello2.elf

测试程序

hello2.asm

hello.o的反汇编文件

1.4 本章小结

本章主要简单介绍了 hello 的 p2p,020 过程,列出了本次实验信息:环境、中间结果


第2章 预处理

2.1 预处理的概念与作用

预处理步骤是指程序开始运行时,预处理器(cpp,C Pre-Processor,C预处理器)根据以字符#开头的命令,修改原始的C程序的过程。例如,hello.c文件6到8行中的#include 命令会告诉预处理器读取系统头文件stdio.h,unistd.h,stdlib.h 的内容,并把这些内容直接插入到程序文本中。用实际值替换用#define定义的字符串。除此之外,预处理过程还会删除程序中的注释和多余的空白字符。预处理通常得到另一个以.i作为拓展名的C程序

2.2在Ubuntu下预处理的命令

在VSCODE中进行预处理:

图2 预处理结果

2.3 Hello的预处理结果解析

在VScode中打开hello.i,发现hello.i已经拓展到3060行,main方法出现在3047行

图3 main代码

在这之前出现的分别是三个库文件,CPP先删除指令#include <stdio.h>,并到Ubuntu系统的默认的环境变量中寻找 stdio.h,最终打开路径中的stdio.h文件。若stdio.h文件中使用了#define语句,则按照上述流程继续递归地展开,直至所有#define语句都被解释替换掉为止。除此之外,CPP还会进行删除程序中的注释和多余的空白字符等操作,并对一些值进行替换

2.4 本章小结

本章主要介绍了预处理的定义与作用、并结合预处理之后的程序对预处理结果进行了解析。
第3章 编译

3.1 编译的概念与作用

编译程序所要作得工作就是通过词法分析和语法分析,在确认所有的指令都符合语法规则之后,将其翻译成等价的中间代码表示或汇编代码。通过编译过程,编译器将文本文件 hello.i 翻译成汇编语言文件 hello.s,在hello.s中,以文本的形式描述了一条条低级机器语言指令。

编译分为7个部分:

  1. 词法分析:词法分析的任务是对由字符组成的单词进行处理,从左至右逐个字符地对源程序进行扫描,产生一个个的单词符号,
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值