哈工大盘算机系统大作业—hello的程序人生

打印 上一主题 下一主题

主题 2051|帖子 2051|积分 6153





盘算机系统


大作业



题     目  程序人生-Hello’s P2P 
专       业           盘算学部            
学     号             2023111082          
班     级        23L0509               
学       生            乔首智         
指 导 教 师              史先俊         






盘算机科学与技术学院

2025年5月

摘  要

本文深入剖析了 Hello 程序从源代码到运行进程的完备生命周期,涵盖 P2P(Program to Process) 和 020(Zero to Zero) 两个核心阶段。在 P2P 阶段,Hello 履历预处置惩罚、编译、汇编和链接,终极天生可实行文件;运行时通过 fork 和 execve 加载并实行。020 阶段描述了程序从创建到退出的全过程,涉及存储管理、进程调度和非常处置惩罚。实验基于 AMD Ryzen 7 7840H 处置惩罚器、16GB RAM 和 Ubuntu 18.04 LTS 环境,利用 GCC、EDB 和 Objdump 等工具。通过对预处置惩罚、编译、汇编、链接及运行时存储管理的详细分析,展现了盘算机系统各层次的协同工作,帮助读者理解程序实行机制。
关键词:进程管理;链接受理;进程与加载;                           









目  录


第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(From Program to Process):指从hello.c变为运行时进程, 涉及多个阶段,包括预处置惩罚、编译、汇编、链接、加载和实行, 在运行时,我们打开Shell,等待我们输入指令。通过输入./hello,使Shell创建新的进程用来实行hello。 操作系统会利用fork产生子进程,然后通过execve将其加载,不停进行访存、内存申请等操作。末了,在程序结束返回后,由父进程或先人进程进行接纳,程序结束。
020(From Zero to Zero):描述了程序从无到有,再到最闭幕束的整个生命周期,涉及程序的创建、运行和退出.
1.2 环境与工具

1.2.1硬件环境
处置惩罚器: AMD Ryzen 7 7840H w/ Radeon 780M Graphics         3.80 GHz
RAM:16GB
系统类型:64 位操作系统, 基于 x64 的处置惩罚器
1.2.2软件环境
Windows11 64位
VMware,Ubnuntu 18.04LTS
1.2.3开辟与调试工具
Gcc,edb,objdump
1.3 中间效果

hello.c:原始hello程序的C语言代码

hello.i:预处置惩罚过后的hello代码

hello.s:由预处置惩罚代码天生的汇编代码

hello.o:二进制目的代码

hello:进行链接后的可实行程序

1.4 本章小结

本章首先介绍了hello的P2P,020流程,包括流程的计划思绪和实现方法;然后,阐明了本实验所需的硬件设置、软件平台、开辟工具以及本实验天生的各个中间效果文件的名称和功能




第2章 预处置惩罚

2.1 预处置惩罚的概念与作用

概念:是指在程序正式编译之前,由预处置惩罚器对源代码进行的预先处置惩罚。预处置惩罚器会根据预处置惩罚指令(如宏界说、条件编译等)对源代码进行修改或调整,天生一个经过处置惩罚的中间代码,然后再交由编译器进行编译
作用:利用#define界说宏,提高代码可读性,利用 #include 引入其他文件, 利用 #ifdef、#ifndef、#if、#else、#endif 等指令,让编译器根据条件选择性地编译代码,去除注释
2.2在Ubuntu下预处置惩罚的命令



2.3 Hello的预处置惩罚效果解析

在linux下打开hello.i文件,可以看到其比hello.c多了许多东西

发现此中的注释部门已经完全消失了,前面的代码是被加载到程序中的头文件,预处置惩罚指令被扩展为3000多行,预处置惩罚后的文件hello.i包含了标准输入输出库stdio.h的内容,以及一些宏和常量的界说,还有一些行号信息和条件编译指令。

2.4 本章小结

本章讲述了在linux环境中,怎样用命令对C语言程序进行预处置惩罚,以及预处置惩罚的寄义和作用,接着以hello.c为例,演示了在Ubuntu下怎样预处置惩罚程序,并对效果进行分析。通过分析,我们可以发现预处置惩罚后的文件hello.i包含了标准输入输出库stdio.h的内容,以及一些宏和常量的界说,还有一些行号信息和条件编译指令。


第3章 编译

3.1 编译的概念与作用

