32-Bit Windows 7 Shows 2.75GB Usable Ram out of 4GB

x86 can address exactly 4GB of memory not 3. The upper 512MB is uses for HW address mapping, its the location that the kernel use's to map HW memory space for DMA / communication. This isn't actually memory just address space, so even if you had 1GB of memory installed windows would still use the 3.5 -> 4.0 region for HW mapping.

If your only seeing 2.75 then you have an IGA installed and it's using some of your memory. Likely your box only has 3GB installed memory, or you BIOS has disabled the last GB of mapping space, check it's settings.
 

alishathomaz

Honorable
Mar 6, 2012
128
0
10,710
You can use Device manager to see which devices are in the reserved regions. Inside Device manager select "Resource by Connection" under View, and expand all nodes. Now substract the left value from the right one and convert it from Hex to Dec to see the number of reservered memory for each device which now located in the 4GB address space and reduce the usable size.

32-bit Windows has a 4GB address space. This includes graphics memory, system BIOSes and RAM.
You have a 1GB graphics card and 256MB system BIOSes so only 2.75GB of the address space is left for RAM.
To use the 1.25GB you need to move to 64-bit.

Also Check the max memory in BIOS. It should be unchecked
 



It DOES NOT include graphics memory. I keep seeing people say this without understanding what their saying. If you have a Unified Memory Architecture (UMA) then your Integrated Graphics Adapter (IGA) will use system memory for it's framebuffer and texture storage. If you have a discrete GPU with it's own memory then that GPU's memory is wholly separate from main memory. Accessing that memory is done via DMA through a window that is mapped in that upper 512MB region. BIOS is small, less then 128kb, sometimes less then 64kb once POST is finished. Everything else is adapter space and will only be mapped above the 3.5GB boundary. 512MB is more then enough, heck 1MB is more then enough for most adapters BIOS. Video BIOS is only 128KB (A000-AFFF) and 64KB (B000-B7FF) before being remapped to the 3.5GB+ region. The remaining space is used for DMA windows and address paging / PAE.

The only way he could be getting 2.75 is if his BIOS was only allowing 3GB and the IGA was being allocated 256MB from BIOS. Once windows starts up it can dynamically grow the memory size via GART but it can't ever reduce it under the BIOS preset limit.
 


Yes, GPU RAM is not directly addressed by the OS, which most people get wrong. As Palladin said, the upper 512MB is usually used for DMA purposes to various system busses. However, the exact size of this block varies by motherboard, and legacy hardware [especially parallel busses, like PCI] can cause more then 512MB to be reserved by the OS.

At the end of the day, whatever the reason, 1.25GB of RAM is simply going to be unusable on win32. THIS IS NORMAL. There is nothing you can do about it, short of using PAE or moving to win64.
 
palladin, doesn't it need the address space (not actual memory allocation) to address gpu memory. This might also be being confused with early win7 releases where literally the amount of gpu memory you had was matched by physical memory. causing huge problems.

The graphics card section of this page from MS infers that gpu memory is mapped below the 4GB limit, and is therefore mapped as an allocation address .
http://msdn.microsoft.com/en-us/library/windows/desktop/aa366778(v=vs.85).aspx

 
@monkey,

That region between 3.5 and 4GB is what is used to peripheral memory. You would use DMA transfer with a memory window if you had to manually move data into the GPU's memory. GPU's have an onboard memory management unit (MMU) that handles their memory, the PC doesn't manage the GPU's memory. The GPU's driver will act as the go-between for transferring data from main system memory to GPU memory. The OS has no reason to ever directly address GPU memory.

