01.06 为什么Win95不能在1G以上内存的机器上启动

简单版本

如果你的机器的内存高于480MB,则Win95将启动失败。(话说在当时,480MB的内存已经是一个非常大的内存了。要知道Win95的目标运行环境是一台配备有4MB内存的385SX,或者一台带有16MB的高配机器。如果根据摩尔定律,要经过差不多7年的时间,我们才需要考虑一台配备有480MB内存的机器的问题。我的一个朋友拥有一台96MB内存的机器,经过测试,机器能正常启动。)

到了Win98,这一限制被提升至1GB。因为那个时候有一家供应商需要售卖搭载有Win98的1G内存的机器。虽然在这种情况下,选择WinNT更好。

复杂版本

Win95启动过程中,一旦系统进入到32位模式之后,第一件发生的事情就是需要初始化32位内存管理器。但这时就会出现一个”鸡”与”蛋”的问题:内存管理器在初始化阶段需要分配一些内存来保存一些记录(这些记录主要是用来追踪页面的Paged in和Paged out状态的)。但是,在内存管理器初始化完成之前,它又不能分配任何内存。

解决此问题的方法是:让内存管理器初始化两次!

第一次初始化的时候,它从一段预先分配的固定内存(来自init-data段)中获取所有内存。然后将此固定内存设定为内存管理器的堆。因此,对于接下来的内存分配来说,系统就有一个可用的堆来满足初始化过程中的内存分配需求了。

然后,内存管理器将会开始寻找系统中真正可用的内存,如果它找到了,它会在之前的固定堆内存中分配内存来保存追踪到的记录。

等到内存管理器找到了系统中所有的真实内存之后,它就开始进行第二次初始化:它将找到的真实内存作为一块新的堆,然后拷贝固定堆中的信息到新的堆中。在所有的信息都拷贝完毕后,全局内存管理器的堆指针将会从原来的固定堆切换为新的堆上。原来的固定堆内存将会被丢弃。

当系统完成初始化后,init-data段会被释放,随之而来的,第一次初始化中的固定堆内存将会重新被系统识别。

所以,init-data段中的固定堆大小直接决定了系统的最大内存限制。这个限制必须足够大,使之可以满足在内存搜索过程中的内存分配需求,如果你用于非常多的内存,则在内存搜索过程中,内存分配操作会失败,导致整个系统立即停机。

init-data段的大小的选择取决于两个因素:如果将它设置为越大,则你将会拥有更多的可用内存。但是你也不能将它设置为太大,因为对于一些只有少量内存的低配机器来说,如果这个段设置的太大,则将内存管理器加载到内存中是不可行的,这就直接导致了系统无法运行在这些的低配机器上。

总结

谁能想到,16年后,主流机器的内存配置都是8GB了,真是难为VMM的设计者了。向你们致敬。


为什么Win95不能在1G以上内存的机器上启动


分享到:


相關文章: