操作系统真像还原-第0章一些你可能正疑惑的问题-笔记

1.操作系统是什么?

 

理解:操作系统和用户进程的关系?

 

2. 软件是如何访问硬件的

 

硬件在输入输出上大体分为串行和并行,相应的接口也就是串行接口和并行接口。串行硬件通过串行

接口与 CPU 通信,反过来也是, CPU 通过串行接口与串行设备数据传输。并行设备的访问类似,只不过 是通过并行接口进行的。(什么是串行和并行传输?)

 

访问外部硬件有两个方式。

(l )将某个外设的内存映射到一定范围的地址空间中, CPU 通过地址总线访问该内存区域时会落到外设的内存中,这种映射让 CPU 访问外设的内存就如同访问主板上的物理内存一样。有的设备是这样做的,比如 显卡,显卡是显示器的适配器, CPU 不直接和显示器交互,它只和显卡通信。显卡上有片内存叫显存,它被 映射到主机物理内存上的低端 lMB 的0xB8000~0xBFFFFo CPU 访问这片内存就是访问显存,往这片内存上 写字节便是往屏幕上打印内容。看上去这么高大上的做法是怎么实现的,这个我们就不关心了,前面说过,计 算机中处处是分层,我们要充分相信上一层的工作。(看看我们的previce的代码,怎么操作显存?)

 

(2 )外设是通过 IO 接口与 CPU 通信的, CPU 访问外设,就是访问 IO 接口,由 IO 接口将信息传递给另一端的外设,也就是说, CPU 从来不知道有这些设备的存在,它只知道自己操作的 IO 接口,你看, 处处体现着分层。 于是问题来了,如何访问到 IO 接口呢,答案就是 IO 接口上面有一些寄存器,访问 IO 接口本质上就是 访问这些寄存器,这些寄存器就是人们常说的端口。这些端口是人家 IO 接口给咱们提供的接口 。 人家接口 电路也有自己的思维(系统),看到寄存器中写了什么就做出相应的反应。接口提供接口,哈哈,有意思。 不过这是人家的约定,没有约定就乱了,各干各的,大家都累,咱们只要遵循人家的规定就能访问成功。(I/O接口和I/O端口的区别?)

 

3.应用程序是什么,如何和操作系统配合在一起的?

应用程序要用某种语言编写,而语言又是编译器来提供的.

其实根本就没有什么语言,有的只是编译 器。是编译器决定怎样解释某种关键字及某种语法。 语言只是编译器和大家的约定,只要写入这样的代码, 编译器便将其翻译成某种机器指令,翻译成什么样取决于编译器的行为,和语言无关,比如说 C 语言的 printf 函数,它的功能不是说一定要把字符打印到屏幕上,这要看编译器对这种关键字的处理。

 

编译器提供了一套库函数,库函数中又有封装的系统调用,这样的代码集合称之为运行库。 C 语言的运行库称为 C 运行库,就是所谓的 CRT ( C Runtime Library )。

 

应用程序加上操作系统提供功能才算是完整的程序。应用程序需要调用 操作系统提供好的函数才能完整地做成一件事,而这个函数便是系统调用。

 

用户态与内核态是对 CPU 来讲的,是指 CPU 运行在用户态(特权 3 级)还是内核态(特权 0 级),很多人误以为是对用户进程来讲的。

 

用户进程陷入内核态是指:由于内部或外部中断发生,当前进程被暂时终止执行,其上下文被内核的中断程序保存起来后,开始执行一段内核的代码。是内核的代码,不是用户程序在内核的代码,用户代码怎么可能在内核中存在,所以“用户态与内核态”是对 CPU 来说的。

 

当用户程序欲访问系统资源时(无论是硬件,还是内核数据结构),它需要进行系统调用.

 

4.内存访问为什么要分段?

 

