XMS 提供了一套 API,要使用 1MB 以上内存的时候,程序调用 XMS DOS API,说我要申请一块 16KB 的内存,HIMEM.SYS 就会从 1MB 以上的 EMB 内存划一块出来返回给你。在使用这段内存,也需要调用 XMS API 复制数据到常规内存。使用完再复制回去或者释放内存。可以把 XMS 理解成一个特殊的文件,它提供了 read()/write() 函数来回读写到基本内存。
EMS 则更像是 mmap(),它的 API 可映射 1MB 以上的 EMB 内存到 UMA 内存段(640KB 以上),然后你直接汇编读写它映射出来的内存就行。
对比 API 的功能,HIMEM.SYS 没有管理 UMA 内存段的能力,只能管理 HMA 和 EMB 内存段。EMM386 更加全能一点,效率也更高。因为直接映射读写没有来回复制内存的开销。
实际实现的时候,HIMEM.SYS 使用 286 保护模式,而 EMM386 顾名思义要求至少 386,使用的是 VM86 模式访问 EMB 内存。
【 在 mephistoxp 的大作中提到: 】
: 请问XMS和EMS都是让物理内存去复用384KB地址空间里的那些16KB大小的交换块吗
: 地址空间只有1024KB的DOS实模式,通过复用内存地址,可以使用的物理内存远远多于1MB,最多可以达到32MB呢 ……
: 那么XMS跟EMS有什么区别呢?为什么分别由两个驱动程序himem和emm386才能激活使用呢?
: ...................
--
修改:hgoldfish FROM 120.37.21.*
FROM 120.37.21.*