虚拟内存,它可以将每个进程的地址空间都隔离开,极大地减轻了程序员的负担,同时由于页表项中有多种权限保护标志,极大地提高了应用程序的数据安全。所以人们把 CPU 的这种工作模式称为保护模式(Protection Mode)。
8086 的寄存器只有 16 位,我们也习惯于称 8086 的工作模式是 16 位模式。而且,后面的 CPU 为了保持兼容,在芯片上电了以后,还必须运行在 16 位模式之下,这种模式有个正式的名字,叫做实模式(Real Mode)。在实模式下,程序员是不能通过内存管理单元(Memory Management Unit, MMU)访问地址的,程序必须直接访问物理内存。
相比 8086 芯片,i386 中多了一个叫全局描述符表(Global Descriptor Table, GDT)的结构。它本质上是一个数组,其中的每一项都是一个全局描述符,32 位的段基址就存储在这个描述符里。段选择子本质上就是这个数组的下标。
段寄存器仍然是 16 位寄存器,但是其中存的不再是段基址,而是被称为段选择子的东西。
CPU 在处理一个逻辑地址“cs:offset”的时候,就会将 GDTR 中的基址加上 cs 中的下标值来得到一个段描述符,再从这个段描述符中取出段基址,最后将段基址与偏移值相加,这样就可以得到线性地址了。
相比页式管理,段式管理的优点是提供更好的安全性,按照内存的用途进行划分更符合人的直观思维。它的缺点就是由于不定长,难于进行分配、回收调度。
而页式管理的优点是大小固定,分配回收都比较容易。而且段式管理所能提供的安全性,在现代 CPU 上也可以被页表项中的属性替代,所以现在段式管理已经变得越来越不重要了。
现代的操作系统都是采用段式管理来做基本的权限管理,而对于内存的分配、回收、调度都是依赖页式管理。
段式管理负责将逻辑地址转换为线性地址,或者称为虚拟地址,页式管理负责将线性地址映射到物理地址。i386 的保护模式采用了段页式混合管理的模式,兼具了段式管理和页式管理的优点。
中断描述符表(Interruption Description Table, IDT),是 i386 中一个非常重要的描述符表,它也是保护模式对比实模式的另一大不同。
硬件负责产生中断,CPU 会响应中断,但是中断来了以后要做什么事情是由操作系统定义的。操作系统要通过设置某个中断号的中断描述符,来指定中断到达以后要调用的函数。中断描述符表(IDT)的作用就体现在这了,它的本质就是中断描述符的数组。
比较重要的中断向量号:
此文章为7月Day2学习笔记,内容来源于极客时间《编程高手必学的内存知识》