保护模式汇编系列之一

来源:互联网 发布:java web看什么书 编辑:程序博客网 时间:2024/05/23 13:46
  从80386开始cpu有了三种运行模式,就是实模式,保护模式和虚拟8086模式,实模式只能访问1M的内存,而保护模式却可以访问全部的4G的内存,也沿用至今,
内存保护,分页系统,硬件支持的虚拟内存都是保护模式的特色。
  80386扩展了8086处理器,从原来的AX等扩展到了32位EAX等,对cpu来讲,系统中的所有存储器中的储存单元都处于一个统一的逻辑储存器中,它容量收cpu寻址能力的限制,这个逻辑存储器就是线性地址空间,8086是20根地址总线,所以访问1M的线性地址空间,而80386有32位地址线,拥有4G的线性地址空间,但是80386保留了8086采用的地址分段的方式,只分一个段,段基址0x00000000段长0xffffffff,整个线性空间看作一个段,平坦模型
线性地址不仅仅是内存地址,还有其他的存储器编址在里面,对80386,保护模式下如果开启分页,内存物理地址的访问就不一定是线性地址了,而是需要根据页映射转换到实际的物理地址。
     对于内存分段中每一个段的描述,内模式对于内存段没有访问控制,任意的程序可以修改任意地址的变量,而保护模式需要对内存段的性质和允许的操作给出定义,以实现对特定内存段的访问检测和数据保护,32位保护模式下对一个内存段的描述需要8个字节,称之为段描述符(Segment Descriptor),段描述符分为数据段描述符,指令描述符和系统描述符三种,大致相同。
寄存器是不足以存放N多个内存段的描述符集合,所以这些描述符集合都放在描述符表中了,有很多描述符表,最重要的是GDT,为整个软硬件系统服务
  
问题是这些描述符表放在内存的哪些地方,cpu又如何知道,所以intel的做法是直接设置了一个48位的全局表述表寄存器GDTR来保存GDT的信息

所以cpu如何从实模式到保护模式的呢,80386cpu内部有着5个32为控制寄存器CR,CR0-CR3,CR8,其中CR0寄存器的PE位(Protection Enable)0号位,表示了CPU的运行状态,0为实模式,1为保护模式,修改就可以改变cpu的工作模式

段寄存器从8086改到段选择子,CS等寄存器不再保存段基址,而保存其指向段的索引信息
1 0
原创粉丝点击