计统大作业 Hello‘s P2P

计算机系统

大作业

题     目  程序人生-Hello’s P2P 

专       业                                  

学     号                              

班     级                              

学       生                         

指 导 教 师                           

计算机科学与技术学院

2023年5月

摘  要

摘要是论文内容的高度概括,应具有独立性和自含性,即不阅读论文的全文,就能获得必要的信息。摘要应包括本论文的目的、主要内容、方法、成果及其理论与实际意义。摘要中不宜使用公式、结构式、图表和非公知公用的符号与术语,不标注引用文献编号,同时避免将摘要写成目录式的内容介绍。

本文描述了在Linux系统下,,从hello源文件开始,到程序运行结束的全过程。

关键词:Linux,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章 概述

(0.5分)

1.1 Hello简介

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

P2P:首先写好hello的源代码,经cpp预处理之后得到hello.c文件,再经过编译、汇编得到hello.s文件,再通过链接生成hello可执行文件;shell调用fork函数创建一个子进程,hello成为一个进程。

020:运行hello程序后,由shell加载到虚拟内存,进入程序,载入物理内存后执行main函数。待程序执行结束后进程终止,父进程回收子进程。

1.2 环境与工具

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

硬件环境:

处理器:11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz   2.30 GHz

机带RAM:16.0 GB (15.7 GB 可用)

系统类型:64 位操作系统, 基于 x64 的处理器

GPU:NVIDIA GeForce RTX 3050 Laptop GPU

软件环境:Windows 10  Vmware16上的Ubuntu(64位)虚拟机

开发工具:vim文本编辑器  Visual Studio  EDB  Vscode  Gcc编译器

调试工具:GDB

1.3 中间结果

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

  1. hello.i文件:cpp预处理后得到的文件。
  2. hello.s文件:编译器将.i为后缀的文件编译成汇编文件。
  3. hello.o:汇编器把以.s为后缀的汇编文件转为机器语言,变成可重定位的目标文件。
  4. hello:连接器将对应库中的函数与hello.o链接,生成为可执行目标文件。

1.4 本章小结

在本章,我们介绍了hello的P2P和020两大过程,并了解了一个源程序经过预处理、编译、汇编、链接后得到一个可执行目标文件。

随后我们大致列举了实验的环境和工具,以及从hello.c到hello的过程中的所有中间文件。

第2章 预处理

(0.5分)

2.1 预处理的概念与作用

预处理是C语言编译过程中的第一个阶段,它的作用是在编译之前对源代码进行一些处理,以便于后续的编译和链接。

预处理器会扫描源代码中的预处理指令,如#include、#define、#ifdef等,并根据这些指令对源代码进行处理。预处理器的处理结果是一个新的源代码文件,其中包含了所有的预处理指令被替换成的实际代码。

预处理器的主要作用有:

1. 头文件包含:通过#include指令将其他头文件包含到源代码中,以便于使用头文件中定义的函数、变量和宏。

2. 宏定义:通过#define指令定义宏,以便于在源代码中使用宏来代替一些常量或表达式,从而简化代码。

3. 条件编译:通过#ifdef、#ifndef、#else和#endif指令实现条件编译,以便于根据不同的条件编译不同的代码。

4. 注释处理:预处理器会删除源代码中的注释,以便于减小编译后的代码大小。

预处理器的处理结果会被编译器进一步处理,生成汇编代码、目标文件和最终的可执行文件。预处理器是C语言编译过程中非常重要的一个阶段,它可以帮助程序员简化代码、提高代码的可读性和可维护性。

2.2在Ubuntu下预处理的命令

2.3 Hello的预处理结果解析

打开hello.i文件之后,与源文件相比内容增加很多,预编译指令消失,对应库文件的内容被插入到预处理文件中。

文件最后的hello.c源代码,基本上保持不变。

2.4 本章小结

本章我们介绍了预处理的概念和作用,通过指令得到了预处理之后的hello.i文件,了解了预处理的方式和作用。

第3章 编译

2分)

3.1 编译的概念与作用

注意:这儿的编译是指从 .i 到 .s 即预处理后的文件到生成汇编语言程序

编译的概念:编译是将编译器(ccl)将文本文件.i(C语言)翻译成文本文件.s(汇编语言)。

编译的作用是将高级语言代码转换为计算机可以理解和执行的低级机器语言代码,从而使计算机能够执行程序。编译器还可以检查代码中的错误和警告,并生成可执行文件或库,以便其他程序可以使用它们。编译器还可以执行优化,以提高代码的性能和效率。编译器是软件开发过程中不可或缺的一部分,它可以帮助开发人员更快地开发高质量的软件。

3.2 在Ubuntu下编译的命令

应截图,展示编译过程!

3.3 Hello的编译结果解析

3.3.1 数据

Printf中的格式字符串,变量有argc、argv、i三个。

变量i为局部变量,保存在堆栈;argv为main函数的参数,其中存放各个参数,argv[0]为文件路径,寄存器中保存;argc为main函数的参数,表示参数个数,存放在寄存器。

3.3.2 赋值:

mov指令给变量i赋初值为0.

3.3.3 算术运算:

循环中i+1;

3.3.4 比较操作:

cmpl指令实现if条件判断。

cmpl指令实现for循环。

3.3.5 数组、指针操作:

将数组首地址放入%rax寄存器中。

这段代码利用首地址调用了main函数的字符串。

3.3.7 函数操作:

Call指令调用函数。

 

 

       此部分是重点,说明编译器是怎么处理C语言的各个数据类型以及各类操作的。应分3.3.1~ 3.3.x等按照类型和操作进行分析,只要hello.s中出现的属于大作业PPT中P4给出的参考C数据与操作,都应解析

3.4 本章小结

       本章介绍了编译的概念和作用,我们通过指令得到了hello程序的汇编语言, 并对文件中的各种操作进行了解析。

第4章 汇编

2分)

4.1 汇编的概念与作用

       汇编语言是一种低级语言,它使用助记符来代替二进制指令,使得程序员可以更容易地编写和理解机器指令。汇编语言通常用于编写系统软件、驱动程序和嵌入式系统等需要高效性能和直接控制硬件的应用程序。

        汇编语言的作用是将高级语言编写的程序转换为机器语言,使计算机能够理解和执行程序。汇编语言还可以直接访问计算机的硬件资源,如内存、寄存器和输入输出设备等,从而实现对计算机的底层控制。此外,汇编语言还可以优化程序的性能,使得程序能够更快地执行。

4.2 在Ubuntu下汇编的命令

4.3 可重定位目标elf格式

分析hello.o的ELF格式,用readelf等列出其各节的基本信息,特别是重定位项目分析。

连接器在处理目标文件的时候,会对文件中的某些部分进行重定位。R_X86_64_PC32表示重定位PC相对寻址,R_X86_64_32是重定位绝对寻址。符号表中存放着源程序的全局变量等信息。重定义条目中描述了需要重定位的符号的位置、方式、偏移量、attend值等,根据这些信息可计算出重定位的位置。

4.4 Hello.o的结果解析

objdump -d -r hello.o  分析hello.o的反汇编,并请与第3章的 hello.s进行对照分析。

说明机器语言的构成,与汇编语言的映射关系。特别是机器语言中的操作数与汇编语言不一致,特别是分支转移函数调用等。

       机器语言是计算机可以直接执行的指令代码,它由二进制位组成,每个二进制位都只有两种状态,即0和1。机器语言的指令由操作码和操作数两部分组成。操作码指示计算机执行的操作类型,例如加法、减法、存储等,操作数则指定操作所涉及的数据或地址。

       在机器语言中,每个指令都有唯一的二进制表示形式,这些指令由CPU执行。机器语言的指令集通常由硬件架构的设计者定义,不同的CPU有不同的指令集。常见的机器语言包括汇编语言和机器指令集。汇编语言是机器语言的一种可读性更高的表达形式,它使用助记符号来代替二进制代码。机器指令集是机器语言的一种具体实现,它通常由硬件厂商提供,并与CPU硬件密切相关。

       机器语言与汇编语言的映射关系:汇编语言是机器语言的一种高级表示形式,它使用可读性更强的助记符号来代替机器语言的二进制代码。每条汇编语句都对应着一条机器指令,汇编指令的助记符号与对应的机器指令的操作码一一对应。

       不同:汇编语言中使用的是十进制,而反汇编是十六进制;汇编语言的分支转移是通过助记符,而反汇编是main+偏移到转移地址;机器语言和汇编语言是一对一的对应关系。

