找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2113|回复: 0
收起左侧

Windows 3.0的内存空间分配--有点老,但有用

[复制链接]
ID:94349 发表于 2015-11-2 14:51 | 显示全部楼层 |阅读模式
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区的二级页表



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表