鱼c win32汇编 第一章1.3.2 windows的内存管理

Windows的内存管理
DOS系统的内存安排:
由于8086处理器的寻址范围只有1MB
1MB=384KB+40KB+600KB
1.分走384KB高地址内存用于显示的视频缓冲区和BIOS的地址空间
2.分走40KB低地址内存用于存放中断向量表和BIOS数据区还有DOS使用一部分
3.分走600KB供应用程序和TSR程序共同使用(TSR一些程序的尾巴)
80386有了4GB的寻址能力,但是16位的段寻址方式限制了DOS程序,要用XMS驱动程序当做数据交换使用,程序的执行空间并没有什么增加。

80386的内存寻址机制
实模式下内存寻址方式:
一个完整的地址有段地址和偏移地址组成。
1.段地址放16位段寄存器中
2.在指令中用16位的偏移地址寻址。
处理器换算:
1.段地址*10H,得到物理内存中的起始地址
2.加上16位的偏移地址得到实际的物理地址
3. XXXX:YYYY格式的虚拟地址,在内存中实际位子=XXXX*10H+YYYY
80386通用寄存器是32位的,所以用任何一个通用寄存器来间接寻址,不用分段就可以访问所有的内存地址。
80386段寄存器是16位用来做索引信息,改名叫段选择器,通过它在段描述符表中选择一个项目得到段的全部信息。
段选择器高13位放索引值,第0,1位放当前程序的优先级RPL,第2位TI位用来表示段描述符的位置;TI=0在GDT(全局),TI=1在LDT(局部)

80386引入了两个新的寄存器用来管理段描述符表:
48位全局描述附表寄存器GDTR,GDTR指向的描述符表位全局描述符表GDT:
1.包含系统中所有任务都可用的段描述符
2.包含描述操作系统所使用的代码段、数据段和堆栈段的描述符
3.各任务的LDT段
4.全局描述符表只有一个

16位局部描述符表寄存器LDTR,LDTR指向局部描述符表LDT:
1.每个任务都有一个独立的LDT
2.每个任务都有私有的代码段数据段堆栈段的描述符,
3.包含该任务所使用的一些门描述符,如任务门和调用门描述符

使用:
以保护模式为例:段选择器IT位=0
1.从GDTR寄存器获取GDT的基地址,
2.GDT中以段选择器的高13位当做位置索引得到段描述符(包含了基址限长优先级等各种属性)
3.得到了段的起始地址
4.基址加上偏移地址YYYYYYY得到最后的线性地址

以保护模式为例:段选择器IT位=1
1.从GDTR寄存器获取GDT的基址,
2.从LDTR寄存器获取LDT所在段的位置索引
3.以这个位置索引在GDT中得到LDT段的位置
4.用段选择器的高13位做索引从LDT段中获得段描述符
5.从这个描述符得到段的基址等信息
6.基址加上偏移地址YYYYYYY得到最后的线性地址

80386的内存分页机制
在保护摸下才能实现,实模式不支持,程序不关心数据放哪里,只要是连续线性就行管你用什么方法
页表规定的不仅是映射,还规定了页的访问属性,如是否可写可读可执行,比如把代码所在的内存设置为可读可执行,那么权限不够的代码向里面写入就会引发保护异常,这个机制可以在硬件层次上支持虚拟内存的实现

出现的原因:
1.一个TSR程序退出后有尾巴留着内存,把内存分成两块区域,越来越多这样的情况,内存就被分的越来越多块,最后内存没有一块区域能装下应用程序
2.多任务系统是无法接受的

解决问题:
1.80386处理器把4KB的内存区域当做一页内存,每页物理内存可以根据”页目录”和“页表”,随意映射到不同的线性地址上

用到的寄存器:
1.新增CR0寄存器,是否启用分页机制由第31位(PG位)决定。
2.PG=0不启用,所有指令寻址的线性地址,就是系统中实际的物理地址
3.PG=1 启用,所有的线性地址都要经过页表的映射才得到的物理地址

举例使用:
禁用
1.由描述符表那个操作得到一个线性地址
2.禁用分页机制,线性地址就是物理地址,处理器直接从物理内存存取数据

启用
1.由描述符表那个操作得到一个线性地址
2.要根据页目录和页表指定的映射关系吧地址映射到物理内存的真正位置
3.CPU从真正位置上存取数据

访问数据
页表可以指定一个页面并不真正映射到物理内存中。这样,访问这个页的指令会引发页异常错误。这是,处理器会自动转移到页异常处理程序中取。操作系统可以在异常处理程序中将硬盘上的虚拟内存读到内存中并进行修改页表重新映射,然后重新执行引发异常的指令,直到可以正常执行下去
1.访问数据->数据在物理内存中吗->是的,在->数据被访问
2.访问数据->数据在物理内存中吗->不在->在虚拟内存文件中吗->不在->报错
3.访问数据->数据在物理内存中吗->不在->在虚拟内存文件中吗->在->内存中有空闲的页面吗->没有->在内存中一个不常访问的页面->该页面数据是否无效->否->把该页面保存到虚拟内存文件中取->将数据从虚拟内存文件中读出并重新映射到空闲的内存中->数据被访问
4.访问数据->数据在物理内存中吗->不在->在虚拟内存文件中吗->在->内存中有空闲的页面吗->没有->在内存中一个不常访问的页面->该页面数据是否无效->是->将数据从虚拟内存文件中读出并重新映射到空闲的内存中->数据被访问

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值