内存是随机读写设备,即访问其内部任何一处,不需要从头开始找,只要直接给出其地址便可 。 如访问内存 OxCOO,只要将此地址写入地址总线便可 。 问题来了,分段是内存访问机制,是给 CPU 用的访问内存的方式,只有 CPU 才关注段,那为什么 CPU 要用段昵,也就是为什么 CPU 非得将内存分成一段一段的才能访问呢?

 

编译器在编译程序时,肯定要根据 CPU 访问内存的规则将代码编译成机器指令,这样编译出来的程序才能在该 CPU 上运行无误,所以说,在直接以绝对物理地址访问内存的 CPU 上运行程序,该程序中指令的地址也必须得是绝对物理地址。 总之,要想在该硬件上运行,就要遵从该硬件的规则,操作系统和编译器也无一例外。

 

让CPU采用“段基址+段内偏移地址”的方式来访问任意内存。这样的好处是程序可以重定位了,尽管程序指令中给的是绝对物理地址,但终究可以同时运行多个程序了。

 

什么是重定位昵,简单来说就是将程序中指令的地址改写成另外一个地址,但该地址处的内容还是原地址处的内容。

 

CPU 采用 “段基址+段内偏移地址”的形式访问内存,就需要专门提供段基址寄存器,这些是 cs 、 ds 、es 等 。程序中需要用到哪块 内存,只要先加载合适的段到段基址寄存器中,再给出相对于该段基址的偏移地址便可, CPU 中的地址单元会将这两个地址相加后的结果用于内存访问,送上地址总线。

 

程序分段首先是为了重定位

 

1MB是2的20次方,1MB内存需要20位的地址才能访问到,如何做到用16位寄存器访问20位地址空间呢?

(1)直接写成20位立即数不就行啦。例如 mov ax,[0x12345],这样最终的地址是ds+0x12345,肯定是20位,这种是直接寻址方式.

(2)CPU设计者在地址处理单元中动了手脚,该地址部件接到“段基址+段内偏移地址”的地址后,自动将段基址乘以 16,即左移了 4 位,然后再和 16 位的段内偏移地址相加,这下地址变成了 20 位了吧.

 

5.代码中为什么分为代码段,数据段?这和内存访问机制中的段是一回事吗?

 

理解平坦模型编程 和 多段模型编程?

 

只要给出 CPU 第一个指令的起始地址, CPU 在它执行本指令的同时,它会自动获取下一条的地址,然后重复上述过程,继续执行,继续取址 。 假如执行的每条指令部正确,没有异常发生的话,我想它可以运行到世界的尽头,能让它停下来的唯一条件就是断电.

 

程序中数据对齐,会造成数据间存在空隙,指令间不存在空隙。

 

Intel 处理器的程序计数器 es: eip能够自动获得下一条指令的原理,即将当前 eip 中的地址加上当前指令机器码的大小便是内存中下一条指令的起始地址 。 即使指令间有空隙或其他非指令的数据,这也仅仅是在物理上将其断开了,依然可以用 jmp指令将非指令部分跳过以保持指令在逻辑上连续

 

为了让程序内指令接连不断地执行,要把指令全部排在一起,形成一片连续的指令区域,这就是代码段 。 这样 CPU 肯定能接连不断地执行下去。指令是由操作码和操作数组成的,这对于数据也一样,程序运行不仅要有操作码,也得有操作数,操作数就是指程序中的数据 。 把数据连续地并排在一起存储形成的段落,就称为数据段。

 

指令是连续紧凑的

当前指令地址+当前指令长度=下一条指令地址

 

 

6.物理地址 逻辑地址 有效地址 线性地址 虚拟地址的区别

 

物理地址就是物理内存真正的地址,相当于内存中每个存储单元的门牌号,具有唯一性。不管在什么模式下,不管什么虚拟地址、线性地址, CPU 最终都要以物理地址去访问内存,只有物理地址才是内存访问的终点站。

 

无论在实模式或是保护模式下,段内偏移地址又称为有效地址,也称为逻辑地址,这是程序员可见的地址 。

 

 

 