4.5 本章小结

       本章通过指令得到汇编的可重定位文件,还查看了反汇编的内容,比较了机器语言和汇编代码的关系,分析了反汇编和汇编的关系。

5章 链接

1分)

5.1 链接的概念与作用

       链接是将多个目标文件合并成一个可执行文件的过程。链接器是执行链接过程的程序,它将目标文件中的符号解析为实际的内存地址,并将它们组合成一个单独的可执行文件。

       链接的作用是将程序的各个部分组合在一起,使得程序能够正确地执行。在编写大型程序时,通常会将程序分成多个模块,每个模块编译成一个目标文件。链接器将这些目标文件合并成一个可执行文件,使得程序能够在计算机上运行。此外,链接还可以实现库文件的共享,减少程序的存储空间和加载时间。链接还可以进行符号重定位,使得程序能够在不同的内存地址上运行。

注意:这儿的链接是指从 hello.o 到hello生成过程。

5.2 在Ubuntu下链接的命令

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

分析hello的ELF格式,用readelf等列出其各段的基本信息,包括各段的起始地址,大小等信息。

可看出,hello文件为可执行文件,有25个节。

 

使用readelf -S hello指令获得节点的信息,包括各段的起始地址、大小等。

5.4 hello的虚拟地址空间

使用edb加载hello,查看本进程的虚拟地址空间各段信息,并与5.3对照分析说明。   

观察Data Dump窗口,发现虚拟地址从0x00400000到0x00401000,与5.3中的.init节相对照。

可看到一些printf函数的格式串。

5.5 链接的重定位过程分析

objdump -d -r hello 分析hello与hello.o的不同,说明链接的过程。

结合hello.o的重定位项目,分析hello中对其怎么重定位的。

objdump -d -r hellomain函数如下:

objdump -d -r hello.omain函数如下:

两相对比可知,hello较hello.o多出很多文件节,且call语句之后为正确的执行位置,而非下一条语句的位置。

链接的过程: 把编译好的目标文件和其他的一些目标文件和库链接在一起,形成最终的可执行文件。

重定位:链接器根据hello.o文件中重定位条目中重定位元素的类型的不同得到不同的偏移量,通过节偏移和重定位条目的地址就可以计算出重定位后的地址。重定位的类型分为相对寻址和绝对寻址两种。得到地址后链接源程序需要的其他库函数。

5.6 hello的执行流程

       使用edb执行hello,说明从加载hello到_start,到call main,以及程序终止的所有过程。请列出其调用与跳转的各个子程序名或程序地址。

       Hello程序先调用init函数初始化后执行main主函数,再依次调用printf、exit、atoi、sleep、getchar最后退出。

子程序名和地址:

0000000000400000 <_init>

0000000000400125 <main>

00000000004000f0 <_start>

0000000000400090 <puts@plt>

00000000004000a0 <printf@plt>

00000000004000b0 <getchar@plt>

00000000004000c0 <atoi@plt>

00000000004000d0 <exit@plt>

00000000004000e0 <sleep@plt>

5.7 Hello的动态链接分析

分析hello程序的动态链接项目,通过edb调试,分析在dl_init前后,这些项目的内容变化。要截图标识说明。

动态链接采用了延迟加载的策略,在调用函数时进行符号的映射。使用偏移量表GOT+过程链接表PLT实现函数的动态链接。GOT中存放函数目标地址,为每个全局函数创建一个副本函数,并将对函数的调用转换成对副本函数调用。

.got起始位置为0x600ff0,.got.plt起始位置为0x601000。

dl_init前:

dl_init后:

从运行结果可看出,GOT条目发生改变。

5.8 本章小结

本章介绍了链接的概念和作用,通过ld指令执行链接,得到elf文件。对比了hello和hello.o的反汇编代码,并用edb进行了动态链接分析。

6章 hello进程管理

1分)

6.1 进程的概念与作用

进程的概念:是操作系统管理和调度计算机资源的基本单位。它们使得计算机能够实现多任务处理,提高资源利用率,同时保护进程之间的数据和代码,确保系统的稳定性和可靠性。