概念:将人类可读的源代码翻译成汇编代码的过程。编译器通过前端进行词法分析、语法分析等,然后经过优化器进行代码优化,终极由后端将代码翻译汇编代码。编译的过程包括翻译、优化、查抄和天生可实行文件等步骤,以确保程序的精确性和性能。
作用:产生汇编语言文件,并交给呆板实行
3.2 在Ubuntu下编译的命令


3.3 Hello的编译效果解析

打开hello.c文件,发现了大量的汇编代码




3.3.1工作伪代码

.file       声明源文件(此处为hello.c)
.text      声明代码节
.section 文件代码段
.rodata  Read-only只读文件
.align    数据指令地点对齐方式(此处为8对齐)
.string   声明字符串(此处声明了LC0和LC1)
.globl    声明全局变量
.type     声明变量类型(此处声明为函数类型)
这些代码是指导汇编器和连接器工作的伪指令
3.3.2数据格式和寄存器布局
Intel数据类型令16bytes为字,32bytes为双字,各种数据类型的巨细一级寄存器的布局如下所示:
类型
Intel数据类型
汇编代码后缀
字节巨细
Short

w
2
Char
字节
b
1
Int
双字
l
4
Long
四字
q
8
Char*
四字
q
8
Float
单精度
s
4
Double
双精度
l
8

寄存器布局

3.3.3对局部变量的操作


在hello中局部变量操作主要是c文件中的第12行,int i


在对应的汇编语言中,局部变量被存储在栈上,会在栈上申请空间,当被利用完毕后,栈空间被开释,如图所示,可知,栈指针向下移动了32个字节,为i预留了空间

3.3.4对字符串常量的操作


在main函数之前,.LC0和.LC1存储了字符串常量,标志了此处的代码是只读的


在main函数中利用字符串,如上图,得到字符串的首地点(movl操作是数据传送指令)

3.3.5对立即数的操作


在汇编语言中,立即数用$后加数字表现

3.3.6赋值操作


汇编语言中,利用movl指令赋值,如图,是将0赋值给i

3.3.7参数传递


在LFB6部门,将%rbp压栈生存起来,在上图,通过mov指令,将栈指针减少32位,然后将将%rdi和%rsi的值存入栈中,因此,%rbp-20和%rbp-32的位置分别存了argv数组和argc的值

3.3.8对数组的操作


对数组的操作,都是先找到数组的首地点,然后加上偏移量即可,如上图,在main中,调用了argv[1]和argv[2],在汇编代码中,每次将%rbp-32的的值即数组首地点传%rax,然后将%rax分别加上偏移量24和16,得到了argv[1]和argv[2]

3.3.9对函数的调用和返回

(1)printf


参数传递:printf函数调用参数argv[1],argv[2]。


函数调用:该函数调用了两次。第一次将寄存器%rdi设置为待传递字符串"用法:Hello学号 姓名 秒数!\n"的起始地点;第二次将其设置为“Hello %s  %s\n”的起始地点。详细已在前面讲过。利用寄存器%rsi完成对argv[1]的传递,用%rdx完成对argv[2]的传递。

(2)exit


(3)atoi


将参数argv[3]放入寄存器%rdi中用作参数传递,简朴利用call指令调用。atoi函数用于将字符串转换为整数

(4)sleep


代码将转换完成的秒数从%eax传递到%edi中,edi存放sleep的参数,再利用call调用。sleep函数可以让程序休眠一段时间

3.3.10for循环


movq -32(%rbp), %rax:这一行将存储在-32(%rbp)的变量的值加载到%rax寄存器中,addq $24, %rax:这一行将%rax寄存器中的值增加24,用于获取arg[1]的地点,movq (%rax), %rcx:这一行argv[1]加载到%rcx寄存器中,movq -32(%rbp), %rax:这一行重复了第2步的操作,重新加载数组的指针到%rax寄存器中,addq $16, %rax:这一行增加了%rax中的值,通常用于访问数组中的另一个元素,movq (%rax), %rdx:这一行将数组中的另一个元素加载到%rdx寄存器中,程序重复了上述步骤,获取了argv[2]和argv[3]的值,分别存储在%rdx和%rsi寄存器中,函数继续实行for循环内部的内容。
addl $1, -4(%rbp):将循环计数器加1,通常是通过修改存储在-4(%rbp)处的值来实现。接着,函数回到.L4标志处,继续实行循环体。这些汇编指令重复实行循环体,直到循环条件不再满足(即i < 10)
3.3.11跳转语句


