中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 搜索 | 上传 | 帮助 »
English/Chinese Fix Translation
作者:
标题: SS_DOSMEM是什么? 上一主题 | 下一主题
yysn
初级用户





积分 65
发帖 26
注册 2010-7-29
状态 离线
『楼 主』:  SS_DOSMEM是什么? [已使用 LLM 解释]

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

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

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 语境下,它是跨越保护模式屏障访问常规内存的关键凭证。



2010-9-27 12:24
查看资料  发送邮件  发短消息  网志  OICQ (50987013)  编辑帖子  回复  引用回复
yysn
初级用户





积分 65
发帖 26
注册 2010-7-29
状态 离线
『第 2 楼』:   使用 LLM 解释/回答一下

没人遇到过?
绝对不是程序里自定义的,应该是个段基地址,但是就是找不到定义。


2010-10-14 10:27
查看资料  发送邮件  发短消息  网志  OICQ (50987013)  编辑帖子  回复  引用回复
qzwqzw
银牌会员

天的白色影子


积分 2343
发帖 636
注册 2004-3-6
状态 离线
『第 3 楼』:   使用 LLM 解释/回答一下

这程序能编译通过吗?
如果能就一定可以找到定义
如果不能那找不到就很正常


2010-10-14 22:18
查看资料  发短消息  网志   编辑帖子  回复  引用回复
yysn
初级用户





积分 65
发帖 26
注册 2010-7-29
状态 离线
『第 4 楼』:   使用 LLM 解释/回答一下

编译器是OPEN WATCOM


2010-10-28 11:05
查看资料  发送邮件  发短消息  网志  OICQ (50987013)  编辑帖子  回复  引用回复
yysn
初级用户





积分 65
发帖 26
注册 2010-7-29
状态 离线
『第 5 楼』:   使用 LLM 解释/回答一下

好吧,我贴源代码地址吧
http://www.opensource.apple.com/source/libpcap/libpcap-18/libpcap/msdos/pktdrvr.c
在倒数最后几行出现的


2010-10-28 11:08
查看资料  发送邮件  发短消息  网志  OICQ (50987013)  编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: