汇编知识点-地址模式和段

实地址模式

  IA-32处理器使用20位的地址线.可访问1MB字节内存.范围(0-FFFFF).

  因为8086的16位寄存器不能存放20位的地址.因此提出了分段内存的解决方案.每段(segment)64KB.

  类似解决方案也被用到了保护模式中供大范围寻址.

  地址被表示为:段地址+内部偏移地址.段地址最后一个0被省略了.如此一个段地址可被装在16位寄存器里.

  如8000h+260h.线性地址即80250h.线性地址(linear address)或被称为绝对地址(absolute address).

  典型的程序有三个段:代码段,数据段和堆栈段.3个段寄存器CS, DS, SS包含程序代码段,数据段,堆栈段的基地址.

  ES, FS和GS可指向其他数据段.

保护模式

  每个程序可以寻址4GB内存(0-FFFFFFFF).最常运行的模式.

  微软汇编器的平坦内存模式适用于保护模式.

  只需使用一个32位整数即可存放任何指令和变量地址.

  段寄存器指向段描述符表.

  典型的保护模式程序有3个段:代码段,数据段和堆栈段,使用CS,DS和SS三个段寄存器.(但它们是16位的?)

   

  平坦分段模式

      1 该模式所有段都被映射到计算机32位物理地址空间中.

      2 至少需要2个段:代码段和数据段.

      3 每个段都由一个段描述符表定义.段描述符通常是存放在全局描述符表(GDT)中的一个64位值.

      4 段描述符中有基址,界限,访问类型等等域.其中段界限域用于表示系统中物理内存的数量,即该段描述符所包含的该界限

         的内存是没用间隙,可以安全使用的.其他模式没有这个界限,因此相对不安全.

       假设一台计算机有256MB内存,某个段描述符表表示所有可用物理内存.那么短界限域将包含十六进制值(10000).因为其

       隐含的要乘以十六进制值1000,最终得到十六进制值10000000(256MB).  

  多段模式

      该模式下,每个任务都有自己的段描述符表.称为局部描述符表(LDT).

      每个描述符都可指向一个与其他所有进程使用的段都不同的段.并且每个段都位于独立的地址空间中.

      段描述符包含:基址,界限,访问类型等字段.

      00026000  0010 

      00003000  0002

      如上,3000开始的段大小是0x2000,计算过程为:0x0002*0x1000. 

   分页

      IA-32处理器支持分页(paging).运行一个段被分割成称为页(page)的4096字节.

      分页机制允许同时运行的程序使用的总内存远大于计算机的物理内存.

      所有页的集合称为虚拟内存.

原文地址:https://www.cnblogs.com/flytrace/p/3157346.html