跳转指令会根据条件码当前的值来进行相应的跳转。比较常见的是直接跳转,在hello.s中也有体现,如上图所示。cmpl指令判断寄存器中的值和立即数5的巨细关系,设置条件码,再进行je。je的寄义是jump if equal,也就是说,假如此时的条件码所表现寄义为相称,则会跳转到相应的.L2指令行。因此,跳转指令用来实现条件分支

3.4 本章小结

本章主要介绍了汇编过程。我们利用指令gcc -S -o hello.s
hello.i将hello.i转换为hello.s,这一步将高级语言翻译成呆板能够理解的汇编语言,是高级语言与呆板语言之间的桥梁。本章详细解说了汇编语言中的各种指令,如call、ret、mov和条件判断等,使学生能够掌握阅读和理解汇编语言的能力

第4章 汇编

4.1 汇编的概念与作用

概念:指把汇编语言书写的程序翻译成与之等价的呆板语言程序的翻译程序。汇编程序输入的是用汇编语言书写的源程序,输出的是用呆板语言表现的目的程序。也就是说,汇编器会把输入的汇编指令文件重新打包成可重定位目的文件,并将效果生存成.o文件。它是一个二进制文件,包含程序的指令编码。
作用:完成从汇编语言文件到可重定位目的文件的转化过程
4.2 在Ubuntu下汇编的命令


4.3 可重定位目的elf格式

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

利用readelf -h hello.o查看ELF头,ELF头以一个16字节的序列(Magic,魔数)开始,这个序列描述了天生文件的系统的字的巨细和字节次序。ELF头剩下部门的信息包含帮助连接器语法分析息争释目的文件的信息。此中包括ELF头的巨细、目的文件的类型和呆板类型等,如上图
4.3.2Section头

利用命令readelf -S hello.o查看节头,夹在ELF头和节头部表之间的都为节,包含了文件中出现的各个节的语义,包括节
的类型、位置和巨细等信息。
名称
内容
.text
程序的可实行代码
.rela.text
与.text相关的重定位信息
.data
程序的初始化数据
.bss
程序的未初始化数据
.rodata
只读数据
.comment
编译器或工具链天生的注释信息
.note.GNU-stack
指示栈是否可实行
.note. gnu.propert NOTE
包含GNU特定的属性信息
.eh_frame
非常处置惩罚框架信息
.rela.eh_frame
与.eh_frame相关的重定位信息
.symtab
程序中界说和引用的符号信息
.strtab
符号表中符号名称的字符串
.shstrtab
段头表中段名称的字符串
4.4.3符号表

利用命令readelf -s hello.o查看符号表,在符号表中,Num为某个符号的编号,Name是符号的名称。Size表现他是一个位于.text节中偏移量为0处的146字节函数。Bind表现这个符号是当地的还是全局的,由上图可知main函数名称这个符号变量是当地的
4.3.4可重定位信息

利用readelf -r hello.o查看可重定位段信息,offset是必要被修改的引用的节偏移,Sym.标识被修改引用应该指向的符号。Type告知连接器怎样修改新的引用,Addend是一个有符号常数,一些类型的重定位要利用它对被修改的引用的值做偏移调整。
4.4 Hello.o的效果解析


利用objdump -d -r hello.o命令对hello.o可重定位文件进行反汇编
反汇编得到的效果与hello.s中的汇编代码基本一致,但是还是存在一些收支:在每条指令的前面出现了一组组由16进制数字组成的代码,这就是呆板代码。呆板代码才是盘算机真正可以识别的语言。
这些呆板代码是二进制呆板指令的聚集,每一条呆板代码都对应一条呆板指令。每一条汇编语言都可以用呆板二进制数据来表现,汇编语言中的操作码和操作数以一种相当于映射的方式和呆板语言进行对应,从而让呆板能够真正理解代码的寄义并且实行相应的功能。呆板代码与汇编代码不同的地方在于:
分支跳转方面:汇编语言中的分支跳转语句利用的是标识符(比方je .L2)来决定跳转到那里,而呆板语言中经过翻译则直接利用对应的地点来实现跳转
函数调用方面: 函数调用方面:在汇编语言.s文件中,函数调用直接写上函数名。而在.o反汇编文件中,call目的地点是当前指令的下一条指令地点。这是因为hello.c中调用的函数都是共享库中的函数,必要等待链接之后才能确定响应函数的地点。因此,呆板语言中,对于这种不确定地点的调用,会先将下一条指令的相对地点设置为0,然后再.rela.text节中为其添加重定位条目,等待链接时确定地点
 