7.什么是段重叠?

 

一个段最大为 64KB,其大小由段内偏移地址寻址范围决定,也就是 2 的 16 次方 。 其起始位置由段基地址决定。 CPU 的内存寻址方式是:给我一个段基址,再给我一个相对于该段起始位置的偏移地址,我就能访问到相应内存 。

 

 

8.什么是平坦模式?

 

 

 

9.cs ds 这类sreg段寄存器,位宽是什么?

 

 

10.什么是工程,什么是协议?

 

 

11.为什么linux系统下的应用程序不能在windows系统下运行

(1)各自运行的可执行文件格式不同

linux  elf格式

windows PE格式

(2)API不同,应用程序编程接口

linux API是系统调用

windows API 是DLL动态链接库

 

 

12.局部变量和函数参数为什么要放在栈中

 

堆和堆栈都是指的栈,在C语言的内存布局中,由于堆和栈的地址空间是接壤的,栈从高地址往低地址发展,堆是从低地址往高地址发展,堆和栈早晚会碰头.

 

函数参数为什么会放到栈区呢?

第一是其局部性导致的,只有这个函数用这个参数,何必将其放在数据段呢 。

第二这是因为函数是在程序执行过程中调用的,属于动态的调用,编译时无法预测会何时调用及被调用的次数,函数的参数及返回值都需要内存来存储,选择将为函数参数动态分配内存,也就是在每次调用函数时才为它在栈中分配内存。

 

c程序的内存布局

 

13.为什么说汇编语言比c语言快

首先汇编和c语言都要通过编译器翻译成机器指令,cpu执行机器指令

 

汇编语言比c语言要语句要少一些,没有一些多余的冗余的指令代码。

 

高级语言如 C 语言为了通用性等,需要兼顾的东西比较多,往往还加入了一些额外的代码,因此编译出来的汇编代码比较多,很多部分都是一些周边功能,并不是直接起作用的,不如用汇编语言直接写功能相关的部分效果来得更直接, C 语言被编译成机器指令后,生成的机器指令当然也包括这些额外的部分,相当于多执行了一些“看似没用”的指令,因此会比直接用汇编语言慢。

 

14.先有语言还是先有编译器,第一个编译器是怎么产生的?编译器的不断迭代发展?

 

15.编译型程序和解释型程序的区别

 

解释型语言,也称为脚本语言,如 JavaScript、 Python、 Perl、 PHP 、 Shell 脚本等。它们本身是文本文件,是某个应用程序的输入,这个应用程序是脚本解释器。

 

脚本中的代码从来没真正上过 CPU 去执行, CPU 的 CS: ip 寄存器从来没指向过它们,在 CPU 眼里只看得到脚本解释器,而这些脚本中的代码, CPU 从来就不知道有它们的存在。

 

解释型语言是如何执行的。我们在执行一个 PHP 脚本时,其实就是启动一个C语言编写出来的解释器而己,这个解释器就是一个进程,和一般的进程是没有区别的,只是这个进程的输入则是这个 php 脚本,在 php 解释器中,这个脚本就是个长一些的字符串,根本不是什么指令代码之类。只是这种解释器了解这种语法,按照语法规则来输出罢了。

 

编译型语言编译出来的程序,运行时本身就是一个进程。它是由操作系统直接调用的。也就是由操作系统加载到内存后,操作系统将 CS: IP 寄存器指向这个程序的入口,使它直接上 CPU 运行。总之调度器在就绪队列中能看到此进程。而解释型程序是无法让调度器“入眼”的,调度器只会看到该脚本语言的解释器。

 

16.什么是大端字节序,小端字节序?

 

内存是以字节为单位读写的,其最小的读写单位就是字节。故如果在内存中只写入一个字节, 一个内存的存储单元便可将其容纳了,只要访问这一内存地址就能够完整取出这1字节 。 可是1字节要能够表示的范围只有 O~255 (先只考虑无符号数),超过这个范围的数,只好用多个字节连在一起来表示。

 

