Windows 95 doesn’t boot with more than 1GB of RAM

Date:August 14, 2003 / year-entry #22
Tags:history
Orig Link:https://blogs.msdn.microsoft.com/oldnewthing/20030814-00/?p=42903
Comments:    12
Summary:Short version Windows 95 will fail to boot if you have more than around 480MB of memory. (This was considered an insane amount of memory back then. Remember, Windows 95's target machine was a 4MB 386SX and a powerful machine had 16MB. So according to Moore's law, that gave us seven years before we had...

Short version

Windows 95 will fail to boot if you have more than around 480MB of memory. (This was considered an insane amount of memory back then. Remember, Windows 95's target machine was a 4MB 386SX and a powerful machine had 16MB. So according to Moore's law, that gave us seven years before we had to do something about it. One of my friends got 96MB of memory on his machine to test that we didn't tank under "insanely huge memory configurations" and we all drooled.)

Windows 98 bumped the limit to 1GB because there existed a vendor (who shall remain nameless) who was insane enough to want to sell machines with 1GB of RAM and preinstall Windows 98 instead of the much more suitable Windows NT.

Long version

One of the first things that happens in the Windows 95 boot process once you have transitioned into 32-bit mode is to initialize the 32-bit memory manager. But now you have a chicken-and-egg problem: The memory manager needs to allocate some memory in order to keep track of the memory it is managing. (Keeping track of which pages are paged in and which are paged out, that sort of thing.) But it can't allocate memory until the memory manager is initialized. Eek!

The solution is to initialize the memory manager twice.

The first time the memory manager is initialized, it gets all its memory from a fixed block of memory preallocated in the init-data segment. It sets up this fixed block as the memory manager heap. So now there is a heap available to satisfy memory allocations.

Next, the memory manager starts looking for the real memory in the system, and when it finds some, it allocates memory (from the initial fixed block) to keep track of the real memory.

After the memory manager has found all the real memory in the system, it's time to initialize the memory manager a second time: It carves out a chunk of that real memory to use as the "real heap" and copies the information from the heap that it has been using so far (the fixed-sized heap) to the "real heap".

Once everything has been copied and all the pointers fixed up, the global memory manager heap pointers are changed to point at the new ("real") heap and the original heap is abandoned.

The memory consumed by the original heap is reclaimed when the init-data segment is discarded (which happens at the end of system initialization).

The total RAM limitation occurs because the size of the fixed block in the init-data segment needs to be large enough to satisfy all the memory allocations performed during the memory scan. If you have too much memory, an allocation during the memory scan fails and the system halts.

The size of the init-data segment was chosen to balance two factors. The larger you make it, the more memory you can have in the system before hitting an allocation failure during the memory scan. But you can't make it too large or machines with small amounts of memory won't even be able to load VMM into memory.


Comments (12)
  1. Anand says:

    What about XP? Does it do something similar?

  2. Raymond Chen says:

    Windows XP is based on the NT codebase and operates completely differently from Windows 95/98/Me. Thank goodness.

  3. Andreas Häber says:

    See the articles by Mark Russinovich at http://www.sysinternals.com/publ.shtml for lots of information about how Windows NT works. Guess you’ll find the answer there…

  4. Daniel Marois says:

    Strangely enough I have a PC with 512MB and Win 95 boots just fine. Maybe I didn’t understand….

  5. Daniel Bishop says:

    Just as strange… we’ve got a win98 machine w/ 1024MB and refuses to boot. grr…

  6. Anonymous says:

    Windows 98 w/1024MB will work if you limit the vchache to 512MB maximum. Enter this in the system.ini file under [vcache]

    maxfilecache=512000

    If your computer has more than 1GB then there is a way to limit Win98 memory access so that it will run properly.

  7. Tim S says:

    I also had problems with Windows ME and 1GB of DDR2700. I was able to fix it by setting the maxfilecache to 640000. 768000 or higher failed.

    I appended the following to my system.ini:

    [vcache]

    maxfilecache=640000

    Thanks you Anonymous!!

    Now my question is what happens to the rest of the memory? Is it used at all by the OS or other apps?

Comments are closed.


*DISCLAIMER: I DO NOT OWN THIS CONTENT. If you are the owner and would like it removed, please contact me. The content herein is an archived reproduction of entries from Raymond Chen's "Old New Thing" Blog (most recent link is here). It may have slight formatting modifications for consistency and to improve readability.

WHY DID I DUPLICATE THIS CONTENT HERE? Let me first say this site has never had anything to sell and has never shown ads of any kind. I have nothing monetarily to gain by duplicating content here. Because I had made my own local copy of this content throughout the years, for ease of using tools like grep, I decided to put it online after I discovered some of the original content previously and publicly available, had disappeared approximately early to mid 2019. At the same time, I present the content in an easily accessible theme-agnostic way.

The information provided by Raymond's blog is, for all practical purposes, more authoritative on Windows Development than Microsoft's own MSDN documentation and should be considered supplemental reading to that documentation. The wealth of missing details provided by this blog that Microsoft could not or did not document about Windows over the years is vital enough, many would agree an online "backup" of these details is a necessary endeavor. Specifics include:

<-- Back to Old New Thing Archive Index