进程的作用:提供了两个抽象:

(1)一个独立的逻辑流,提供程序独占使用处理器的抽象。

(2)一个私有的虚拟地址空间,提供程序独占使用整个系统内存的抽象。

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

Shell的作用:Shell是一种命令行解释器,是操作系统内核和用户之间的接口。它允许用户通过命令行输入指令来与操作系统交互,执行各种操作,如文件管理、进程管理、网络管理等。

Shell的处理流程可以分为以下几个步骤:

  1. 解析命令行:当用户在Shell中输入命令后,Shell首先会对命令行进行解析,将命令行划分为命令和参数。
  2. 查找命令:解析命令行后,Shell会查找要执行的命令。Shell通过PATH环境变量中指定的路径依次查找命令所在的可执行文件,如果找到了相应的文件,则执行它;否则,会提示“命令未找到”的错误信息。
  3. 执行命令:当Shell找到要执行的命令后,会将命令传递给操作系统内核执行。操作系统内核根据命令的类型和参数执行相应的操作,如创建进程、读写文件等。
  4. 处理输出:当命令执行完成后,Shell会将输出结果返回给用户。输出结果可以是标准输出、标准错误输出或者其他输出流。Shell会将输出流的内容输出到终端或者重定向到文件中。
  5. 等待下一个命令:当命令输出完成后,Shell会等待用户输入下一个命令。如果用户没有输入下一个命令,Shell会一直等待,直到用户终止Shell进程或者按下Ctrl+C等中断信号。

6.3 Hello的fork进程创建过程

Hello程序使用fork创建进程的过程:

1. 程序开始执行,调用fork系统调用创建一个新的进程。在调用fork之前,程序只有一个进程,即父进程。

2. 在fork系统调用返回之后,程序就有了两个进程,分别是父进程和子进程。这两个进程的代码和数据是相同的,但是它们有不同的进程ID(PID)。

3. 在父进程中,fork系统调用返回子进程的PID,可以通过该PID来控制子进程的执行。在子进程中,fork系统调用返回0,表示当前进程是子进程。

4. 父进程和子进程各自独立运行,在父进程中可以使用wait系统调用等待子进程执行完成,也可以使用其他的进程控制函数来控制子进程的执行。在子进程中,可以继续执行相同的代码,或者使用exec系列函数执行其他的程序,或者直接退出进程。

6.4 Hello的execve过程

Hello程序使用execve的过程:

  1. 程序开始执行,调用execve系统调用。在调用execve之前,程序只有一个进程。
  2. 在execve系统调用返回之后,程序的代码和数据被替换成另一个程序的代码和数据,当前进程变成了新程序的进程,原来的程序已经被完全替换,不再存在。
  3. 新程序开始执行,完成它的功能,然后退出进程。在退出进程之前,通常会使用exit系统调用设置退出码,以便父进程获取执行结果。

6.5 Hello的进程执行

以下格式自行编排,编辑时删除

结合进程上下文信息、进程时间片,阐述进程调度的过程,用户态与核心态转换等等。

进程调度是操作系统中非常重要的一部分,它负责决定哪个进程可以获得CPU的使用权,以及如何分配CPU时间片,从而实现进程之间的公平竞争和优先级控制。下面结合进程上下文信息、进程时间片,阐述进程调度的过程和用户态与核心态转换等内容。

在进程调度的过程中,操作系统会为每个进程维护一些上下文信息,包括进程的寄存器、内存映射、打开文件等状态。当一个进程需要使用CPU时,操作系统会将其上下文信息从内存中加载到CPU寄存器中,然后将CPU分配给该进程执行。当进程执行完成后,操作系统会将进程的上下文信息保存到内存中,以便在下次进程执行时能够恢复到之前的状态。

进程调度的过程涉及到多个因素,如进程的优先级、时间片、I/O等待等。操作系统会根据这些因素来选择下一个要运行的进程,并将CPU分配给它执行。当一个进程的时间片用完时,操作系统会将CPU从该进程中抢占出来,并将其上下文信息保存到内存中,然后选择下一个要运行的进程继续执行。这个过程被称为进程切换。

在进程调度和进程切换的过程中,用户态和核心态转换也是一个非常重要的环节。在用户态下,进程只能访问自己的内存空间和一些受限的资源,不能执行特权操作,如修改内核数据结构、访问硬件设备等。在核心态下,进程可以访问所有资源,执行所有特权操作。

当一个进程需要执行特权操作时,如访问硬件设备或修改内核数据结构时,操作系统会将该进程的特权级别从用户态提升到核心态,使其能够执行特权操作。这个过程被称为用户态和核心态的转换,也称为特权级别的转换。在转换时,操作系统会切换进程的特权级别,将进程的上下文信息从用户态切换到核心态,从而让进程能够执行特权操作。当特权操作执行完成后,操作系统会将进程的特权级别从核心态降低到用户态,将进程的上下文信息从核心态切换回用户态,让进程继续执行普通操作。

在Hello程序的进程执行过程中,操作系统会为程序创建一个进程,并将程序加载到进程的内存中执行。在执行过程中,操作系统会根据进程的优先级、时间片等因素来控制进程的执行顺序,并分配CPU时间片给进程执行。当进程需要执行一些特权操作时,如打开文件或输出到终端时,操作系统会将进程的特权级别从用户态提升到核心态,使其能够访问相应的资源。在特权操作执行完成后,操作系统会将进程的特权级别从核心态降低到用户态,让进程继续执行普通操作。

6.6 hello的异常与信号处理

hello执行过程中会出现哪几类异常,会产生哪些信号,又怎么处理的。

Hello程序可能会遇到的几类异常和相应的信号:

  1. 中断:处理器外I/O设备信号的结果,异步异常,总是返回到下一条指令
  2. 陷阱:一种有意的异常,使指令执行的结果,其最重要的用途是在用户程序和内核之间提供一个像过程一样的接口,称为系统调用。一般返回下一条指令。
  3. 由错误的情况引起,非有意。如果被故障处理程序修正,则重新执行;若不能被修正,则终止程序。
  4. 不可恢复的致命性错误。终止处理程序,并且不会控制返回给应用程序。

信号:

处理信号的方式可以通过使用signal函数或sigaction函数来注册一个信号处理函数。在信号处理函数中,进程可以采取相应的措施来处理信号,如输出错误信息、重新分配资源等。如果进程没有对信号进行处理,操作系统会采取默认的处理方式,如终止进程或忽略信号等。

在Hello程序中,如果程序没有出现异常情况,则不会产生信号,程序会正常执行完成。如果程序出现异常情况,则操作系统会向进程发送相应的信号,进程可以捕获信号并采取相应的处理措施,如输出错误信息或重新分配资源等。需要注意的是,信号处理函数应该尽量保持简单和可重入性,以避免出现死锁或其他问题。

程序运行过程中可以按键盘,如不停乱按,包括回车,Ctrl-Z,Ctrl-C等,Ctrl-z后可以运行ps  jobs  pstree  fg  kill 等命令,请分别给出各命令及运行结截屏,说明异常与信号的处理。

Ctrl+C结果:终止

乱摁和回车:正常运行。

Ctrl+Z:停止

ps:显示进程

jobs:显示任务

pstree:显示进程

fg:后台停止程序变为前台运行程序

kill:发送信号

发送杀死信号:停止程序变为终止程序

发送SIGCONT:停止程序继续运行

6.7本章小结

本章介绍了进程的概念和作用,并描述了Shell如何调用forkexecve函数,以及通过对hello的进程执行、异常与各种信号处理进行了实验。

7章 hello的存储管理

2分)

7.1 hello的存储器地址空间

结合hello说明逻辑地址、线性地址、虚拟地址、物理地址的概念。

  1. 逻辑地址:也称为“段内偏移地址”,是程序在逻辑地址空间中使用的地址。在多道程序设计中,不同的程序使用不同的逻辑地址空间,各自独立。例如,在一个程序中访问数组元素时,程序会使用逻辑地址来指定数组元素的位置。
  2. 线性地址:也称为“虚拟地址”,是逻辑地址到物理地址的映射。在操作系统中,使用分段或分页技术将逻辑地址映射为线性地址,线性地址用于访问内存中的实际数据。例如,在Linux操作系统中,每个进程都有自己的线性地址空间,进程中的逻辑地址由操作系统映射为对应的线性地址。
  3. 虚拟地址:也称为“逻辑地址”或“逻辑空间地址”,是程序中使用的地址,不受物理地址限制。虚拟地址是操作系统为每个进程分配的地址空间,在进程中使用的地址都是虚拟地址。虚拟地址空间通常比物理地址空间大得多,允许进程访问比实际物理内存更大的数据。
  4. 物理地址:也称为“实际地址”,是最终的硬件地址,用于访问实际的物理内存。在操作系统中,物理地址是由内存管理单元(MMU)将虚拟地址映射为物理地址,以便访问实际的内存。物理地址是由硬件直接访问的地址,它表示了数据在内存中的真实位置。

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

