《自己动手写操作系统》是本很有意思的书。不过于渊前辈对某些内容没有给出更多的解释,让我们这些新米很难上手。
书中第3章介绍保护模式的时候,题到了GDT这个东东。在这里给出一个更浅显的介绍。
在介绍GDT这个概念前,现介绍一下segmentation这个概念。
大家还记得ORG这个汇编命令吧。书的开篇,给出的boot.asm代码的第一行就是:
ORG 0x7c00
这个ORG就是告诉CPU,程序被载入内存的0x7c00这个地方了。也就是说CPU从这个内存地址开始读取指令就OK了。
但是,现在的CPU同时执行好几个程序是很正常的事情。那么不同的程序使用的内存就有可能重叠,这样载入程序的话就会发生冲突。解决方法之一就是把把内存分成若干个段(segmentation)。每段放一个程序,这样每个程序都可以声明ORG 0了。很方便。
(另一个解决方法是paging,这个以后有机会在谈。)
为了能使用segmentation, 每个段(segment)都需要清楚的表明以下信息:
- 段(segment)的大小。
- 段在内存中的开始位置。
- 段的管理属性。比如只读,系统专用等等
CPU用8bytes(=64bits)来表示这些信息(叫做descriptor)。但是,CPU用来指定段的register只有16bits。就算是32bit的CPU,这个register也是16bits的。那怎么办呢?
方法就是每个segment给一个"编号"(正式叫做segment selector),然后在把这个编号放在register里就好了。剩下的工作就是让编号和segment一一对应起来。
大概的感觉是这样的:
1号segment的大小是4GB,从内存的0000开始。(也就是指整个内存了。)
2号segment的大小是xxKB,从内存的xxxx开始。。。。
segment的编号为0~8191。 刚才说了,segment register是16bits,按理说应该可以存放2**16 = 65536个编号。但是由于CPU设计式样的问题,最低3bits不能用,也就是只有13bits可用,刚好是2**13=8192个。
每个segment的描述需要8bytes,一共就需要8192*8=64KB。CPU里可没有这么大的空间。所以就放在内存里好了。这个64KB(可以小于这个值),记录了分段信息的数据结构就叫做GDT -- Global (segment) Descriptor Table. 我不知道这个东东的正式翻译是什么,直译过来就是一个存放了描述分段信息的表。
这次介绍了GDT的概念和这个东东是怎么来的,干什么用的。
下次介绍segment descriptor的数据结构,和如何使用。
分享到:
相关推荐
4. **GC - 最小区域法尺寸**:这部分内容在提供的信息中没有具体解释,但通常GC可能指的是在特定区域内,零件特征尺寸的最大和最小极限。这种定义常用于确保零件特征在整个区域内的尺寸一致性。 每个尺寸定义都有其...
以上内容详细解释了实模式与保护模式的区别,以及描述符、GDT、LDT、GDTR和LDTR在内存管理和地址转换中的作用,这些都是理解x86体系结构和操作系统内存管理的基础。在安全方面,这些机制为现代操作系统提供了必要的...
根据提供的文件信息,《汽车理论名词解释学习.pdf》是一个关于汽车理论的专业学习文档,它旨在对汽车领域的专业术语和概念进行解释和阐述。从给出的内容部分中,尽管由于OCR扫描的限制存在一些错误和不清晰的文字,...
由于内容是经过OCR扫描可能存在识别错误,以下内容将尝试对提供的片段进行理解并尽可能通顺地解释。 从提供的文件内容中可以提取出以下几个知识点: 1. GDT陶瓷气体放电管K3RLxxxM-5SD的功能与作用 GDT陶瓷气体...
首先,通过选择子(Segment Selector)在全局描述符表(GDT)、局部描述符表(LDT)或中断描述符表(IDT)中找到段描述符,获取段基址和段限制等信息。然后,段基址与段内偏移量(逻辑地址)相加得到线性地址。如果...
以下是对这些概念的详细解释: 1. **BIOS启动过程**: 当计算机开启时,CPU处于实模式,此时内存未初始化,无法直接执行硬盘上的操作系统代码。BIOS(基本输入输出系统)首先运行,进行硬件自检(POST),设置中断...
- **内存保护**:保护模式下,每个进程都有自己的独立地址空间,通过全局描述符表(GDT)和局部描述符表(LDT)来控制对不同内存区域的访问权限。 - **分页机制**:通过分页机制(Paging),处理器能够将物理内存...
下面将依次详细解释这些练习题目的知识点。 1. 操作系统镜像文件uwreim的生成过程: Makefile文件中包含了操作系统生成的命令和脚本,它告诉编译器和链接器如何处理源代码文件来生成最终的可执行文件。首先,所有...
补充:关于GDT/LDT、段选择子和段描述符的解释 GDT/LDT:GDT/LDT是段描述符表,里面定义了每个段的段描述符的界限和属性,而段描述符的基址是在代码段中初始化的。 其中,LDT是局部描述符表,LDT在GDT中也有段...
以下是对文档中提到的一些关键知识点的详细解释: 2.9 该题目涉及微处理器的读操作时序。读操作占用一个总线周期,包括4个时钟周期加上1个等待周期,总共是5个时钟周期。如果时钟频率为1/4MHz,那么每个时钟周期为...
以下是该模式下的主要概念的详细解释: 1. **段** - 存储段:存储段是程序直接访问的代码和数据的容器,没有特定的内部结构,可以存放代码或数据。 - 系统段:包括任务状态段(TSS)和局部描述符表(LDT)段,...
- 在保护模式下,通过 GDT、LDT 和 IDT 中的界限、特权级等属性提供对描述符所描述对象的保护。 - 在不同特权级间的访问时,系统会对 CPL、RPL、DPL、IOPL 等进行检查,保护不同层级的程序,并限制某些特殊指令的...
- **具体解释**:BIOS在计算机启动过程中承担着初始化硬件设备、检测硬件状态等任务。它通过设置实模式下的中断向量表和服务程序,并将操作系统的引导扇区加载至0x7C00内存地址,使得操作系统能够在此基础上继续加载...
这里解释了如何在不同的上下文之间切换堆栈和全局描述符表。 **5.5.2 整理我们的文件夹** 为了保持代码的清晰和有序,这部分内容介绍了如何合理地组织项目文件。 **5.5.3 Makefile** Makefile是一种用于自动化...
这个项目由赵炯的著作启发,对Linux 0.11版本的源码进行了详尽的注释,包括汇编语言的逐行解释和相关背景知识的补充,旨在使读者能够更好地理解和欣赏代码的编写风格。此外,还创建了Source Insight工程,这是一个...
以下是对这些知识点的详细解释: 1. **Bootloader**: - Bootloader是操作系统启动的第一部分,负责加载和启动操作系统。在ucore实验中,bootloader是一个简单的软件,它的主要任务是切换到x86的保护模式并显示...
根据文件所提供的信息,我们可以从中提取一系列与GDT陶瓷气体放电管K2RMxxxM-8系列相关的IT知识点。以下详细解释了文档中提及的各个技术参数和应用领域。 首先,关于K2RMxxxM-8系列气体放电管的特征(FEATURES): ...
例如,当用户程序调用系统API时,实际上可能通过一个中断门跳转到相应的系统服务例程。 **文件内容关联** "www.pudn.com.txt"可能包含关于这个话题的更详细信息,如具体的操作步骤、示例代码或解释。而"NT环境下...
本书还深入解释了一些复杂的概念,如保护模式、虚拟内存、IDT、GDT、任务状态段、系统调用、函数调用协议、栈帧等。这些概念对于理解操作系统的工作原理和软件的底层运行机制至关重要。 综上所述,《软件调试》不仅...
2.51题则可能涉及了全局描述表(GDT)的使用,解释了如何根据给定的信息确定段描述符的内容和GDT的容量。 通过以上习题的解答,我们可以深入理解微机系统中的基本概念、工作原理和设计策略。这些知识对于理解和开发...