That upper 512MB is a standard amount set aside since the days of NT 4.0, it's never been more or less. Prior to NT 4.0 (DOS / Win 3.0) it would use the IBM specified standard region of A000 -> FFFF which was know as upper memory. This was back when PC's had 512~640 KB of memory. As OC's grew beyond 1MB the OS would access the memory beyond 1MB through the eXtended memory specification (XMS) which would ignore the region between 640K and 1024K. There was a rival memory specification known as Expanded Memory Specification (EMS). EMS was accessed through a 64KB page that existed inside upper memory, typically between E000 and EFFF. Once we moved to the 80386 and the dawn of 32-bit CPU's the OS's moved to a flat memory model where all memory was directly addressable, early DOS implementations (Windows / DOS Games) would simply skip the first 1MB entirely and run everything out of the upper sections. Eventually NT 4.0 decided to completely do away with all that and instead have device drivers map their respective HW into the highest accessible region available to a 32-bit CPU, the upper 512MB. The guys at MS thought that 3GB+ of memory would be more then enough for anything in that era, computers rarely had more then 8 or 16MB and servers rarely more then 32 to 64MB.

So think of that last 512MB as the "upper memory" region of the 32-bit CPU era.

2^32 is

4294967296 or

100000000000000000000000000000000 in binary.

Adjust for the value of zero and we get,
4294967295

11111111111111111111111111111111

512MB would be represented as
11111111111111111111111111111

So the upper memory range of the NT x86 kernel is anything above
11100000000000000000000000000000 or
E0000000 as hex.
3758096384 as Decimal (bytes).
3584MB
3.5GB

If you look into your device manager and set it to show devices by type, you'll see the memory layout. You will have a few things near the bottom due to BIOS requirements for booting (first 16MB). Then you'll have a huge empty space, then you'll start seeing stuff at D0000000 (3.25GB)or E0000000 (3.5GB). The D0000000 range is typically used for permanent BIOS assigned IGA memory and various other buffers. It doesn't have to be. Windows will have drivers put their assignments into the E0+ block. The absolute lowest possible is the C0 block which would be 3GB on the dot, if this happens someone needs to check their motherboard BIOS settings or contact their MB manufacturer to see if there is a way to lift it. In either case the permanent IGA shared memory should be put in the D0 range. If the IGA needs more memory then the OS can provide it via GART.
 
Devices have to map their memory below 4 GB for compatibility with non-PAE-aware Windows releases. Therefore, if the system has 4GB of RAM, some of it is either disabled or is remapped above 4GB by the BIOS. If the memory is remapped, X64 Windows can use this memory. X86 client versions of Windows don’t support physical memory above the 4GB mark, so they can’t access these remapped regions. Any X64 Windows or X86 Server release can.

Their referring to the page space used for modern GPUs vs older frame buffers.

Modern GPU's have 1GB+ of dedicated memory, this memory is not directly accessible from the OS and is managed by the GPU itself. What is directly addressable is the frame buffer, or rather the section of graphics memory that is used to hold the pixel data representing the screen itself. This allows the OS to directly write to the screen but not to anything else. A 1920x1080x32bit resolution would require 8294400 byes, or a little under 8MB. Add in 1~2MB for off screen drawing. That 8~12MB would be mapped into a region above E0. One of my work laptops has a Quadro FX 1700M and it's page frame is mapped at F2 range for a total of 32MB of space, that is easily the frame buffer. It also has a 256MB mapping at E0~EF, this is its DMA transfer window. The Card has 512MB of GPU memory. 256MB is rather large for a DMA window, but it's a Quadro. It also has a small 16MB section at F5 which would be some sort of BIOS code or control region that the drivers would use.

So I can amend my above statement about the 512MB region. Windows will put everything it can into that region but if it can't find a big enough continuous space it'll use the E0 block right below it for another 256MB.
 

jaxfamous949

Honorable
Oct 24, 2013
2
0
10,510


ok so i had to register just to tell you that you are awesome and i have already learned alot from this short forum. your memory reference explanation was perfectly understandable. you rock, ill buy you a beer anytime.

What i was originally scouring the interweb for was an answer to an honest and probably frequently wondered or asked question:

Here we go
-Running a MAX RAM 4GB system, Nvidia discrete graphics with onboard 128mb dedicated ram but share-able nonetheless.
and
-64bit windows7 Ultimate allows 1900mb video ram, can play almost any recent game but BF4 beta lags alot-basically unplayable.
and
-32bit sameOS says 3.75GB usable RAM in properties. Video card says dedicated 128mb in DXDIAG. no shared memory there?
so the question is
-COULD USING a 32bit system offer the best performance? THIS SYSTEM SPECIFIC of course. because i could easily play around with drivers and find something that would address an otherwise usable area of system ram? I mean like bios would detect the OS after a few successful boots and allocate the remaining 512mb to the video? instead of the windows dynamic graphics crap ;)

I am the proud original owner of a Dell Vostro 1500.
-Core2Duo 2nd Gen 32x2, 32x2, 2mb @1.4Ghz
--Nvidia GeForce 8400GS (G86M) PCi-E 16x gpu@800Mhz mem128mb dedicated @800Mhz, shader@800Mhz
-Chipset PM965 Crestline ICH8M
-My memory is rated @800mhz but it is only showing a top speed of 333mhz?!?! Dual Channel Twin 2GB Hyundai crap from FRYS on sale lol couldnt pass up the upgrade!
the thing is in high performance mode it shows 400mhz?
but still it should be faster. its the fastest ram this board can handle supposedly.

down to the point- on 32bit i get outstanding framerates for low end games, but incompatibility errors with MW4, Blackops2 etc. but in 64bit i run these no problem, only around 60 frames on low. it plays fine when all specs sites say it shouldnt but it all runs playable.

Could using 32bit OS @3.75GB Ram Usable and proper drivers (like a windows vista driver in compatibility mode) to render 768mb Dedicated video ram? the Actual BUS Speed shows 800Mhz where the ram should be, which is where the video memory is clocked at, so i am thinking the bios will make the connection and dedicate resources accordingly, correct?

because as it is, i believe that the 64bit windows is sharing graphics memory space in my ram. i have widgets that are accurate and show all my data (something about a gauges i have to have them on everything) at total idle my memory clock (on the GPU) is 400mhz, 8mb+/- running Aero and gadget platform. the intersesting thing is not the amount of usage, but rather the speed. it seems that 64bit is forcing the bus speed to match the idle GPU? it throttles down to 337mhz and that is when i notice system stability issues. its like it doesnt want to cool down. if i load the system to 50%ram and an avg cpu load of 14-25% (iTunes or my virtual router does this) the cooling fan kicks on, and the whole system is super fast, click boom no lag no waiting. idling is a whole different story- its like it gets stuck at 798mhz CPU speed or something? thats what the widget registers at least. it seems like it does not want to fire up per say. in 32bit this does not happen, but i get different issues like memory reference errors and application incompatibility. I am no noob and i have played with various cpu control apps and have programmed some adjustments to the dual core throttle policy, but i really dont know what im doing with memory.

this is where i need your help:
in your opinion, with these circumstances, would a 32bit OS with tuning to all the bios and video functions be helpful, or should i call it a day and stick with the 64bit and its weak, definitely not optimal, basically generic experience and it is what it is?

i dont know what i can really do but i think im going to play around with a 32bit OS a little more and see how it turns out. ill report back
 
If your card only has 128GB of memory then your going to have issues running anything modern. What your referring to is know as GART.

https://en.wikipedia.org/wiki/Graphics_address_remapping_table

It's a way for GPU's to directly access system memory without first needing to interrupt the CPU and do a manual memory transfer. It's also a handy way to use additional system memory to supplement the GPU's memory, the drivers are what do this for you. Run DXDIAG and note what it says for approx total memory. That's the amount the graphics driver has been offered to use for texture storage / ect.

The performance differences between 32 and 64 bit OS should be negligible from a processing perspective. What FPS are you getting in each scenario?

Your best best is to make a new post about your problem / question and allow the community to hand it directly.