伪指令部门:反汇编代码中,出如今汇编代码开头的伪指令消失了
4.5 本章小结

本章对汇编的概念、作用、可重定向目的文件的布局及对应反汇编代码等进行了较为详细的介绍。经过汇编阶段,汇编语言代码转化为呆板语言,天生的可重定位目的文件(hello.o)为随后的链接阶段做好了准备。



第5章 链接

5.1 链接的概念与作用

链接: 将各种代码和数据片断和搜集并组成成为一个但以文件的过程,这个文件可被夹在到内存并实行。链接可以实行于编译时,也就是在源代码被翻译成呆板代码时;也可以实行于加载时,也就是在程序被记载器加载到内存并实行时;甚至实行于运行时,也就是由应用程序来实行
作用: 将程序调用的各种静态链接库和动态连接库整合到一起,美满重定位目次,使之成为一个可运行的程序
5.2 在Ubuntu下链接的命令

利用ld -o hello -dynamic-linker /lib64/ld-linux-x86-64.so.2 /usr/lib/x86_64-linux-gnu/crt1.o /usr/lib/x86_64-linux-gnu/crti.o hello.o /usr/lib/x86_64-linux-gnu/libc.so /usr/lib/x86_64-linux-gnu/crtn.o链接

5.3 可实行目的文件hello的格式

  5.3.1ELF头

利用readelf -h hello查看,可以看到hello的ELF头中Type处显示的是EXEC,表现时可实行目的文件,这与hello.o不同。hello中的节的数目为30个。
5.3.2Section头

输入readelf -S hello查看Section头, 节头部表对hello中所有信息进行了声明,包括了巨细(Size)、偏移量(Offset)、起始地点(Address)以及数据对齐方式(Align)等信息。根据始地点和巨细,我们就可以盘算节头部表中的每个节所在的地区。
5.3.3符号表

利用readelf -s hello查看符号表发现经过链接之后符号表的符号数目陡增,阐明经过连接之后引入了许多其他库函数的符号,一并加入到了符号表中。
5.3.4可重定位信息

利用readelf -r hello查看可重定位段信息
5.4 hello的虚拟地点空间


在edb中打开hello,可看到起始地点为0x401000,结束地点为0x401ff0。
根据5.3.2节里面的Section头部表,我们可以找到对应的节的其实空间对应位置,比方.init初始化节,起始位置地点为0x401000在edb中有其对应位置

5.5 链接的重定位过程分析


利用objdump -d -r hello查看hello可实行文件的反汇编条目
可以观察到,hello的反汇编代码与hello.o的返汇编代码在布局和语法上是基本相同的,只不外hello的反汇编代码多了非常多的内容,我们通过比较不同来看一下区别

  • 虚拟地点不同,hello.o的反汇编代码虚拟地点从0开始,而hello的反汇编代码虚拟地点从0x400000开始。这是因为hello.o在链接之前只能给出相对地点,而hello在链接之后得到的是绝对地点。

Hello的反汇编


Hello.o的反汇编


  • 反汇编节数不同, hello.o只有.text节,里面只有main函数的反汇编代码。而hello在main函数之前加上了链接过程中重定位而加入的各种在hello中被调用的函数、数据,增加了.init,.plt,.plt.sec等节的反汇编代码。
  • 跳转指令不同,hello.o中的跳转指令后加的主要是汇编代码块前的标号,而hello中的跳转指令后加的则是详细的地点,但相对地点没有发生变.
5.6 hello的实行流程


首先,程序停在0x7fa5:8bfed100处,这是hello利用的动态链接库ld-2.2.27.so的入口点_dl_start,然后,程序跳转到_dl_init,在经过了一系列初始化后,跳到hello的程 序入口点_start,然后程序通过call指令跳到动态链接库ld-2.27.so的_libc_start_main 处,这个函数会进行一些必要的初始化,并负责调用main函数,下一步,程序调用动态链接库中的__cxa_atexit函数,它会设置在程序结束时必要调用的函数表,然后返回到__libc_start_main继续,然后调用hello可实行文件中的__libc_csu_init函数,这函数是由静态库引入的,也是做一些初始化的工作,然后程序返回到__libc_start_main继续,紧接着程序调用动态链接库里的_setjmp函数,设置一些非当地跳转,然后返回到__libc_start_main继续,正式开始调用main函数,由于我们在edb运行hello的时候并未给出额外的命令行参数,因此它会在第一个if处通过exit(1)直接结束程序,通过hello本身携带的exit函数,程序会跳转;
 之后,在进行了多少操作后,程序退出。

5.7 Hello的动态链接分析

程序调用一个有共享库界说的函数时,编译器无法猜测函数在运行时的详细地点,因为界说这个函数的共享模块大概可以被加载到任何位置。因此,编译系统采用延迟绑定,将过程地点的绑定推迟到第一次调用该过程的时候。

延迟绑定必要用到两个数据布局:GOT(Global Offset Table,全局偏移表)和PLT(Procedure Linkage Table,过程链接表)。
.plt:PLT是一个数组,此中每个条目是16字节代码。PLT[0]是一个特殊条目,它跳转到动态链接器中。每个被可实行程序调用的库函数都有它自己的PLT条目。每个条目都负责调用一个详细的函数。

.got:GOT是一个数组,此中每个条目是8字节地点。和PLT联合利用时,GOT[O]和GOT[1]包含动态链接器在解析函数地点时会利用的信息。GOT[2]是动态链接器在1d-linux.so模块中的入口点。别的的每个条目对应于一个被调用的函数,其地点必要在运行时被解析。每个条目都有一个相匹配的PLT条目。

hello在动态连接器加载前后的重定位是不一样的,在加载之后才进行重定位


5.8本章小结
本章介绍了连接的过程。表明了程序是怎样进行重定位的操作,把相同类型的数据放在同一个节的过程,同时也阐明了链接的工作原理

第6章 hello进程管理

6.1 进程的概念与作用

概念: 是盘算机中的程序关于某数据聚集上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统布局的底子

作用: 在运行一个进程时,我们的这个程序好像是系统当中唯逐一个运行的程序,进程的作用就是提供给程序两个关键的抽象。一分别是独立的逻辑控制流和私有的地点空间
6.2 简述壳Shell-bash的作用与处置惩罚流程

作用: Shell是命令语言表明器,是一个应用程序,它连接了用户和 Linux 内核,让用户能够更加高效、安全、低成当地利用 Linux 内核。
处置惩罚流程:首先对命令行参数求值,判断命令行是否为空,假如不为空则判断第一个命令行参数是不是一个内置的命令,假如是一个内置命令则直接实行,否则查抄是否是一个应用程序。之后在搜索路径里寻找这些应用程序,假如键入的命令不是一个内部命令并且路径里没有找到这个可实行文件,则会显示一条错误信息。假如能够成功找到命令,那么该内部命令大概应用程序将会被分解为系统调用并传递给linux内核
6.3 Hello的fork进程创建过程

在Linux系统中,用户可以通过 ./ 指令来实行一个可实行目的文件。在程序运行时,Shell就会创建一个新的进程,并且新创建的进程更新上下文,在这个新建进程的上下文中便可以运行这个可实行目的文件。fork()函数拥有一个int型的返回值。子进程中fork返回0,在父进程中fork返回子进程的Pid。新创建的进程与父进程几乎相同但有细微的差异。子进程得到与父进程虚拟地点空间相同的一份副本,并且子进程拥有与父进程不同的Pid
6.4 Hello的execve过程

当你在终端中输入 ./hello 并按下回车时,shell(如 Bash)会调用 execve 系统, 控制权从用户空间转移到内核空间, 调用execve会将这个进程实行的原本的程序完全替换,它会删除已存在的用户地区,包括数据和代码;然后,映射私有区:为Hello的代码、数据、.bss和栈地区创建新的地区布局,所有这些地区都是私有的、写时才复制的;之后映射共享区;末了把控制传递给当前的进程的程序入口
6.5 Hello的进程实行

