哈工大计算机系统大作业——程序人生-Hello’s P2P

计算机系统

大作业

 题          目 程序人生-Hellos P2P  

专          业    计算机科学与技术    

学             120L022401          

班          级        2003008              

学          生         鲁懿丹                

指 导 教 师          吴锐                  

计算机科学与技术学院

2021年5月

 

摘  要

关键词:hello程序;预处理;编译;汇编;链接;操作系统OS;进程管理;存储管理;I/O管理;计算机系统;Linux                            

目  录

第1章 概述

1.1 Hello简介

1.2 环境与工具

1.3 中间结果

1.4 本章小结

第2章 预处理

2.1 预处理的概念与作用

2.2在Ubuntu下预处理的命令

2.3 Hello的预处理结果解析

2.4 本章小结

第3章 编译

3.1 编译的概念与作用

3.2 在Ubuntu下编译的命令

3.3 Hello的编译结果解析

3.4 本章小结

第4章 汇编

4.1 汇编的概念与作用

4.2 在Ubuntu下汇编的命令

4.3 可重定位目标elf格式

4.4 Hello.o的结果解析

4.5 本章小结

第5章 链接

5.1 链接的概念与作用

5.2 在Ubuntu下链接的命令

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

5.4 hello的虚拟地址空间

5.5 链接的重定位过程分析

5.6 hello的执行流程

5.7 Hello的动态链接分析

5.8 本章小结

第6章 hello进程管理

6.1 进程的概念与作用

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

6.3 Hello的fork进程创建过程

6.4 Hello的execve过程

6.5 Hello的进程执行

6.6 hello的异常与信 处理

6.7本章小结

第7章 hello的存储管理

7.1 hello的存储器地址空间

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

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

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

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

7.6 hello进程fork时的内存映射

7.7 hello进程execve时的内存映射

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

7.9动态存储分配管理

7.10本章小结

第8章 hello的IO管理

8.1 Linux的IO设备管理方法

8.2 简述Unix IO接口及其函数

8.3 printf的实现分析

8.4 getchar的实现分析

8.5本章小结

结论

附件

参考文献


第1章 概述

1.1 Hello简介

根据Hello的自白,利用计算机系统的术语,简述Hello的P2P,020的整个过程。

(1)P2P:

From Program to Progress,从程序到进程Linux环境下,Hello一开始是一段储存在磁盘上的程序文本hello.c(Program),经过cpp预处理得到文本hello.i;然后经过ccl编译得到汇编语言程序hello.s;再经过as汇编得到可重定位目标程序hello.o;最后经过ld链接得到可执行目标程序hello。这时,在Shell中输入./hello命令启动程序,Shell调用fork函数创建子进程(Process),实现从程序到进程。

(2)020:

From Zero-0 to Zero-0,从无而终。Shell接着调用execve函数进行加载,运行hello需要CPU为hello分配时间片、内存,以便执行逻辑控制流;由OS进行存储管理,CPU访问相关数据需要MMU实现虚拟地址到物理地址的转换,其中TLB、四级页表、三级cache等可以加速转换,从而加速访问过程;系统的进程管理使hello可以实现切换上下文,shell的信 处理程序使hello在运行过程中可以处理各种信 。当hello运行结束后,父进程回收hello,删除相关数据。这样就实现了赤条条来去无牵挂,从Zero-0到Zero-0

1.2 环境与工具

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

1.2.1 硬件环境

X64 CPU;2.3GHz;16G RAM;256GHD Disk

1.2.2 软件环境

Windows 11 64位

1.2.3 开发工具

VirtualBox 6.1.32;Ubuntu 20.04 LTS 64位;Visual Studio 2019 64位;CodeBlocks 64位;vi/vim/gedit+gcc

1.3 中间结果

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

中间结果文件

文件作用

hello.c

源程序文件

      hello.i

预处理后生成的文件

      hello.s

编译后生成的汇编语言程序

      hello.o

汇编后生成的可重定位目标程序

      hello_o_asm.txt

hello.o的反汇编文件

      hello_o_elf.txt

hello.o的ELF文件格式

      hello

链接后生成的可执行目标程序

      hello_asm.txt

hello的反汇编文件

      hello_elf.txt

hello的ELF文件格式

1.4 本章小结

本章概述了hello的一生介绍了hello从编译生成加载执行再到终止回收P2P、020的全过程,并且列出了本次实验的软硬件环境及工具,最后列出了从hello.c到hello的过程中生成的中间文件及作用


第2章 预处理

2.1 预处理的概念与作用

预处理的概念:

