保护模式下仍用 段:偏移地址 表示实际的物理地址。即os中学的段式存储机制。
完成实模式到保护模式的跳转后,段R中的值其实就变成了 Selector。
将段寄存器的值(Selector)经过gdt的映射后 与 偏移地址(小于段的界限)相加 得到最终的物理地址。
段描述符 共64位 其中段基址32位 段的最大界限20位 段的一些属性12位。段基址和界限由于历史原因被拆开存放。
尽管每个段寄存器事实上有一个64-bit长的不可见部分,但Intel为了保持向后兼容,对于程序员来说,段寄存器就是16-bit的,那么我们无法通过16-bit长度的段寄存器来直接引用64-bit的段描述符。
将段描述符集中起来形成一个数组,这个全局的数组就是GDT。将段寄存器中的值作为下标索引来间接引用(将段寄存器中的高13 -bit的内容作为索引),这就是所谓的选择子Selector。它的作用就是定位所需的段描述符。(相对于gdt基址的偏移)
GDT可以被放在内存的任何位置,那么当程序员通过段寄存器来引用一个段描述符时,CPU必须知道GDT的入口,也就是基地址放在哪里,所以 Intel的设计者门提供了一个寄存器GDTR(48位)用来存放GDT的入口地址。
程序员将GDT设定在内存中某个位置之后,可以通过LGDT指令将GDT的入口地址装入GDTR寄存器, CPU就根据此寄存器中的内容作为GDT的入口来访问GDT了。
寄存器cr0的第0位PE == 0 代表cpu运行于实模式 pe==1 代表cpu运行于保护模式。开机启动时,运行于实模式。
为什么叫保护模式呢?它“保护”了什么?答案是进程的内存。保护模式的主要目的在于允许多个进程同时运行,并保护它们的内存不受其他进程的侵犯
汇编语言不是结构化的语言,因此,它不提供直接的“局部变量”。如果需要“局部变量”,只能通过堆或栈自行实现