The Long Walk2.0

保护模式Protected mode
It has been for almost a whole month that I do not update my blog, since I was extremely busy about my IBDP course. And I also started to take a scientific research with a Doctor, the content is about CNN and facial detection. Thus, I did not totally focus on the study about OS. In recent, I found a book which seemingly quite helpful to my work, it is called “X86From real mode to protected mode”, it’s precise and detailed narration shed me light to my next step.

我似乎已经一整个月没有更新我的博客了,因为我一直忙于我的IBDP课程。同时我在T大一位博士的指导下,开始了一项关于卷积神经网络在人脸识别领域的科研项目。因此,我并没有能专注于对操作系统的学习和研究。最近,我找到一本似乎很有帮助的书,《X86从实模式到保护模式》,其中清晰且细节的讲述为我下一步的学习指明了方向。

I have summed up the notes I took during I studied two chapters among it. My plan would be: First, finish the protected mode knowledge in the book, meanwhile study OS concept; second, start to read: Organe: a realization of operating system meanwhile write it by myself.

全局描述符
在保护模式下,对内存的访问仍然使用段地址和偏移地址,但每个段在访问前要进行登记
段要用8个字节来进行描述(segment descriptor)
为了存放这些描述符,需要在内存中开辟一段空间——描述符表(Global Descriptor Table) GDT
为了跟踪全局描述符表,处理器中有一个48位寄存器,成为全局描述表寄存器(GDTR)
该寄存器分两部分32位线性地址(全局描述符表起始线性地址)和16位边界(其界限 等于表大小减一==表内最后一个字节的偏移量)
在进入保护模式后,处理器会立刻以新的内存访问方式工作,所以必须爱进入保护模式前定义GDT

存储器的段描述符
看懂啦!

每个描述符在GDT中占8字节,64位
G位是粒度(Granularity)位,用于解释段界限的含义;当G0,段界限以字节为单位,此时段的扩展范围是1B-1MB;当G1,段界限以4KB为单位,界限为4KB-4GB
S为指定描述符的类型(Descriptor Type)当该位是0时,表示一个系统段;为1时,是一个代码或数据段
DPL是描述符特权级(Descriptor Privilege Level)指定段的特权级;不同特权级别的程序是相互隔离的,其互访严格限制
P是段存在位,用于指示描述符所对应的段是否存在;当内存紧张时,只建立描述符,对应的内存空间却不存在,此时P位为0;换页时,将段换入硬盘时也要清零,P位是由处理器负责监测的,每当通过描述符访问内存中的段时,如果P是0,处理器产生异常终端(由OS提供)处理过程的任务是将磁盘中的该段换回来
D/B位是默认的操作数大小,默认的栈指针大小,或上部边界标志
L是64位代码段标志,保留此位给64位处理器使用
TYPE字段共4位 指示标识符的子类型

安装存储器的段描述符并加载GDTR

第21条地址线A20问题
处理器有A20M引脚,意为A20屏蔽,低电平下有效
存在一个端口0X92,其中7-2位保持未使用,0位为INIT_NOW(现在初始化),用于初始化处理器。当这个端口被写入1时,处理器复位,计算机重新启动
端口0x92的位1用于控制A20,称为Alternate A20 Gate ALT_A20_GATE
这个端口是可读写的,将其中的数据读出,在将第二位置1,在重新写入断口

保护模式下的内存访问
两种模式的切换开关在于一个CR0的32位寄存器(Control Register,CR)
其位1是保护模式允许位(Protection Enable,PE),如果该位为1,则进入保护模式
但保护模式下原有的中断机制都不再适用,必须在重新设置保护模式下的中断环境前,必须关闭中断(cli;)

段选择器和描述符高速缓存器
32位处理器的6个段寄存器分为2部分,前16位与8086相同,这是为何8086程序可以继续在32位处理器上继续运行的原因。每个段寄存器还包括一个不可见的部分,成为描述符高速缓存器,用来存放段界限、线性基地址、段属性

保护模式的内存访问,也需要指定一个段,但传送到段选择器的内容不是逻辑段地址,而是段描述符在描述符表中的索引号
分为三部分,
第一部分是描述符的索引号
第二部分是TI,描述符表指示器(Table Indicator)TI = 0,表示描述符爱GDT中
TI = 1,描述符在LDT中
第三部分是RPL请求特权级,表示给出当前选择子的那个程序的特权级别(访问该内存段的程序)

当处理器在执行任何改变段选择器的指令时,就将指令中提供的索引号乘以8作为偏移地址,同GDTR里的线性基地址相加,以访问GDT
此后,每当有访问内存的指令时,就不再有访问GDT中的描述符,直接用当前段寄存器描述符高速缓存器提供线基地址。

发布了47 篇原创文章 · 获赞 10 · 访问量 1723

猜你喜欢

转载自blog.csdn.net/Antonio_Salieri/article/details/102882128