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区的二级页表
|