对于任何进程来说,不都是4G的可用空间吗?
CS、DS、ES、FS寄存器的值有什么约束,是否一定要求相等,为什么?

解决方案 »

  1.   

    ruihuahan(飞不起来的笨鸟)说的不对!至少是不全面。虽然在保护模式下,采用了页表的寻址方式,但是这只是一部分!
    保护模式下的虚拟地址(逻辑地址)到物理地址的转换需要两次,第一次是从逻辑地址到线性地址。这一点与8086一样,需要从段寄存器中内容和32位编译量;从线性地址到物理地址才是需要页表,转换成虚拟地址。第一次是为了兼容,第二次才是为了实现虚拟存储。这就是IntelCPU的两级存储。有一些CPU只用到了“段”,有一些CPU只用到了“页”。如果没有第二步的转换,线性地址就是物理地址,那么与8086的寻址也就一样了。
    只不过CS等段寄存器(还是16位)中保存的不是段基址,而是段选择子!根据这16位的段选择子可以从一个段描述符表中找到一个段描述符64位,根据描述符就可以查到段基址。那你说这么麻烦干吗?除了可以寻找到段基址32位以外,描述符还有20位的段界限(可以限制你的访问范围),还有12为属性。根据属性的不同,你的代码就不能随便访问(读、写、执行)不该访问的内存区域。另外,描述符的DPL域,也说明的代码段和数据段的特权级别。必须在一定的条件下(如DPL>=MAX(CPL,RPL))才可以访问。这些描述符种类繁多,我就不一一给你说了。这就是所谓的保护!
      

  2.   

    有了这些限制(特权级别的检查以及属性的匹配),就不能像以前一样可以直接访问任何内存了。
    虽然每个进程都是4G,但是你不能随便访问别的进程,比如说一些操作系统的内核进程,运行在Ring0级,而一般的应用程序运行在Ring3,你就不能访问了,也不会破坏操作系统了。当然一些系统调用可以通过各种“门”(调用门、中断门等)来进行。还有,即使是特权级都是Ring3级的进程,你也不能随便访问别的进程,防止破坏别人的数据。
      

  3.   

    我倒是觉得,真正的保护在第一步从从逻辑地址到线性地址,而不是ruihuahan(飞不起来的笨鸟)所说的页寻址。采用分页管理的目的和优点在于提高存储效率,实现远大于物理内存的内存,使得编程不必在意内存的大小。