(1)小端字节序是数值的低宇节放在内存的低地址处,数值的高宇节放在内存的高地址。

(2)大端字节序是数值的低宇节放在内存的高地址处,数值的高宇节放在内存的低地址。

 

看看这两种字节序的优势。

(1)小端:因为低位在低宇节,强制转换数据型时不需要再调整宇节了。

(2)大端:有符号数,其宇节最高位不仅表示数值本身,还起到了符号的作用。符号位固定为第 一字节,也就是最高位占据最低地址,符号直接可以取出来,容易判断正负。

 

ARM 体系的 CPU 则大小端字节序通吃,具体用哪类字节序由硬件选择。mips体系是小端字节序。字节序不仅是在 CPU 访问内存中的概念,而且也包括在文件存储和网络传输中。 bmp 格式的图片就属于小端字节序,而 jpeg 格式的图片则为大端字节序,这没什么可说的,采用什么序列完全是开发者设计产品时的需要。网络字节序就是大端字节序.

 

编译器的转换原则是强制转换到低精度类型,丢弃数值的高字节位,只保留数值的低字节.

int a = 0x12345678 (short)a = 0x5678

 

 

17.BIOS中断 DOS中断 Linux中断的区别?

 

在计算机系统中,无论是在实模式,还是在保护模式,在任何情况下都会有来自外部或内部的事件发生。

如果事件来自于 CPU 内部就称为异常,即 Exception。

如果事件由外部设备发出并通知了 CPU ,这个事件就称为中断。

 

BIOS 和 DOS 都是存在于实模式下的程序,由它们建立的中断调用都是建立在中断向量表( InterruptVector Table, IVT )中的。它们都是通过软中断指令 int 中断号来调用的。

 

中断向量表中的每个中断向量大小是 4 字节 。 这 4 字节描述了一个中断处理例程(程序)的段基址和段内偏移地址。因为中断向量表的长度为 1024 字节,故该表最多容纳 256 个中断向量处理程序。

 

计算机启动之初,中断向量表中的中断例程是由 BIOS 建立的,它从物理内存地址 OxOOOO 处初始化并在中断向量表中添加各种处理例程。

 

BIOS 中断调用的主要功能是提供了硬件访问的方法,说明通过 BIOS 调用也是可以访问硬件的。操作硬件无非是通过 in/out 指令来读写外设的端口, BIOS 中断程序处理是用来操作硬件的,故该处理程序中一定到处都是 in/out 指令

 

BIOS 为什么添加中断处理例程呢?

(1)给自己用,因为 BIOS 也是一段程序,是程序就很可能要重复性地执行某段代码,它直接将其写成中断函数,直接调用多省心。

(2)给后来的程序用,如加载器或 boot loader。它们在调用硬件资源时就不需要自己重写代码了

 

那这些硬件自己的接口代码在哪里呢?硬件自己的功能调用例程及初始化代码就存放在这 ROM中 。 根据规范,第 1 个内存单元的内容是 Ox55 ,第 2 个存储单元是 OxAA,第 3 个存储单位是该 rom 中以512 字节为单位的代码长度。从第 4 个存储单元起就是实际代码了,直到第 3 个存储单元所示的长度为止。

 

访问外设有两种方式。

(1)内存映射:通过地址总线将外设自己的内存映射到某个内存区域(并不是映射到主板上插的内存条中)。

(2)端口操作 :外设都有自己的控制器,控制器上有寄存器,这些寄存器就是所谓的端口,通过 in/out指令读写端口来访问硬件的内存。

 

从内存的物理地址 OxAOOOO 开始到 OxFFFFF 这部分内存中, 一部分是专门用来做映射的,如果硬件存在,硬件自己的 ROM 会被映射到这片内存中的某处,至于如何映射过去的

 