6.5.1逻辑控制流
逻辑控制流是一个PC值的序列,PC值就是程序计数器的值,这些值与可实行目的文件的指令大概包含在运行时动态链接到程序的共享对象中的指令逐一对应。
6.5.2时间流
进程轮流利用处置惩罚器,每个进程实行它的流的一部门,两个流假如在实行的时间上有所重叠,那么这两个流是并发流, 一个进程与其他进程轮流运行的概念称为多使命。一个进程实行其控制流一部门的每一个时间段叫做时间片,多使命也就被称作是时间分片
6.5.3用户模式与内核模式
用户模式: 用户模式中,进程不允许实行特权指令,比方发起一个I/O操作等,更重要的是不允许直接引用地点空间中内核区内的代码和数据。假如在用户模式下进行这样的非法命令实行,会引发致命的保护故障。
内核模式: 内核模式下,进程的指令实行相对没有限制
6.5.4进程上下文切换
上下文就是内核重新启动一个被抢占的进程所必要的状态,它由通用目的寄存器、浮点寄存器、程序计数器、用户栈、状态寄存器、内核栈和各种内核数据布局等对象的值构成。进程实行的某些时候,内核可以决定抢占当进步程,并重新开始一个先前被抢占了的进程,这样的决策叫做调度,由内核中的调度器的代码处置惩罚。在这个抢占过程中必要用到上下文切换,上下文切换生存当进步程的上下文,恢复先前某个被抢占的上下文,并将控制传递给新恢复的进程。
6.6 hello的非常与信号处置惩罚

6.6.1非常
类型
原因
异步/同步
返回行为
停止
来自I/O设备的信号
异步
返回到下一条行为
陷阱
有意的非常
同步
返回到下一条行为
故障
埋伏可恢复的错误
同步
大概返回到当前指令
停止
不可恢复的错误
同步
不返回
6.6.2信号
SIGINT:当用户按下Ctrl+C时发送,通常用于停止程序。
SIGTSTP:当用户按下Ctrl+Z时发送,用于暂停程序。
SIGTERM:请求程序停止的正常信号。
6.6.3处置惩罚
 (1)乱按

在键盘中乱打字并没有改变printf的输出,不影响程序的正常运行
(2)ctrl+z

Ctrl+Z的功能是向进程发送SIGSTP信号,进程吸收到该信号之后会将该作业挂起,但不会接纳

利用ps可知hello进程仍在运行中

利用jobs,可知hello的后台job id=1

利用fg指令让后台作业运行,可知挂起前后共输出10次
(3)ctrl+c

直接停止前台作业
(4)不停按回车

不影响程序运行,但是回车不仅在printf时显示,在hello实行完毕后,回车同样进行了多次
6.7本章小结

本章概述了hello进程大致的实行过程,阐述了进程、shell、fork、execve等相关概念,之后从逻辑控制流、时间分片、用户模式/内核模式、上下文切换等角度详细分析了进程的实行过程。并在运行时尝试了不同形式的命令和非常,每种信号都有不同处置惩罚机制,针对不同的shell命令,hello会产生不同响应。



第7章 hello的存储管理

7.1 hello的存储器地点空间

逻辑地点:程序代码经过编译后出如今汇编程序中地点。逻辑地点由选择符(在实模式下是描述符,在保护模式下是用来选择描述符的选择符)和偏移量(偏移部门)组成。

线性地点:线性地点空间是一个非负整数的聚集。逻辑地点经过段机制后转化为线性地点,为描述符:偏移量的组合形式。在调试hello时,gdb中查看到的就是线性地点,大概虚拟地点。

虚拟地点:虚拟地点空间是0到N的所有整数的聚集(N是正整数),是线性地点空间的有限子集。分页机制以虚拟地点为桥梁,将硬盘和物理内存联系起
7.2 Intel逻辑地点到线性地点的变换-段式管理

intel平台下,逻辑地点的格式为段标识符:段内偏移量。段标识符是由一个16位长的字段组成,称为段选择符。此中前13位是一个索引号。后面3位包含一些硬件细节。分段机制将逻辑地点转化为线性地点的步骤如下:首先利用段选择符中的偏移值在GDT或LDT表中定位相应的段描述符,然后利用段选择符检验段的访问权限和范围,以确保该段可访问,末了把段描述符中取到的段基地点加到偏移量上,末了形成一个线性地点

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

线性地点(VA)到物理地点(PA)之间的转换通过分页机制完成。分页机制类似主存和Cache之间的分块机制,分页机制对虚拟地点和物理内存进行分页,页的巨细通常是4KB到2M(因时而异,时过境迁,页的巨细有所不同)。在x86-64呆板上,虚拟地点空间的N是2的48次方,有256TB,比正常的硬盘大得多。

在分页机制中,硬盘空间的每个字节到虚拟地点空间的每个字节存在映射关系,且这个映射是单射。虚拟地点空间和硬盘空间都以字节为单位,从0开始编地点号。设硬盘空间为H,虚拟地点空间为V,设他们之间的映射关系为,f是单射,则于是,我们知道了物理地点中某个地点所在页与虚拟空间的页的对应关系,也就知道了物理地点中某个地点所在页与硬盘中某个页的对应关系。

物理地点中某个地点所在页与虚拟空间的页的对应关系要通过什么来记载呢?分页机制中利用一个叫做页表的数据布局来记载这些关系,页表也是存储在内存中的,是由操作系统维护的。其实DRAM到Cache中也是类似机制,只不外DRAM到Cache的高速缓存机制是用硬件实现的。

每个进程都有一个页表,页表中的每一项,即PTE(页表条目),记载着该对应的虚拟地点空间的那一页是否有效(便是否有对应的物理内存上的页),物理页的起始位置或磁盘地点,访问权限等信息。PTE根据不同的映射状态也被划分为三种状态:未分配、未缓存、已缓存

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

页表是 PTE(页表条目)的数组,它将虚拟页映射到物理页,每个 PTE 都有一个有效位和一个 n 位地点字段,有效位表明该虚拟页是否被缓存在 DRAM 中。虚拟地点分为两个部门,虚拟页号(VPN)和虚拟页面偏移量(VPO)。此中VPN必要在PTE中查询对应,而VPO则直接对应物理地点偏移(PPO)
在从VA翻译得到PA的过程中,MMU首先用VPN向TLB申请请求对应的PTE,假如命中,那么直接跳过后面的步骤;之后MMU天生PTE地点,从高速主存请求得到PTE,高速缓存或主存会向MMU返回PTE。若PTE有效位为0,阐明缺页,MMU触发缺页非常,缺页处置惩罚程序确定物理内存中的捐躯页(若页面修改,则换出到磁盘)。之后缺页处置惩罚程序调入新的页面,并更新PTE。之后却也处置惩罚程序返回原进程,并重新实行导致缺页的指令
7.5 三级Cache支持下的物理内存访问

在寻找一个虚拟地点时,CPU会优先到TLB中寻找,查看VPN是否已经缓存。假如页命中的话,就直接获取PPN;假如没有命中的话就必要查询多级页表,得到物理地点PA,之后再对PA进行分解,将其分解为标志(CT)、组索引(CI)、块便宜(CO),之后再检测物理地点是否在下一级缓存中命中。若命中,则将PA对应的数据内容取出返回给CPU;若不命中,则重复上述操作,直到找到
7.6 hello进程fork时的内存映射

当fork函数被调用时,内核为新进程创建各种数据布局,并分配给它一个唯一的PID。为了给新进程创建虚拟内存,它创建了当进步程的mm_struct、地区布局和页表的原样副本,并将两个进程中的每个界面都标志为只读,将两个进程中的每个地区布局都标志为私有的写时复制。

当fork在新进程中返回时,新进程如今的虚拟内存搞好和调用fork时存在的虚拟内存相同。这两个进程中的任意一个后来进行写操作时,写时复制机制就会创建新页面,因此,也就为每个进程保持了私有地点空间的抽象概念
7.7 hello进程execve时的内存映射

execve 函数调用驻留在内核地区的启动加载器代码,在当进步程中加载并运 行包含在可实行目的文件 hello 中的程序,用 hello 程序有效地替代了当前程序。 加载并运行 hello 必要以下几个步骤:
删除已存在的用户地区,删除当进步程虚拟地点的用户部门中的已存在的地区布局。
映射私有地区,为新程序的代码、数据、bss 和栈地区创建新的地区布局。
映射共享地区, hello 程序与共享对象 libc.so 链接,libc.so 是动态链 接到这个程序中的,然后再映射到用户虚拟地点空间中的共享地区内。
设置程序计数器(PC),execve 做的末了一件事变就是设置当进步程 上下文的程序计数器,使之指向代码地区的入口点。
7.8 缺页故障与缺页停止处置惩罚

缺页故障:一个虚拟页没被缓存在DRAM中,即DRAM缓存不命中被称为缺页。当CPU引用了一个页表条目中的一个字,而该页表条目并未被缓存在DRAM中,地点翻译硬件从内存中读取该页表条目,从有效位为0可以判断尚未被缓存,进而触发缺页非常
缺页停止处置惩罚: 程序会选择一个捐躯页,将其在物理内存中删除,加入所必要访问的VP3。随后返回重新实行原指令,则页命中。这种计谋称为按需页面调度。
7.9本章小结

