- 主题:HIMEM.SYS 也是有限制的
DOS 能管理的内存最大限制是 65MB,因为 himem.sys 申请内存时,会返回一个 int16 的数字作为 HANDLE,这个值代表着实际着内存地址,单位是 1KB. int16 的最大值是 65535,加上最低的 1MB,所以最终算出 DOS 能够管理的最大内存是 65MB.
EMM386.EXE 映射的是 HIMEM.SYS 分配的内存。所以共享同样的限制。
我算的没错吧?
--
修改:hgoldfish FROM 27.148.57.*
FROM 27.148.57.*
这俩 API 不是互斥的吗?需要一个就不需要另外一个?
【 在 mephistoxp 的大作中提到: 】
: 可以完全不加载微软家的himem和emm386,只用QEMM一个设备驱动就可以全搞定……
: ps:DOS下面,有哪些常见程序(所以排除windows3.x)是单纯调用XMS,而不用EMS的呢?
--
FROM 120.37.23.*
freedos 说它家的 himemsx.sys 可以使用 PAE 管理到 1TB 内存。
这是为啥呢?这么大的内存,XMS API 也用不了啊。
【 在 hgoldfish 的大作中提到: 】
: DOS 能管理的内存最大限制是 65MB,因为 himem.sys 申请内存时,会返回一个 int16 的数字作为 HANDLE,这个值代表着实际着内存地址,单位是 1KB. int16 的最大值是 65535,加上最低的 1MB,所以最终算出 DOS 能够管理的最大内存是 65MB.
: EMM386.EXE 映射的是 HIMEM.SYS 分配的内存。所以共享同样的限制。
: 我算的没错吧?
: ...................
--
FROM 120.37.23.*
啥新的 API,哪里有文档呢?给个提示词我查查?
那我理解的旧的 XMS API 只能管理到 65MB 内存没错吧?
edit: 从 himemsx.sys 的 github 项目里面看到了。
【 在 kirbyzhou 的大作中提到: 】
: 它有新的API
--
修改:hgoldfish FROM 120.37.23.*
FROM 120.37.23.*
63+1k * 1k = 63+1 MB,
怎么算出 4T ?
【 在 kirbyzhou 的大作中提到: 】
: API是我想当然了,
: 不过65M是实现限制不是API限制。
: 65535个句柄*65535个unit*1k的unit大小 = 4T呢
: ...................
--
FROM 120.37.23.*
我查了一下 XMS 的 API,是这样的:
XMS 2.0 使用 WORD 寄存器来表示 HANDLE,所以只能管理到 63+1 MB
XMS 3.0 使用 int32 寄存器来表示 HANDLE,所以能管理到 4TB,不过 32 位计算机只能 4GB 可用。
FreeDOS 的 HIMEMSX.SYS 弄了个 XMS 3.5 API,连 PAE 技术都用上了简直丧心病狂。
【 在 kirbyzhou 的大作中提到: 】
: API是我想当然了,
: 不过65M是实现限制不是API限制。
: 65535个句柄*65535个unit*1k的unit大小 = 4T呢
: ...................
--
修改:hgoldfish FROM 120.37.23.*
FROM 120.37.23.*
哦哦哦。原来如此。我一直以为只能以 1KB 为单位。
【 在 kirbyzhou 的大作中提到: 】
: Query Free Extended Memory (Function 08h):
: ------------------------------------------
: ARGS: AH = 08h
: ...................
--
FROM 120.37.23.*
对。从 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.*
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.*
都写 dos4gw 了,还不如直接 windows 算了。
【 在 kirbyzhou 的大作中提到: 】
: 新的都是himem就行了,通过xms api分配内存并获取物理地址,然后通过dos4gw dpms之类的dos extender进保护模式直接干。
--
FROM 120.37.23.*