Windows内存管理

来源:互联网 发布:php输出九九乘法表 编辑:程序博客网 时间:2024/06/09 23:35

一.虚拟地址转换成线性地址

一些预备知识:

段描述符:描述一个段的属性和保护模式下其他参数的数据(基址,限长,优先级),一个段描述符占8B

GDT:全局描述符表,包含系统中所有任务都可用的段描述符,通常包含描述操作系统所用的代码段,数据段和堆栈段的描述符以及各任务的LDT段。

LDT:局部描述符表,每个任务都有一个独立的LDT,它包含每个任务私有的代码段,数据段,堆栈段的描述符和该任务所使用的一些门描述符。


虚拟地址格式表示为:          xxxx:yyyyyyyy

 

xxxx表示段选择器中的内容,共16位,高13位为段描述符位置索引,低3位其他用途

yyyyyyyy表示段内偏移地址

 

计算线性地址,首先找到段基址,最后加上段内偏移。

段基址的计算分成两种情况:

1.段选择器中TI位为0

1)先从GDTR寄存器中获取GDT的基址


2)段描述符的位置=GDT基址+段选择器中索引值*8B

3)从段描述符中得到段基址

2.段选择器中TI位为1(表示段描述符在LDT中)

1)也是从GDTR中获取GDT基址

2)从LDTR中获取LDT所在段的位置索引,记S


3)此LDT的段描述符位置=GDT基址+S*8B

4)从此段描述符中获取LDT基址,记A

5)最终的段描述符位置=A+段选择器中索引值*8B

6)从最后的段描述符中得到段基址

如果 段基址 + 段内偏移 < 段限

则 线性地址 = 段基址 + 段内偏移

二.线性地址转换成物理地址

80386新增控制寄存器CR0,第32位(位31)PG位控制是否启用内存分页机制。PG=1时启用,线性地址需通过地址映射机制转换成物理地址。PG=0时不启用,线性地址就是物理地址。

(未完待续...)

三.Windows特权保护

"门":指向某个优先级高的程序所规定的入口点,所有优先级低的程序调用优先级高的程序只能通过门重定向,进入门所规定的入口点。

IDT:中断描述符表,每个描述符占用8B,包括门的种类和中断服务程序入口地址,IDTR中高32位为IDT在内存中的基址(线性地址),低16位为IDT长度(相当于指定了中断数量)

  windows使用DLL来代替中断服务程序提供系统功能,所以win32汇编中int指令失去意义,调用API的指令就相当于使用int指令完成系统功能。虽然80x86处理器设置了4个优先级(0~3级),0为特权级,3为用户级,为了便于移植到Alpha计算机,windows只支持0,3两个优先级。

(未完待续...)



0 0