中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-06-16 09:36
中国DOS联盟论坛 » DOS开发编程 & 发展交流 (开发室) » SS_DOSMEM是什么? 查看 1,739 回复 4
楼 主 SS_DOSMEM是什么? 发表于 2010-09-27 12:24 ·  中国 安徽 合肥 电信
初级用户
积分 65
发帖 26
注册 2010-07-29 17:15
UID 171437
性别 男
状态 离线
temp_ptr = (char far*)MK_FP(SS_DOSMEM, 0x10L*(long)seg);

在一段程序里看见这句,但是我找了所有的编译器的include文件夹,都没有找到SS_DOSMEM,在对方的程序也没有找到,不知道这到底是个什么?
有人知道吗?需要包含什么头文件
[已使用 Gemini 解答]
Gemini 解答

SS_DOSMEM 是 20 世纪 90 年代初在使用 Borland C++ PowerPack for DOS 开发 16 位 DPMI(DOS Protected Mode Interface,DOS 保护模式接口)程序时常见的一个预定义常量。

在标准的实模式(Real Mode)DOS 编程中,开发者通常不需要这个常量,因为可以直接操作段地址。但当程序运行在 16 位保护模式下时,段寄存器中存储的是“选择子”(Selector)而非物理段地址,程序无法直接访问实模式下的内存空间(如 BIOS 数据区或常规内存)。

以下是关于 SS_DOSMEM 的详细技术解释:

1. 技术背景:保护模式与 DPMI

在 Borland C++ 4.0/4.5 等版本中,通过 PowerPack 可以编写 16 位保护模式程序。为了让保护模式程序能够访问 1MB 以内的实模式内存(常规内存),DPMI 提供了一些预定义的“选择子”。

SS_DOSMEM(通常在 sys\segments.h 或相关的 DPMI 头文件中定义)本质上是一个指向实模式物理地址 0x00000000选择子。它的基地址(Base Address)是 0,限长(Limit)通常为 1MB。

2. 代码逻辑解析

代码片段:

temp_ptr = (char far*)MK_FP(SS_DOSMEM, 0x10L * (long)seg);

这段代码的目的是在保护模式下构造一个指向实模式段 seg 的远指针(far pointer):

  • SS_DOSMEM:作为段部分(在保护模式下即选择子),指向常规内存的起始位置。
  • 0x10L * (long)seg:将实模式的“段地址”转换为线性“偏移量”。在 x86 实模式下,段地址左移 4 位(乘以 16/0x10)即得到物理地址。由于 SS_DOSMEM 的基地址是 0,这个物理地址直接可以用作该选择子下的偏移量。
  • MK_FP:宏函数,将选择子和偏移量组合成一个 char far* 指针。

3. 为何在标准库中找不到

SS_DOSMEM 并不是标准 DOS 编程(实模式)的一部分,因此在普通的 DOS.HSTDIO.H 中无法找到。它属于 Borland 特有的 DPMI 扩展库。

  • 包含路径:通常位于 Borland C++ 安装目录下的 INCLUDE\SYS\SEGMENTS.H
  • 定义方式:在某些环境下,它可能被定义为一个固定的常量(例如 0x0020 或类似值,具体取决于 DPMI 宿主机的分配),或者通过扩展 API 获取。

4. 常见误区与修正

如果该代码在实模式环境下编译(例如使用 Turbo C 2.0 或 Borland C++ 的 DOS Standard 目标),SS_DOSMEM 将失去意义。在实模式下,访问某个段 seg 的方式应直接为 MK_FP(seg, 0)

这种写法是典型的 16-bit Protected Mode (Windows/DPMI) 遗留代码。在现代环境(如 DOSBox 或纯实模式 16 位环境)中,如果你试图移植这段代码,通常可以直接将 SS_DOSMEM 替换为 0,并去掉偏移量的转换逻辑,或者直接使用段地址。但在原有的 DPMI 语境下,它是跨越保护模式屏障访问常规内存的关键凭证。

2 发表于 2010-10-14 10:27 ·  中国 江苏 南京 秦淮区 电信
初级用户
积分 65
发帖 26
注册 2010-07-29 17:15
UID 171437
性别 男
状态 离线
没人遇到过?
绝对不是程序里自定义的,应该是个段基地址,但是就是找不到定义。
3 发表于 2010-10-14 22:18 ·  中国 山西 运城 电信
银牌会员
★★★
天的白色影子
积分 2,343
发帖 636
注册 2004-03-06 00:00
UID 19350
性别 男
状态 离线
这程序能编译通过吗?
如果能就一定可以找到定义
如果不能那找不到就很正常
4 发表于 2010-10-28 11:05 ·  中国 上海 联通
初级用户
积分 65
发帖 26
注册 2010-07-29 17:15
UID 171437
性别 男
状态 离线
编译器是OPEN WATCOM
5 发表于 2010-10-28 11:08 ·  中国 上海 联通
初级用户
积分 65
发帖 26
注册 2010-07-29 17:15
UID 171437
性别 男
状态 离线
好吧,我贴源代码地址吧
http://www.opensource.apple.com/source/libpcap/libpcap-18/libpcap/msdos/pktdrvr.c
在倒数最后几行出现的
论坛跳转: