标题: Windows 3.0的内存空间分配--有点老,但有用 [打印本页]

作者: 51黑er    时间: 2015-11-2 14:51
标题: Windows 3.0的内存空间分配--有点老,但有用
vmm.h
/*
*  Address space (arena) boundaries
*/
#define MAXSYSTEMLADDR        ((ULONG) 0xffbfffff)    /* 4 gig - 4meg */
#define MINSYSTEMLADDR        ((ULONG) 0xc0000000)    /* 3 gig */
#define MAXSHAREDLADDR        ((ULONG) 0xbfffffff)
#define MINSHAREDLADDR        ((ULONG) 0x80000000)    /* 2   gig */
#define MAXPRIVATELADDR     ((ULONG) 0x7fffffff)
#define MINPRIVATELADDR     ((ULONG) 0x00400000)    /* 4 meg */
#define MAXDOSLADDR    ((ULONG) 0x003fffff)
#define MINDOSLADDR    ((ULONG) 0x00000000)

#define MAXSYSTEMPAGE        (MAXSYSTEMLADDR >> PAGESHIFT)
#define MINSYSTEMPAGE        (MINSYSTEMLADDR >> PAGESHIFT)
#define MAXSHAREDPAGE        (MAXSHAREDLADDR >> PAGESHIFT)
#define MINSHAREDPAGE        (MINSHAREDLADDR >> PAGESHIFT)
#define MAXPRIVATEPAGE        (MAXPRIVATELADDR >> PAGESHIFT)
#define MINPRIVATEPAGE        (MINPRIVATELADDR >> PAGESHIFT)
#define MAXDOSPAGE    (MAXDOSLADDR >> PAGESHIFT)
#define MINDOSPAGE    (MINDOSLADDR >> PAGESHIFT)


vmm.inc
/*
*  Address space (arena) boundaries
*/


PAGESHIFT    EQU    12
PAGESIZE    EQU    (1 SHL PAGESHIFT)
PAGEMASK    EQU    (PAGESIZE-1)
MAXSYSTEMLADDR    EQU    (0ffbfffffH)
MINSYSTEMLADDR    EQU    (0c0000000H)
MAXSHAREDLADDR    EQU    (0bfffffffH)
MINSHAREDLADDR    EQU    (80000000H)
MAXPRIVATELADDR    EQU    (7fffffffH)
MINPRIVATELADDR    EQU    (00400000H)
MAXDOSLADDR    EQU    (003fffffH)
MINDOSLADDR    EQU    (00000000H)
MAXSYSTEMPAGE    EQU    (MAXSYSTEMLADDR SHR PAGESHIFT)
MINSYSTEMPAGE    EQU    (MINSYSTEMLADDR SHR PAGESHIFT)
MAXSHAREDPAGE    EQU    (MAXSHAREDLADDR SHR PAGESHIFT)
MINSHAREDPAGE    EQU    (MINSHAREDLADDR SHR PAGESHIFT)
MAXPRIVATEPAGE    EQU    (MAXPRIVATELADDR SHR PAGESHIFT)
MINPRIVATEPAGE    EQU    (MINPRIVATELADDR SHR PAGESHIFT)
MAXDOSPAGE    EQU    (MAXDOSLADDR SHR PAGESHIFT)
MINDOSPAGE    EQU    (MINDOSLADDR SHR PAGESHIFT)



win386.exe 部分代码(实模式)

083C:00001AE8 MOV DWORD PRT [0040],80000000H      ;设置win386常驻区的基址
083C:00001AF1 MOV WORD PTR [0044],0280H        ;设置win386常驻区的页面数
083C:00001AF7 MOV DWORD PTR [0046],80280000H    ;设置win386初始化区的基址
083C:00001B00 MOV WORD PTR [004A],0180H        ;设置win386初始化区的页面数   



083C:0000271C PUSH SI                ;建立一级页目录表
                        ;入口参数:EAX--控制V86内存的二级页表的物理地址
                              EBX--控制WIN386内存的二级页表的物理地址
                              ES:DI--一级页表地址
....
083C:0000272F MOV ECX,[0040]            ;WIN386常驻区的基址
083C:00002734 SHR ECX,16H            ;对应的一级索引,只有高10位有效,所以右移22位=16H




083C:00001D10 MOV ECX,[085C]            ;分配的页面对应的虚拟地址
083C:00001D15 SUB ECX,80000000            ;win386区的开始地址是80000000
083C:00001D1C LES DI,[087C]            ;ES:DI指向控制win386区的二级页表








欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1