BIOS 在运行期间会扫描 OxCOOOO 到 OxEOOOO 之间的内存,若在某个区域发现前两个字节是 Ox55 和 OxAA 时,这意味着该区域对应的 rom 中有代码存在,再对该区域做累加和检查,若结果与第 3个字节的值相符,说明代码无误,就从第 4 个字节进入。这时开始执行了硬件自带的例程以初始化硬件自身,最后,BIOS 填写中断向量表中相关项,使它们指向硬件自带的例程。

 

软件中只要执行int中断向量号, CPU 便会把向量号当作下标,去中断向量表中定位中断处理程序井执行

 

DOS 是运行在实模式下的,故其建立的中断调用也建立在中断向量表中,只不过其中断向量号和 BIOS的不能冲突

 

Linux 内核是在进入保护模式后才建立中断例程的,不过在保护模式下,中断向量表己经不存在了,取而代之的是中断描述符表( Interrupt Descriptor Table, IDT )。该表与中断向量表的区别会在讲解中断时详细介绍 。所以在 Linux 下执行的中断调用,访问的中断例程是在中断描述符表中,己不在中断向量表里了。

 

Linux 的系统调用和 DOS 中断调用 类似,不过 Linux 是通过 int Ox80 指令进入一个中断程序后再根据eax寄存器的值来调用不同的子功能函数的 。 再补充一句:如果在实模式下执行 int 指令,会自动去访问中断向量表。 如果在保护模式下执行 int 指令,则会自动访问中断描述符表。

 

18.什么是魔数?

 

直接出现的一个数字,只要其意义不明确,感觉很诡异,就称之为魔数

 

如 elf 文件头 。

ELF Header:

Magic : 7f 45 4c 4 6 01 01 01 00 00 00 00 00 00 00 00 00

这个 Magic 后面的一长串就是魔数, elf解析器(通常是程序加载器)用它来校验文件的类型是否是 elf。主引导记录最后的两个字节的内容是 Ox55, Oxaa,这表明这个扇区里面有可加载的程序, BIOS 就用它来校验该扇区是否可引导 。

 

19操作系统是如何识别文件系统的。

 

比如若各分区的扇区以 0 开始索引,其第 1 个扇区便是超级块的起始扇区 。 超级块里面记录了此分区的信息,其中就有文件系统的魔数, 一种文件系统对应一个魔数,比对此值便知道文件系统类型了

 

20如何控制cpu的下一条指令

 

目的其实就是想知道如何牵着 CPU 的鼻子走

 

x86架构的cpu

cs 和 IP 是 CPU 待执行的下一条指令的段基址和段内偏移地址,不能直接用 mov 指令去改变它们,我想可能的一个原因是: mov 指令一次只能改变一个寄存器,不能同时将 cs 和 ip 都改变 。 如果只改变了其中一个会引起错误 。 如改变了 cs 的值后, ip 的值还是原先 cs 段的偏移,很难保证新的 cs 段内的偏移地址 ip 处的指令是正确的 。 因此,有专门改变执行流的指令,如 jmp 、 call 、 int、 ret,这些指令可以同时修改 cs 和ip,它们在硬件级别上实现了原子操作。

 

arm架构

汇编代码 mov pc ,r0 表示将寄存器而中的内容赋值给程序寄存器 PC,这样就直接改变了程序的执行流 。

 

程序计数器 PC 负责处理器的执行方向,它只是获取下一条指令的方法形式,在不同体系结构的 CPU 中有不同的实现方法。

 

21指令集 体系结构 微架构 编程语言

 

用0/1来为各种事物编码。

 

x86 是 CISC 指令体系外,

ARM、MIPS 、 Power、 C6000 都是RISC指令体系的指令集。

 

 

指令集是具体的一套指令编码,微架构是指令集的物理实现方式。

 

平时所说的编程语言,虽然其上层表现各异,归根结底是要在具体的 CPU 上运行的,所以必须由编译器按照该 CPU 的指集,翻译成符合该 CPU 的指令。说到这,不得不说一下交叉编译,本质上交叉编译就是用在 A 平台上运行的编译器,编译出符合 B 平台 CPU 指令集的程序,编译出的程序直接能在 B 平台上运行啦。这里的平台指的就是 CPU 指令体系结构。

 

