- 主题:HIMEM.SYS 也是有限制的
Query Free Extended Memory (Function 08h):
------------------------------------------
ARGS: AH = 08h
RETS: AX = Size of the largest free extended memory block
in K-bytes
DX = Total amount of free extended memory in K-bytes
这个里面有点限制是最多告诉你有65535k可用内存。
但是API上可以实际分出来65535个65535k。
【 在 hgoldfish 的大作中提到: 】
: 63+1k * 1k = 63+1 MB,
: 怎么算出 4T ?
--
FROM 114.247.175.*
哦哦哦。原来如此。我一直以为只能以 1KB 为单位。
【 在 kirbyzhou 的大作中提到: 】
: Query Free Extended Memory (Function 08h):
: ------------------------------------------
: ARGS: AH = 08h
: ...................
--
FROM 120.37.23.*
1k1个句柄那用起来得多麻烦。
EMS还16k页呢。
【 在 hgoldfish 的大作中提到: 】
: 哦哦哦。原来如此。我一直以为只能以 1KB 为单位。
--
FROM 124.64.129.*
XMS API访问的内存是不是主要用于存放数据,而不是程序上下文~
结合XMS的使用方式,要把1MB之外的内存数据copy到实模式64+1024KB的地址空间之后才能使用,导致XMS内存确实更适合存放结构化数据(便于做顺序读写),而不是遍布跳转指令的程序上下文(远距离的跳转地址会给编程带来很大的麻烦)
【 在 kirbyzhou 的大作中提到: 】
: smartdrv呀,不依赖emm386的.
: 然后国产的一堆中文系统,字库加载到xms,也是不依赖ems的
: --
--
FROM 111.31.163.*
EMS为什么只有2048个16KB内存页呢?一个word如果有16bit的话,EMS竟然只用了其中的11bit来表示页数量~
【 在 hgoldfish 的大作中提到: 】
: 我查了一下 XMS 的 API,是这样的:
:
: XMS 2.0 使用 WORD 寄存器来表示 HANDLE,所以只能管理到 63+1 MB
: XMS 3.0 使用 int32 寄存器来表示 HANDLE,所以能管理到 4TB,不过 32 位计算机只能 4GB 可用。
:
:
: ..................
--
FROM 111.31.163.*
对。从 API 看,和文件的读写差不多。
要使用之前得先 XMS move 到常规内存里面。用完还得再 move 回 XMS. 明显不好用。
但 EMS 也不好用。因为按规范它只能映射到 UBA 区域,这地方没有大的连续的空间给用户使用。所以一次映射不了多少。好像也映射不了连续的 63+1KB,而必须分成四块 16KB 的。
要想真的好用,有个类似于 EMS 的技术,能够把 XMS 内存映射到常规内存里面。我想有个想法就是弄个纤程技术,在纤程切换的时候顺便重新映射常规内存。这样,就算开 1000 个协程用到 16MB 内存,也可以做到只占用 32KB 的常规内存。
【 在 mephistoxp 的大作中提到: 】
: XMS API访问的内存是不是主要用于存放数据,而不是程序上下文~
: 结合XMS的使用方式,要把1MB之外的内存数据copy到实模式64+1024KB的地址空间之后才能使用,导致XMS内存确实更适合存放结构化数据(便于做顺序读写),而不是遍布跳转指令的程序上下文(远距离的跳转地址会给编程带来很大的麻烦)
--
修改:hgoldfish FROM 27.148.57.*
FROM 27.148.57.*
当时的硬件价格决定了2048就够用。
可以保留点bit以备干别的用途。
比如区分内存速度,持久性之类的标志位。
【 在 mephistoxp 的大作中提到: 】
: EMS为什么只有2048个16KB内存页呢?一个word如果有16bit的话,EMS竟然只用了其中的11bit来表示页数量~
--
FROM 114.247.175.*
新一点的都只需要xms不需要ems吧, 印象中没有ems不给运行的就一个, 光荣三国志4代
【 在 mephistoxp 的大作中提到: 】
可以完全不加载微软家的himem和emm386,只用QEMM一个设备驱动就可以全搞定……
ps:DOS下面,有哪些常见程序(所以排除windows3.x)是单纯调用XMS,而不用EMS的呢?
【 在 hgoldfish 的大作中提到: 】
: DOS 能管理的内存最大限制是 65MB,因为 himem.sys 申请内存时,会返回一个 int16 的数字作为 HANDLE,这个值代表着实际着内存地址,单位是 1KB. int16 的最大值是 65535,加上最低的 1MB,所以最终算出 DOS 能够管理的最大内存是 65MB.
:
: ..................
--
FROM 222.129.4.*
XMS 和 EMS 的 API 使用方式不一样,类似一个 Linux 程序读写数据时,要么用 read()/write() 要么用 mmap().
是不是说后来几乎所有的程序都选择了 XMS API,因为 EMS API 看起来并不好用。需要切成 4 块不连续的 16KB 的,而且本身 UMA 的内存很少,还不如留给驱动程序就算了。
另外,选择 EMS 意味着必须使用 386 机器,而使用 XMS 只需要 286 就能支持。在 DOS 的生命周期里面,286 的保有量是非常大的。
【 在 tom6bj 的大作中提到: 】
: 新一点的都只需要xms不需要ems吧, 印象中没有ems不给运行的就一个, 光荣三国志4代
: 可以完全不加载微软家的himem和emm386,只用QEMM一个设备驱动就可以全搞定……
: ps:DOS下面,有哪些常见程序(所以排除windows3.x)是单纯调用XMS,而不用EMS的呢?
: ...................
--
FROM 120.37.23.*
新的都是himem就行了,通过xms api分配内存并获取物理地址,然后通过dos4gw dpms之类的dos extender进保护模式直接干。
【 在 tom6bj 的大作中提到: 】
: 新一点的都只需要xms不需要ems吧, 印象中没有ems不给运行的就一个, 光荣三国志4代
: 可以完全不加载微软家的himem和emm386,只用QEMM一个设备驱动就可以全搞定……
: ps:DOS下面,有哪些常见程序(所以排除windows3.x)是单纯调用XMS,而不用EMS的呢?
: ...................
--
FROM 114.247.175.*