当前位置:鱼C工作室 >Win32汇编 > 查看文章

Win32基础知识3 – Win32汇编语言004

Win32基础知识3

 

让编程改变世界

Change the world by program


 

Windows的内存管理机制

 

在这一节中,我们需要通过学习解决两大疑问:

Win32汇编中,每个程序都可以用4GB的内存吗?

Win32汇编源代码中为什么看不到CS, DS, ES 和 SS 等段寄存器的使用?

 

DOS操作系统的内存安排

Win32编程相对于 DOS编程最大的区别之一就是内存的使用问题。

先来回顾一下DOS操作系统的内存使用,DOS操作系统运行于实模式中,内存安排如图:

DOS 操作系统的内存安排

 

我们看到,由于8086处理器的寻址范围只有可怜的1 MB 大小,当时系统硬件使用的存储器地址被安排在高端。

地址是从A0000h(即640 KB)开始的384 KB中,其中有用于显示的视频缓冲区和BIOS的地址空间。

 

而在内存低端,安排了中断向量表和BIOS数据区。

剩下从500h开始到A0000h总共不到640KB的内存是操作系统和应用程序所能够使用的。

应用程序不可能使用这640 KB以外的内存。

这就是著名的“640KB限制”。

 

而即使在这640KB中,DOS操作系统又占领了低端的一部分内存,最后剩下600KB左右的内存才是应用程序真正可以用的。

如果系统中有内存驻留程序存在,那么应用程序还要和这些TSR程序共同分享这段内存空间。

注释:TSR 即(Terminate and Stay Resident)原意是停止并驻留,指的是内存驻留程序。

 

80386的内存寻址机制

 

Windows的内存管理和DOS的内存管理有很大的不同,在了解Windows的内存管理模式之前,需要对80386保护模式下内存分页机制有所了解。

为了做个对比,先来看实模式下的内存寻址方式:在实模式下,一个完整的地址由段地址和偏移地址两部分组成。

处理器换算时先将段地址乘以10h,得到段在物理内存中的起始地址,然后加上16位的偏移地址得到实际的物理地址。

 

现在我们谈回到80386处理器的工作模式:

当80386处理器工作在保护模式和虚拟8086模式的时候,可以使用全部32根地址线访问4 GB大的内存。段地址加偏移地址的计算方法显然无法覆盖这么大的范围。

但计算一下就可以发现,实际上和8086同样的限制已经不复存在,因为80386所有的通用寄存器都是32位的,2^32 == 4G,所以用任何一个通用寄存器来间接寻址,不必分段就已经可以访问到所有的内存地址。

 

分页阅读: 1 2 下一页
为您推荐

报歉!评论已关闭.