在Intel x86架构中,逻辑地址到线性地址的变换是通过段式管理来实现的。段式管理将逻辑地址分为两个部分:段选择器和偏移量。

段选择器是一个16位的数值,用于选择一个段描述符表中的段描述符。每个段描述符包含了一个段的基地址和段限长信息。偏移量是一个16位的数值,指定了从段基地址开始的偏移量。

在实际的操作系统中,逻辑地址到线性地址的变换是由操作系统的内存管理单元(MMU)完成的,MMU通过硬件实现了段选择器到段描述符的映射和线性地址到物理地址的映射,以便程序正确地访问内存。线性地址 = 段基地址 + 偏移量。

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

在Intel x86架构中,线性地址到物理地址的变换是通过页式管理来实现的。页式管理将线性地址分为两个部分:页目录项索引和页表项索引。

在页式管理中,物理内存被划分为大小相等的页框(page frame),每个页框的大小通常为4KB或者2MB。逻辑地址被划分为大小相等的页(page),每个页的大小与页框大小相同。

在进行线性地址到物理地址的变换时,需要经过以下步骤:

  1. 从线性地址中获取页目录项索引和页表项索引。
  2. 根据页目录项索引找到对应的页目录项,从页目录项中获取页表的物理地址。
  3. 根据页表项索引找到对应的页表项,从页表项中获取页框的物理地址。
  4. 将页框的物理地址和线性地址中页内偏移量合并,得到最终的物理地址。

在实际的操作系统中,线性地址到物理地址的变换是由操作系统的内存管理单元(MMU)完成的,MMU通过硬件实现了页表项到页框的映射,以便程序正确地访问内存。

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

在使用四级页表(或更多级)和TLB(Translation Lookaside Buffer)的情况下,虚拟地址(VA)到物理地址(PA)的变换需要经过以下步骤:

  1. 从VA中获取页目录项索引、页表项索引和页内偏移量。
  2. 将页目录项索引和页表项索引合并成一个索引,用于访问TLB。
  3. 在TLB中查找是否存在对应的页表项缓存,如果存在,那么可以直接从TLB中获取页框的物理地址。
  4. 如果在TLB中没有找到对应的页表项缓存,那么需要从页表层层查找页表项,直到找到对应的页表项。
  5. 将页表项中的页框号和页内偏移量组合成物理地址。

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

在三级Cache支持下的物理内存访问中,物理内存被划分为大小相等的块,称为缓存行。缓存行的大小通常为64字节或128字节。在访问物理内存时,CPU首先会在L1 Cache中查找对应的缓存行。如果L1 Cache中没有找到对应的缓存行,那么会在L2 Cache中查找。如果L2 Cache中也没有找到对应的缓存行,那么会在L3 Cache中查找。如果L3 Cache中也没有找到对应的缓存行,那么会从物理内存中读取对应的缓存行,并将其存储到L3 Cache中。

7.6 hello进程fork时的内存映射

父进程调用fork函数创建子进程,同时创建当前进程的的mm_struct, vm_area_struct和页表的原样副本,两个进程中的每个页面都标记为只读,两个进程中的每个区域结构都标记为私有的写时复制。子进程就可以独立地运行,不会影响父进程的运行,并且可以访问自己的物理页框。

7.7 hello进程execve时的内存映射

execve系统调用会将一个可执行文件(例如二进制文件)加载到当前进程的虚拟地址空间中,并将程序的入口点设置为该文件的入口点。在加载可执行文件时,内核会创建一个新的虚拟地址空间,并将可执行文件的代码、数据和堆栈等段映射到这个地址空间中。

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