22库函数是用户进程和内核的桥梁

 

操作系统提供了一套系统调用接口,用户进程直接调用这些接口就行啦。接口就是某个功能模块的入口,通过接口给该模块一个输入,它就返回一个输出。

 

比如 printf 函数所在的头文件是 stdio.b,该文件位于磁盘/usr/include/目录下,其中第 361行是对 printf 的声明。

extern int printf (const char *__restrict __format, ...);

 

gcc编译时加-E 参数就可以获取预处理后的文件内容。

gcc -E

 

头文件中一般仅仅有函数声明,这个声明告诉编译器至少两件事。

(1)函数返回值类型、参数类型及个数,用来确定分配的战空间。

(2)该函数是外部函数,定义在其他文件,现在无法为其分配地址,需要在链接阶段将该函数体所在的目标文件一同链接时再安排地址。

 

 

gcc编译时加-v 参数会将编译、链接两个过程详细地打印出来

gcc -v

 

/usr/lib/gcc/x86_64-linux-gnu/4.8/cc1

c语言编译器

 

as -v --64 -o /tmp/ccljkkJ9.o /tmp/ccl7tnJn.s 

as汇编编译器  /tmp/ccl7tnJn.s汇编文件

 

/usr/lib/gcc/x86_64-linux-gnu/4.8/collect2  collect2链接器 

/tmp/ccljkkJ9.o目标文件,/usr/lib/gcc/x86_64-linux-gnu/4.8/crtend.o /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crtn.o 链接为可执行文件

 

crt 是什么? CRT ,即 C Run-Time library ,是 C 运行时库。

运行时库是程序在运行时所需要的库,该库是由众多可复用的函数文件组成的,由编译器提供。所以, C 运行时库,就是 C 程序运行时所需要的库文件,在我们的环境中,它由gcc提供。

 

ltrace -S ./hello

ltrace -e trace=write ./hello

strace ./hello

追踪进程的系统调用

 

(1 )操作系统有自己支持、加载用户进程的规则,而 C 运行时库是针对此操作系统的规则,为了让用户程序开发更加容易,用来支持用户进程的代码库。大家要明白,之所以我们写个程序又链接这又链接那的,完全是因为操作系统规定这样做,人在屋檐下,不得不低头。

(2 )用户进程要与 C 运行时库的诸多目标文件链接后合并成一个可执行文件,也就是说我们的用户进程被加进了大量的运行库中的代码。

(3) c 运行时库作用如其名,是提供程序运行时所需要的库文件,而且还做了程序运行前的初始化工作,所以即使不包含标准库文件 f 链接阶段也要用到 c 运行时库。

(4 )用户程序可以不和操作系统打交道,但如果需要操作系统的支持,必须要通过系统调用,它是用户进程和操作系统之间的“钩子”,用户进程顶多算是个半成品,只有通过钩子挂上了操作系统,加了上所需要的操作系统的那部分代码,用户程序才能做完一件事,这才算完整,后面章节会有详解。

(5 )尽管系统调用封装在库函数中,但用户程序可以直接调用“系统调用”,不过用库函数会比较高效(后面章节会有详解)。

 

 

23转义字符与ascii码

ascii 码分 可见字符 和 不可见字符

ASCII 码表中任何字符都是 1 个字节大小

xxd 命令可以逐字节查看文件, xxd.sh 脚本内容

xxd -u -a -g 1 -s $2 -l $3 $1

 

 

24 MBR EBR DBR OBR各是什么?

 

这几个概念主要是围绕计算机系统的控制权交接展开的,整个交接过程就是个接力赛,必须采取控制权接力的方式,一步步地让处理器执行更为复杂强大的指令,最终把处理器的使用权交给操作系统

 