预处理一般是指在程序源代码被翻译为目标代码的过程中,生成二进制代码之前的过程。典型地由预处理器(preprocessor)对程序源代码文本进行处理,得到的结果再由编译器核心进一步编译。这个过程并不对程序的源代码进行解析,但它把源代码分割或处理成为特定的单位——用C/C++的术语来说是)预处理记 (preprocessing token)用来支持语言特性(如C/C++的宏调用)

预处理的作用:

预处理过程扫描源代码,对其进行初步转换,结果得到另一个C程序,通常是以.i作为文件扩展名,具体作用如下:

(1)头文件展开:预处理器搜索以字符#开头的命令,通过将预处理指令替换为实际代码中的内容,来修改原始C程序,例如#include<stdio.h>是预处理指令,是包含头文件的操作,将所包含头文件的指令替换为实际内容,同时如果头文件中包含了其他头文件,也需要将头文件展开;

(2)处理宏定义:预处理器读入源代码,对源代码中所有使用宏定义的地方使用符 表示的实际值替换定义的符 ;

(3)处理条件编译指令:条件编译指令如#ifdef,#else,#endif等,这些伪指令的引入使程序员可以通过定义不同的宏来决定编译程序对哪些代码进行处理。预处理将根据有关文件,将不必要的代码过滤掉;

(4)删除程序中的注释和多余的空白字符;

(5)处理特殊符 :预处理可以对程序中出现的特殊符 例如FILE、#error等用合适的值替换。

2.2在Ubuntu下预处理的命令

预处理的命令:gcc -E hello.c -o hello.i

                                           图2.1Ubuntu下预处理的命令

2.3 Hello的预处理结果解析

图2.2Hello的预处理结果图

Hello预处理得到.i文件,打开后发现将.c的代码扩展到了3060行。

头文件展开:#include “file name”;#include <file name>;#include 记 序列。预处理时,源文件中的这些行将被替换为由文件名指定的文件内容,hello.c的头文件有stdio.h, unistd.h , stdlib.h

图2.3头文件展开的部分截图

删除程序主体段的注释信息如下:

                                        图2.4删除主体段的注释信息对比

由于源程序中不存在宏定义#define;条件编译指令#if#endif特殊符 等,因此该部分不做展示

2.4 本章小结

本章介绍了在预处理过程中预处理器的工作头文件展开处理宏定义、处理条件编译指令、删除程序中的注释和多余的空白字符、处理特殊符 等并在Ubuntu对hello.c进行预处理最后展示解析处理结果。

第3章 编译

3.1 编译的概念与作用

编译的概念:

编译的作用:

生成的汇编语言程序每条语句都以一种文本格式描述了一条低级机器指令,汇编语言为不同的高级语言的不同编译器提供了通用的输出语言,汇编语言相对于预处理文件更利于机器理解。除此之外,编译程序还具备语法检查、调试措施、修改手段、覆盖处理、目标程序优化、不同语言合用以及人际联系等重要功能。

3.2 在Ubuntu下编译的命令

编译命令:gcc -S hello.i -o hello.s

                                             图3.1Ubuntu下编译的命令

3.3 Hello的编译结果解析

                                                图3.2Hello的编译结果图

编译得到.s文件,最开始以.开头的行都是指导汇编器和链接器工作的伪指令:

.file “hello.c”(源文件名)

.text(代码段)

.section .rodata(只读代码段)

.align 8(8字节对齐方式)

.LC0:

.string “347224250346263225: Hello 345255246345217267 345247223345220215 347247222346225260357274201″(字符串)

.LC1:

.string “Hello %s %sn”(字符串)

.text(代码段)

.globl main(全局变量名)

.type main, @function(指出是对象类型或是函数类型)

下面说明编译器是如何处理C语言的各个数据类型以及各类操作的:

3.3.1数据

3.3.1.1常量

①数字常量:大多是以立即数的形式出现在汇编代码中,例如if(argc!=4)中的4;exit(1)中的1;for(i=0;i<8;i++)中的8(这里编译器将<8翻译为≤7)。

图3.3if(argc!=4)中的4     图3.4exit(1)中的1       图3.5for(i=0;i<8;i++)中的8

②字符串常量:在printf等函数中出现的字符串常量存储在.rotate段。

图3.6字符串常量的存储情况

3.3.1.2变量

①全局变量、静态变量:该程序没有全局变量和静态变量,所以在hello.s的伪指令中没有.data和.bss,但是存在.rodata只读数据节,这是用来存放printf的字符串的,在上面字符串常量中已提到,不再赘述。

②局部变量:局部变量存储在栈中或直接存储在寄存器中,共三个局部变量:i、argc、argv:

图3.7局部变量i存储在栈中-4(%rbp)位置

图3.8局部变量argc表示程序输入变量的个数,存储在栈中-20(%rbp)位置 

图3.9局部变量argv是

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年4月16日
下一篇 2022年4月16日

相关推荐