Date: Fri, 30 Jan 1998 22:40:33 -0800 (PST) Message-Id: <199801310640.WAA09921@adit.ap.net> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" To: lubaldo AT adinet DOT com DOT uy, djgpp AT delorie DOT com From: Nate Eldredge Subject: Re: Physical memory, virtual memory. DJGPP+CWSDPMI, how they work? Precedence: bulk At 08:37 1/30/1998 -0300, lubaldo AT adinet DOT com DOT uy wrote: > Hello everyone! I think this is on-topic... if it is not... sorry. > > I would like to know how physical memory and virtual memory works using >CWSDPMI and DJGPP. I want to know this only for curiosity... but maybe this >helps someone or someone has the same curiosity... > > Suppose I have a computer with 2 mb free of memory, DOS 6.22 and CWSDPMI >as DPMI provider. Suppose I have a program (compiled with DJGPP) that it >has 1mb of code and 2mb of music and bitmaps. Ok, this are my questions: > > 1- Suppose I load all the program and the music and the bitmaps on the >startup. Then, I use only 1mb of the music and the bitmaps in a first >stage, so the 2mb of the free memory are full with 1mb of code and 1mb of >data. The question is: what happens when the program enters in a 2nd stage >where I use the same 1mb of code but the other 1mb of the data? > - The previous data is stored in virtual memory and the other data (the >one that it is used now and has not been used before) is loaded in memory? > - The previous data is leaved in memory and the other (new) data is >readed from virtual memory? I'm not sure which of these cases more closely fits reality. I'll try to explain it as best I can. CWSDPMI, or whatever DPMI server you use, implements virtual memory. This uses the 386's paging mechanism. Some 4K pages in your program's address space are `present', and correspond to an actual chunk of physical memory. Others are `not present'. When you try to access them, the CPU generates a `page fault' and the DPMI server sees this, loads the page you want from disk, sets that page to point to the right place in memory, and resumes your program. Now. The startup code loads the entire executable image into virtual memory (I'm fairly sure no demand-loading). If some of it does not fit, it will be paged to disk immediately. When you touch it, it will be paged in, and the DPMI server will have to pick some other page to swap out to make room for it. One common policy used to pick this is LRU: The Least Recently Used page is swapped out. > > 2- CWSDPMI or DJGPP has something to optimize the speed when all the >physical memory is not suficient to hold all the data (something like a >cache?)? Not that I know of, unless I misunderstand you. When it needs to read or write a page that doesn't fit in memory, it has to be brought in and some other page taken out. If you have a disk cache, that will affect the swapping (since it is a disk write), but it sort of defeats the purpose in that if the memory you use for a disk cache were free, you might not need to swap in the first place. Note that I'm not advising you not to use a disk cache. It will speed up all other disk I/O and you should use it unless memory is very tight. > > When I say virtual memory I am saying the memory that it is simulated >using the harddisk. > I hope I was clear, because is difficult to me write in English. > Ok, TIA and goodbye! Hope this helps Nate Eldredge eldredge AT ap DOT net