算机在接电之后运行的是基本输入输出系统 BIOS ,大伙儿知道, BIOS 是位于主板上的一个小程序,其所在的空间有限,代码量较少,功能受限.

 

MBR位于整个硬盘最开始的扇区。

MBR 是主引导记录, Master 或 Main Boot Record ,它存在于整个硬盘最开始的那个扇区,即0盘0道1扇区,这个扇区便称为 MBR 引导扇区.一般情况下扇区大小是 512 字节

 

在 MBR 引导扇区中的内容是:

(1) 446 字节的引导程序及参数:

(2) 64 字节的分区表:

(3) 2 字节结束标记 Ox55 和 Oxaa。

 

BIOS 知道 MBR 在0盘0道1扇区,这是约定好的,因此它会将0盘0道1扇区中的 MBR 引导程序加载到物理地址 Ox7c00,然后跳过去执行,这样 BIOS 就把处理器使用权移交给 MBR 了.

 

"主引导程序”去找“次引导程序”

 

MBR 引导扇区中除了引导程序外,还有 64 字节大小的分区表,里面是分区信息。分区表中每个分区表项占 16 字节,因此 MBR 分区表中可容纳 4 个分区,这 4 个分区就是“次引导程序”的候选人群, MBR 引导程序开始遍历这 4 个分区,想找到合适的人选并把系统控制权交给他。

 

 

为了 MBR 方便找到活动分区上的内核加载器,内核加载器的入口地址也必须在固定的位置,这个位置就是各分区最开始的扇区,这也是约定好的。这个“各分区起始的扇区”中存放的是操作系统引导程序一一内核加载器,因此该扇区称为操作系统引导扇区,其中的引导程序(内核加载器〉称为操作系统引导记录 OBR,即 OS BootReco时,此扇区也称为 OBR 引导扇区

 

EBR 与 MBR 结构相同,但位置和数量都不同,整个硬盘只有 1 个 MBR,其位于整个硬盘最开始的扇区0道道 1 扇区。而 EBR 可有无数个,具体位置取决于扩展分区的分配情况,总之是位于各子扩展分区最开始的扇区,如果此处不明白子扩展分区是什么,到了以后跟踪分区的章节中大伙儿就会明白。 OBR其实就是 DBR,指的都是操作系统引导程序,位于各分区(主分区或逻辑分区)最开始的扇区,访扇区称为操作系统引导扇区,即 OBR 引导扇区。 OBR 的数量与分区数有关,等于主分区数加逻辑分区数之和,友情提示:一个子扩展分区中只包含 1 个逻辑分区。

 

MBR 和 EBR 是分区工具创建维护的,不属于操作系统管理的范围,因此操作系统不可以往里面写东西,注意这里所说的是“不可以”,其实操作系统是有能力读写任何地址的,只是如果这样做的话会破坏“系统控制权接力赛”所使用的数据,下次开机后就无法启动了。 OBR 是各分区(主分区或逻辑分区〉最开始的扇区,因此属于操作系统管理

 

DBR、 OBR 、 MBR、 EBR 都包含引导程序,因此它们都称为引导扇区,只要该扇区中存在可执行的程序,该扇区就是可引导扇区。若该扇区位于整个硬盘最开始的扇区,并且以 Ox55 和 Oxaa结束, BIOS就认为该扇区中存在 MBR,该扇区就是 MBR 引导扇区。若该扇区位于各分区最开始的扇区,井且以 Ox55和 Oxaa结束, MBR 就认为该扇区中有操作系统引导程序 OBR,该扇区就是 OBR 引导扇区。DBR 、 OBR、MBR、 EBR 结构中都有引导代码和结束标记 Ox55 和 Oxaa,因此很多同学都容易把它们搞混。不过它们最大的区别是分区表只在 MBR 和 EBR 中存在, DBR 或 OBR 中绝对没有分区表。 MBR、EBR 、 OBR 的位置关系如图 0-21 所示。

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Linux技术芯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值