本章介绍了Hello和操作系统之间的交流方式。介绍了hello的存储器地点空间、intel的段式管理、hello的页式管理,介绍了Hello是怎样经过地点翻译从而找到终极的物理地点。阐释了TLB加速地点翻译、多级缓存相关的要点。
第8章 hello的IO管理

8.1 Linux的IO设备管理方法

以下格式自行编排,编辑时删除
设备的模型化:文件
设备管理:unix io接口
8.2 简述Unix IO接口及其函数

以下格式自行编排,编辑时删除
8.3 printf的实现分析

以下格式自行编排,编辑时删除
[转]printf 函数实现的深入剖析 - Pianistx - 博客园
从vsprintf天生显示信息,到write系统函数,到陷阱-系统调用 int 0x80或syscall等.
字符显示驱动子程序:从ASCII到字模库到显示vram(存储每一个点的RGB颜色信息)。
显示芯片按照刷新频率逐行读取vram,并通过信号线向液晶显示器传输每一个点(RGB分量)。
8.4 getchar的实现分析

以下格式自行编排,编辑时删除
异步非常-键盘停止的处置惩罚:键盘停止处置惩罚子程序。接受按键扫描码转成ascii码,生存到系统的键盘缓冲区。
getchar等调用read系统函数,通过系统调用读取按键ascii码,直到接受到回车键才返回。
8.5本章小结

以下格式自行编排,编辑时删除
(第8选做 0分)





结论

Hello履历的过程:


  • 预处置惩罚阶段(cpp)
    预处置惩罚器对源文件hello.c进行宏睁开、头文件包含和条件编译处置惩罚,天生扩展后的中间文件hello.i。此阶段完成了所有#开头的预处置惩罚指令解析。
  • 编译阶段(ccl)
    编译器将预处置惩罚后的hello.i文件进行词法分析、语法分析和语义分析,通过代码优化天生对应的汇编代码文件hello.s,完成高级语言到低级汇编语言的转换。
  • 汇编阶段(as)
    汇编器把hello.s中的汇编指令逐条转换为呆板指令,天生可重定位目的文件hello.o。该文件包含二进制呆板码,但地点尚未终极确定。
  • 链接阶段(ld)
    链接器将hello.o与所需的库文件(静态库和动态库)进行符号解析和重定位,合并节区并解决外部依赖,终极天生可实行的ELF格式文件hello。
  • 程序运行
    在shell终端输入实行命令./hello 2023111082 乔首智 16635886938 3,shell通过PATH环境变量定位可实行文件。
  • 进程创建
    shell通过fork()系统调用创建子进程:复制父进程地点空间,继承打开的文件描述符,获得独立的PID和进程控制块
  • 程序加载
    通过execve()系统调用触发加载器:解析ELF头部信息,建立虚拟内存空间映射,动态链接器处置惩罚共享库依赖,设置程序入口点(_start)
  • 指令实行
    CPU为进程分配时间片:进程控制流进入main函数,寄存器生存当前实行上下文,指令流水线逐条实行呆板码,分支猜测单位优化控制流
  • 内存访问
    MMU完成地点转换:通过页表查询将虚拟地点转为物理地点,TLB缓存加速地点转换,触发缺页非常处置惩罚未映射页面
  • 信号处置惩罚
    内核管理进程信号:Ctrl+c产生SIGINT(2号信号),默认停止进程,Ctrl+z产生SIGTSTP(20号信号),暂停进程并放入后台。
  • 进程停止
    停止处置惩罚流程:子进程通过exit()系统调用结束,父进程通过wait()接纳子进程资源,内核清除进程描述符、打开文件等资源,返回状态码给父进程
纵观hello的一生,简朴质朴却也富裕内涵,它告诉我们一切简朴的操作背后都具有丰富的内涵,我们也当如此做一个富于内涵的人


附件

列出所有的中间产物的文件名,并予以阐明起作用。
文件名
功能
Hello.c
源代码
Hello.i
预处置惩罚后产生的文件
Hello.s
汇编语言文件
Hello.o
可重定位目的文件
Hello
二进制可实行文件


参考文献

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

[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分)



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

欢乐狗

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表