处理的过程如下:

  1. 发生缺页故障。

当CPU访问一个不存在于主存中的虚拟页时,会产生一个缺页故障。

  1. 保存上下文。

当发生缺页故障时,CPU会暂停执行,并将当前的PC和其他寄存器的值保存到堆栈中。这些寄存器的值将用于重新执行导致缺页故障的指令。

  1. 查找页面。

一旦发生缺页故障,操作系统会查找该页面是否存在于主存中。如果该页面已经在主存中,那么操作系统会更新页表和其他相关的数据结构,并重新执行导致缺页故障的指令。

  1. 读取页面。

如果该页面不存在于主存中,那么操作系统会从磁盘或其他存储介质中读取该页面,并将其存储到空闲的物理页框中。然后,操作系统会更新页表和其他相关的数据结构,并重新执行导致缺页故障的指令。

  1. 恢复上下文并继续执行。

一旦缺页中断处理完成,操作系统会从堆栈中恢复CPU的上下文,并继续执行导致缺页故障的指令。

7.9本章小结

本章我们了解了计算机中虚拟内存管理,物理地址,线性地址,逻辑地址以及他们的变换模式,段式,页式管理,认识了fork和exeve的内存映射,并简述了发生缺页故障时的处理过程。

结论

0分,必要项,如缺失扣1分,根据内容酌情加分)

用计算机系统的语言,逐条总结hello所经历的过程。

你对计算机系统的设计与实现的深切感悟,你的创新理念,如新的设计与实现方法。

Hello的历程:

  1. 编写源程序;
  2. 预处理过程:hello.c预处理为hello.i
  3. 编译:编译器(ccl)将文本文件hello.i(C语言)翻译成文本文件hello.s(汇编语言);
  4. 汇编:汇编器将hello.s中的汇编语言翻译成计算机能处理的机器指令语言,并输出可重定位文件hello.o;
  5. 链接:将hello中使用的库函数文件与hello.o文件进行连接构成可执行目标文件;
  6. Shell为hello创建进程;
  7. Shell运行hello;
  8. 运行指令,读取内存,处理信号和异常;
  9. 结束运行,shell回收hello进程;

经过本次大作业的学习,深刻体会到计算机系统的设计与实现是一项复杂而又精细的工作,需要在硬件、操作系统和应用程序等多个层面上进行协同设计,才能达到高效、稳定、安全的运行状态。

附件

列出所有的中间产物的文件名,并予以说明起作用。

1.hello.i:cpp预处理原始的.c后缀的C程序。主要是将头文件直接插入程序文本中,并且根据define进行字符串的简单替换,得到新的预处理过的C文本文件。(文本文件)

2.hello.s:编译器将预处理过的以.i为后缀的文件编译成汇编文件。(文本文件)

3.hello.o:汇编器将以.s为后缀的汇编文件转化为机器语言,此时为可重定位目标文件(二进制文件)。

4.hello:利用链接器,将C函数库中相应的函数与hello.o可重定位文件链接,生成可执行目标文件(二进制文件)。

5.hello.o_obj:hello.o的反汇编文件;

6.hello_obj:hello的反汇编文件;

7.hello_section:节点信息文件;

(附件0分,缺失 -1分)

参考文献

为完成本次大作业你翻阅的书籍与网站等

[1]  林来兴. 空间控制技术[M]. 北京:中国宇航出版社,1992:25-42.

[2]  辛希孟. 信息技术与信息服务国际研讨会论文集:A集[C]. 北京:中国科学出版社,1999.

[3]  赵耀东. 新时代的工业工程师[M/OL]. 台北:天下文化出版社,1998 [1998-09-26]. http://www.ie.nthu.edu.tw/info/ie.newie.htm(Big5).

[4]  谌颖. 空间交会控制理论与方法研究[D]. 哈尔滨:哈尔滨工业大学,1992:8-13.

[5]  KANAMORI H. Shaking Without Quaking[J]. Science,1998,279(5359):2063-2064.

[6]  CHRISTINE M. Plant Physiology: Plant Biology in the Genome Era[J/OL]. Science,1998,281:331-332[1998-09-23]. http://www.sciencemag.org/cgi/ collection/anatmorp.

(参考文献0分,缺失 -1分)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值