Xref: news-dnh.mv.net comp.os.msdos.djgpp:2962 Path: news-dnh.mv.net!mv!news.sprintlink.net!news.Edu.TW!news.cc.nctu.edu.tw!serv.HiNet.net!news.uoregon.edu!cs.uoregon.edu!usenet.ee.pdx.edu!not-for-mail From: idr AT cs DOT pdx DOT edu (Ian D Romanick) Newsgroups: comp.os.msdos.djgpp Subject: Linear frame buffer idea and questions Date: 30 Oct 1995 15:46:41 -0800 Lines: 59 Nntp-Posting-Host: sarin.cs.pdx.edu To: djgpp AT sun DOT soe DOT clarkson DOT edu Dj-Gateway: from newsgroup comp.os.msdos.djgpp Ok, I've seen many posts to this group and others about using the MMU to create a linear frame buffer. Most people seem to think that it is possible to do using DPMI 1.0. However, I have yet to see ANYONE post any sort of a suggestion as to HOW. Well, I've done a little research and have some ideas, but there's still a few things that I'm not quite sure of. So, I'm going to explain how I think it should be done, and let the coders of the world flame away. :) 1. Create Selector The first step seems to be to create a new selector for the virtual frame buffer. This would be done using the AllocateLDTDescriptors() function of DPMI. This function will return a new base selector that needs to be initialized. It would seem that the selector should be initialized with the SetSegmentBaseAddress() function. However, this doesn't seem to have the functionality that is needed. For example, if the current video card has 1Mb of memory, we need a 1Mb segment that has each 64k block mapped to the physical address 0x000a0000. So the first real question that I have is, how is this mapping done? 2. Intercept Page Fault Handler Once the descriptor is properly initialized, only one of the 64k segments will be marked as "in." When a fault happens in this selector, we need to be able to reset the SVGA hardware to use the correct bank and mark the correct segment as "in." It appears that the new handler is installed using the SetExtendedProcessorExceptionHandler() function. When a fault occurs, the stack frame is examined to make sure the fault is in the virtual video segment. If it isn't we chain up to the previous fault handler. My next question is, how do you mark pages as being "in" or "out" using DPMI? So near as I can tell, this would be done using the SetPageAttributes() function. Also, the DPMI documentation that I have seen is some what unclear as to if you can even install a 0x0E (page fault) handler. At one point, while discussing function 0x0203 it says: All exceptions are examined by the DPMI host. The host processes any exception that it is responsible for, such as page fault for virtual memory management. These transparent exceptions are never passed to the client exception handlers. All other exceptions become visible exceptions to a client and are passed to the client exception handler (if any) from the DPMI host. Is this to say the you will never see a page fault? See it after the DPMI sever deals with it? See it before DPMI deals with it? Am I even on the right track here? Please, post any comments or flames. :) I'd really like to figure this out, and if I ever do, I'll make the code freely available. :) -- - See the Epsilon coder page at: ____ ____ http://www.cs.pdx.edu/~idr/ / / / /\ / "Good...bad... - Ian Romanick sez: /---- /___/ / \ / I'm the guy "For the last time, GIVE ME THE BOX!" /____ / / \/ with the gun."