如果有bug或者优化建议请给我发送邮件
下载:https://upload.cn-dos.net/img/2504.img
后期会继续更新2.0版本,敬请期待!
[ Last edited by RYSF13 on 2026-5-14 at 21:14 ]
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!
Gemini 解答
技术背景与体系定位
帖中讨论的“自制 MS-DOS 7.1 安装盘”,其核心文件(
IO.SYS、MSDOS.SYS、COMMAND.COM等)提取自 Windows 95 OSR2 / Windows 98 / Windows 98 SE。微软官方从未发布过独立的“MS-DOS 7.10 完整零售安装版”,其原生定位是作为 Windows 9x 的底层实模式引导与兼容层。2000 年前后,中文社区(以中国 DOS 联盟 Wengier 制作的 MS-DOS 7.10 安装光盘为代表)通过提取 Windows 98 的实模式核心,结合自定义批处理、第三方开源/免费工具、声卡与中文驱动,封装出可独立分发和安装的系统介质。帖中作者制作的各种 beta 与正式版均属于此类社区二次封装分发。
技术机制与认知纠正
结合前楼及本帖发布的分发包,对其打包与运行机制中的技术细节和常见误区作如下说明:
1. 批处理交互指令:
SET /P与CHOICE.COM
- 现象:作者在前楼提及“
SET /P在纯 DOS 下有时不等待输入就跳过,换CHOICE之后稳定不少”。- 技术事实:MS-DOS 7.10 的命令解释器
COMMAND.COM原生不支持SET /P交互式赋值语法。
SET /P variable=[promptString]是 Windows 2000 / XP 的cmd.exe引入的扩展语法。- 在 MS-DOS(包括 6.22 及 7.x 的
COMMAND.COM)下执行该语句时,解释器会将/P视作普通变量名或非法参数直接赋值并继续执行,表现为“不等待输入、瞬间跳过”。- 纯 DOS 环境下的标准化菜单交互方案是使用
CHOICE.COM捕获按键并配合%ERRORLEVEL%条件跳转,或使用 4DOS 等第三方 Shell。2. 光盘引导机制(El Torito)与盘符漂移
- 现象:作者认为“光盘启动后 BIOS 会把光盘映射成 C:,物理硬盘变成 D:”,因此“固定往 C: 装”。
- 技术事实:这是对 El Torito 光盘引导规范及 BIOS 驱动器仿真机制的误解:
- 软盘仿真模式(Floppy Emulation):使用 1.44MB 或 2.88MB 引导镜像时,BIOS 会将其仿真为软驱
A:(原物理A:顺延为B:),物理硬盘主分区仍为C:。- 硬盘仿真模式(Hard Disk Emulation):光盘引导扇区被指定为硬盘镜像,BIOS 会将其接管并映射为
C:(INT 13h,设备号0x80),原物理硬盘被推移至D:(0x81)。- 非仿真模式(No Emulation):光盘引导扇区直接加载引导器(如 isolinux),不创建虚拟驱动器,后续驱动器盘符完全由
CONFIG.SYS加载的光驱驱动(如VIDE-CDD.SYS)与 MSCDEX / SHSUCDX 决定。- 潜在风险:如果安装程序硬编码“固定往
C:安装”,在硬盘仿真模式下,安装程序实际写入的是基于内存/光盘的虚拟启动区,并未真正写入物理硬盘;而在软盘仿真模式下,C:才是物理硬盘。规范的 DOS 安装脚本通常借助工具检测未写保护的固定磁盘(Fixed Disk),动态判断安装目标盘符。3. PKUNZIP 的 CRC 报错与内存限制
- 现象:使用 PKUNZIP 解压大型安装包时偶发“内存不足”或“CRC 校验错误”。
- 技术事实:
- 16 位实模式下的解压程序(如 PKUNZIP 2.04g)完全在常规内存(Conventional Memory,640KB)中运行,维护解压哈希表和缓冲区。
- 当安装盘加载了复杂的中文平台、声卡驻留驱动或
CONFIG.SYS中 buffers/files 配置不当时,可用常规内存大幅缩减,易引发内存溢出。- 此外,早期 DOS 下内存管理器(如
EMM386.EXE的 UMB 映射冲突)若未正确排除光驱/声卡占用的保留内存区域,会导致解压缓冲区数据被覆盖,从而产生虚假的“CRC Error”。- 现代 DOS 封装通常使用 32 位 DPMI 扩展的解压工具(如 Info-ZIP
UNZIP32或 DOS 版 7-Zip),直接利用扩展内存(XMS),避免常规内存瓶颈。4. 内存需求与 RAMDisk 计算
- 技术事实:作者提出的“1.44MB + 640KB 约等于 2MB 内存需求”存在计算逻辑偏差。
- DOS 实模式寻址空间上限为 1MB(00000h–FFFFFh)。
- 系统若需 2MB 以上内存,是因为安装环境启用了
HIMEM.SYS访问扩展内存(XMS),并利用 XMS 创建了虚拟内存盘(RAMDisk,如XMSDSK)用于展开解压临时文件和驱动。物理软盘/光盘仿真本身的扇区读取并不直接消耗扩展内存。
:R
cls
ECHO: Please restart your computer
Pause >nul
GOTO R@ECHO OFF
CLS
:CSTART
ECHO:
ECHO: ECONFIG 1.00 - CONFIG.SYS Customizer
ECHO:
IF EXIST C:\CONFIG.SYS GOTO CBackup
GOTO CWrite
:CBackup
COPY C:\CONFIG.SYS C:\CONFIG.000 > NUL
DEL C:\CONFIG.SYS
:CWrite
ECHO DEVICE=C:\DOS\ECHO.SYS W/e/l/c/o/m/e /t/o MS-DOS 7.10... > C:\CONFIG.SYS
ECHO DEVICE=C:\DOS\ECHO.SYS C/o/p/y/r/i/g/h/t M/i/c/r/o/s/o/f/t C/o/r/p. A/l/l /r/i/g/h/t/s /r/e/s/e/r/v/e/d. >> C:\CONFIG.SYS
:CMENU
CLS
ECHO:
ECHO:
ECHO:=====================================
ECHO: Memory Manager Selection
ECHO:=====================================
ECHO: 1, Use HIMEM + EMM386
ECHO: 2, Use JEMMEX
ECHO: 3, Use None
ECHO:=====================================
CHOICE /C:123 /N "Press 1/2/3: "
IF ERRORLEVEL 3 GOTO CWrite2
IF ERRORLEVEL 2 GOTO CJEMMEX
IF ERRORLEVEL 1 GOTO CHIMEM
GOTO CMENU
:CHIMEM
ECHO DEVICE=C:\DOS\HIMEM.SYS >> C:\CONFIG.SYS
ECHO DEVICE=C:\DOS\EMM386.EXE NOEMS >> C:\CONFIG.SYS
GOTO CWrite2
:CJEMMEX
ECHO DEVICE=C:\DOS\JEMMEX.EXE >> C:\CONFIG.SYS
GOTO CWrite2
:CWrite2
ECHO DEVICEHIGH=C:\DOS\SETVER.EXE >> C:\CONFIG.SYS
ECHO DEVICEHIGH=C:\DOS\VIDE-CDD.SYS /D:IDE-CD >> C:\CONFIG.SYS
ECHO DOS=HIGH,UMB,AUTO >> C:\CONFIG.SYS
ECHO COUNTRY=001,936,C:\DOS\COUNTRY.SYS >> C:\CONFIG.SYS
ECHO FCBS=4,0 >> C:\CONFIG.SYS
ECHO FILES=30 >> C:\CONFIG.SYS
ECHO BUFFERS=20,0 >> C:\CONFIG.SYS
ECHO LASTDRIVE=Z >> C:\CONFIG.SYS
ECHO STACKS=9,256 >> C:\CONFIG.SYS
ECHO SHELL=C:\COMMAND.COM C:\ /E:640 /P >> C:\CONFIG.SYS
:ENDC
ECHO:
ECHO CONFIG.SYS has been created successfully!
ECHO:
PAUSE
GOTO ASTART
:ASTART
CLS
ECHO:
ECHO: EAUTO 1.00 - AUTOEXEC.BAT Customizer
ECHO:
IF EXIST C:\AUTOEXEC.BAT GOTO ABackup
GOTO AWrite
:ABackup
COPY C:\AUTOEXEC.BAT C:\AUTOEXEC.000 > NUL
DEL C:\AUTOEXEC.BAT
:AWrite
ECHO @ECHO OFF > C:\AUTOEXEC.BAT
ECHO PROMPT $P$G >> C:\AUTOEXEC.BAT
ECHO PATH=C:\DOS >> C:\AUTOEXEC.BAT
ECHO SET DIRCMD=/4 >> C:\AUTOEXEC.BAT
ECHO MODE CON RATE=32 DELAY=1 >> C:\AUTOEXEC.BAT
ECHO BREAK ON >> C:\AUTOEXEC.BAT
ECHO LFNFOR ON >> C:\AUTOEXEC.BAT
:AMENU
CLS
ECHO:
ECHO:
ECHO:=====================================
ECHO: AUTOEXEC.BAT Customizer
ECHO:=====================================
ECHO: 1, Load TSR Programs (Standard)
ECHO: 2, Load TSR Programs (Custom)
ECHO: 3, Load None (Minimal)
ECHO:=====================================
CHOICE /C:123 /N "Press 1/2/3: "
IF ERRORLEVEL 3 GOTO AM
IF ERRORLEVEL 2 GOTO AC
IF ERRORLEVEL 1 GOTO AS
GOTO AMENU
:AS
ECHO LH KILLER >> C:\AUTOEXEC.BAT
ECHO LH DOSKEY >> C:\AUTOEXEC.BAT
ECHO LH DOSLFN /Z:C:\DOS\CP437UNI.TBL >> C:\AUTOEXEC.BAT
ECHO LH MSCDEX /D:IDE-CD >> C:\AUTOEXEC.BAT
ECHO LH SHARE /L:30 >> C:\AUTOEXEC.BAT
ECHO LH CTMOUSE > NUL >> C:\AUTOEXEC.BAT
GOTO WENDA
:AC
CLS
ECHO:
ECHO: Select TSR Programs to Load (Page 1 of 2)
ECHO: 1, KILLER
ECHO: 2, DOSKEY
ECHO: 3, DOSLFN
ECHO: 4, MSCDEX
ECHO: N, Next Page
ECHO: Q, Done (Finish)
ECHO:
:TP1
CHOICE /C:1234NQ /N "Select (1-4/N/Q): "
IF ERRORLEVEL 6 GOTO WENDA
IF ERRORLEVEL 5 GOTO TP2
IF ERRORLEVEL 4 GOTO MSCDEX
IF ERRORLEVEL 3 GOTO DOSLFN
IF ERRORLEVEL 2 GOTO DOSKEY
IF ERRORLEVEL 1 GOTO KILLER
GOTO TP1
:TP2
CLS
ECHO:
ECHO: Select TSR Programs to Load (Page 2 of 2)
ECHO: 1, SHARE
ECHO: 2, CTMOUSE
ECHO: P, Previous Page
ECHO: Q, Done (Finish)
ECHO:
CHOICE /C:12PQ /N "Select (1-2/P/Q): "
IF ERRORLEVEL 4 GOTO WENDA
IF ERRORLEVEL 3 GOTO TP1
IF ERRORLEVEL 2 GOTO CTMOUSE
IF ERRORLEVEL 1 GOTO SHARE
GOTO TP2
:KILLER
ECHO LH KILLER >> C:\AUTOEXEC.BAT
GOTO TP1
OSKEY
ECHO LH DOSKEY >> C:\AUTOEXEC.BAT
GOTO TP1
OSLFN
ECHO LH DOSLFN /Z:C:\DOS\CP437UNI.TBL >> C:\AUTOEXEC.BAT
GOTO TP1
:MSCDEX
ECHO LH MSCDEX /D:IDE-CD >> C:\AUTOEXEC.BAT
GOTO TP1
:SHARE
ECHO LH SHARE /L:30 >> C:\AUTOEXEC.BAT
GOTO TP2
:CTMOUSE
ECHO LH CTMOUSE > NUL >> C:\AUTOEXEC.BAT
GOTO TP2
:AM
REM No TSR loaded
GOTO WENDA
:WENDA
ECHO CALL LOCKDRV.BAT >> C:\AUTOEXEC.BAT
ECHO ECHO. >> C:\AUTOEXEC.BAT
ECHO ECHO Now you are in MS-DOS 7.10 prompt. Type 'HELP' for help. >> C:\AUTOEXEC.BAT
ECHO ECHO. >> C:\AUTOEXEC.BAT
:ENDA
ECHO:
ECHO AUTOEXEC.BAT has been created successfully!
ECHO:
Pause
A:\SETUP.BATGemini 解答
本帖讨论了基于 MS-DOS 7.10(源自 Windows 98/98SE 提取的核心及社区改造分发版本)制作自动化安装/启动光盘的实现细节。针对贴中涉及的批处理逻辑、内存管理及环境兼容性,进行以下技术解读与纠正:
1. 批处理交互与分支逻辑分析
帖中提供的批处理代码主要用于在目标盘动态生成
CONFIG.SYS和AUTOEXEC.BAT。其中包含几处典型的 DOS 批处理编写问题与陷阱:
CHOICE命令的ERRORLEVEL判断顺序: DOS 批处理中IF ERRORLEVEL n的判定规则是“当前退出码大于或等于 $n$ 即为真”。帖中作者正确地采用了从大到小的降序判断(如IF ERRORLEVEL 3在先,IF ERRORLEVEL 1在后),避免了逻辑被低数值短路的问题。- 重定向输出中的特殊字符问题: 在
ASTART块中,代码执行了ECHO PROMPT $P$G >> C:\AUTOEXEC.BAT。在纯 MS-DOS 7.10 环境下,$P$G作为字符串参数不会被解析为管道或重定向符;但在某些 NT 系列 CMD 模拟环境或特定扩展 Shell 下,>或<可能会被错误解析。在纯 DOS 下该写法有效。- 无限循环与死锁风险: 自动分区完成后的死循环提示:
在实机部署中,使用无响应死循环强制用户按物理重启键(或:R cls ECHO:Please restart your computer Pause >nul GOTO RCtrl+Alt+Del)是早期装机盘的常见土法。但更规范的做法是调用软重启工具(如REBOOT.COM或通过 DEBUG 写入跳转到FFFF:0000h的指令重置机器),避免用户在文件系统缓存未刷新时直接断电。2. 内存管理误区:Windows 3.1 与 JEMMEX / EMM386
帖子中声称“如果你想安装 WIN3.1,强烈建议使用 JEMMEX”,这一结论在技术事实上是错误的:
- JEMMEX 的工作机制:
JEMMEX.EXE(源自 FreeDOS 生态,由 Japheth 开发)是一个将 XMS 与 EMS 管理器整合到单一驱动中的工具,主要针对实模式 DOS 程序及保护模式 DOS 扩展器(DOS Extender)进行了优化。- Windows 3.1 386 增强模式(Enhanced Mode)的冲突:
- Windows 3.1 在启动
WIN386.EXE进入 386 增强模式时,自身包含一个完整的虚拟内存管理系统(VxD 体系),需要通过标准 XMS 接口接管 CPU 的保护模式控制权。JEMMEX默认开启了自身的保护模式/V86 监视器,与 Windows 3.x 内部的WIN386核心存在严重的嵌套虚拟化冲突,极易导致 Windows 3.1 启动时发生蓝屏崩溃、GPF(一般保护性错误)或直接黑屏死机。- 正确做法:运行 Windows 3.1 的标准推荐配置应为微软原生的
HIMEM.SYS加上EMM386.EXE(通常加NOEMS参数,或仅在需要 EMS 时加RAM参数),或者完全不加载 EMM386(仅加载HIMEM.SYS),交由 Windows 自身管理 UMB 和 EMS。3. MS-DOS 7.10 配置文件中的参数细节
COUNTRY=001,936,C:\DOS\COUNTRY.SYS: 参数中的001是美国国家代码,936是简体中文(GBK)代码页。在标准 MS-DOS 下,国家代码086对应中国。虽然设置001,936可以强行让系统在保持美式日期/时间格式的同时指定 936 代码页,但在未挂载支持 936 编码的显示驱动与字库(如倚天、中文双桥、UCDOS 或 MS-DOS 7.10 专用的中文补丁)时,控制台直接运行会导致部分字符集解析异常。ECHO.SYS驱动:DEVICE=C:\DOS\ECHO.SYS ...是早期启动盘为了在CONFIG.SYS执行阶段打印自定义文本(模拟图形化启动提示)而引入的第三方驱动。由于微软原生 MS-DOS 不支持在CONFIG.SYS中原生ECHO文本,该方式属于当年的通行技巧。DOSLFN与CP437UNI.TBL:DOSLFN是 DOS 下的长文件名支持 TSR。由于长文件名在 VFAT 系统中使用 Unicode 编码存储,DOSLFN必须依赖转换表(如 CP437 到 Unicode 的映射表)。如果在中文环境下混合使用长文件名和 936 编码,应配合CP936UNI.TBL,否则中文长文件名在目录列表中会显示为乱码或产生文件名校验错误。4. 光盘启动与 USB-HDD 盘符漂移机制说明
帖中提及“光盘启动后 BIOS 会把光盘映射成 C:,物理硬盘变成 D:”,以及“写入 U 盘后会将 USB 自身当做 C 盘”,这是由系统引导阶段的 INT 13h 仿真机制决定的:
- El Torito 光盘启动规范:启动光盘通常使用“软盘仿真(Floppy Emulation)”或“硬盘仿真(Hard Disk Emulation)”。若 ISO 制作时采用了硬盘仿真模式,BIOS 会将光盘介质接管为
DL=80h(即第一个物理硬盘,DOS 识别为C:),而将原机器的物理硬盘顺延为DL=81h(DOS 识别为D:)。若改用 No-Emulation(无仿真)或标准的 1.44M 软盘仿真(光盘模拟为A:),物理硬盘就会稳定保持为C:盘。- USB 启动环境:主板 BIOS 在引导 USB 设备时,会依据 USB 设备的 MBR 分区表将其模拟为
80h驱动器,导致安装程序若硬编码向C:\复制,实际上会将文件写入 U 盘自身。解决该问题的标准做法是通过批处理动态检测目标盘符(如利用FIND、RAMDRIVE或专用的探测工具),而不是硬编码C:\。
Gemini 解答
本帖涉及 DOS 安装介质制作、引导机制、内存管理器选型以及 DOS 衍生版本的内核差异。对帖中涉及的技术细节解读与纠正如下:
1. USB 启动盘“盘符漂移”的底层原因
原帖提到“写入 U 盘后 USB 会被当做 C 盘,物理硬盘变成 D 盘”。
- 机制成因:在传统 BIOS(Legacy BIOS)环境下,USB-HDD 模式引导时,主板 BIOS 的 INT 13h 中断服务会将当前启动的 U 盘映射为第一主驱动器(磁盘代号
80h)。DOS 系统初始化时根据 INT 13h 读出的磁盘顺序分配盘符,因此80h上的第一个主分区必定被分配为C:,而主板内置的物理硬盘则被识别为第二驱动器(81h),盘符顺延为D:。- 光盘引导差异:使用 El Torito 标准的光盘启动(如软盘模拟模式)时,BIOS 通常将虚拟软盘镜像映射为
A:或B:,因此物理硬盘仍为C:。- 解决方案:在纯 DOS 环境下解决 USB 启动盘符漂移,通常依赖 Grub4DOS 等前置引导器在实模式下执行磁盘交换(
map (hd0) (hd1)与map (hd1) (hd0),再执行map --hook),或者在安装批处理中避免硬编码C:,改用工具(如GETDRV或检测特定标记文件)动态识别目标物理磁盘的盘符。2. Windows 3.1 与内存管理器(JEMMEX / HIMEM / EMM386)的兼容性
原帖在 4 楼提到“想安装 WIN3.1,强烈建议使用 JEMMEX”,该结论存在技术误区:
- 标准兼容性事实:Windows 3.1(无论标准模式还是 386 增强模式)对第三方 EMS/XMS 内存管理器兼容性极差。JEMMEX 是 FreeDOS 生态下的集成式 XMS/EMS 管理器(基于 Jemm386/JemmEx 开发),其接管 CPU 保护模式(V86 模式)和 VCPI 机制的方式与 Windows 3.1 核心(
WIN386.EXE)的 DPMI/VxD 分页机制冲突,常导致 386 增强模式启动时出现实模式崩溃或蓝屏。- 正确搭配:Windows 3.1 / 3.2 运行在 386 增强模式下,最稳定的配置是微软原生的
HIMEM.SYS(提供 XMS 驱动),尽量不加载EMM386.EXE,若必须加载 EMM386,也需加入NOEMS开关以避免页框架抢占。3. CONFIG.SYS 与 AUTOEXEC.BAT 配置细节纠正
原帖在 4 楼给出的配置文件生成逻辑存在几处配置冲突与语法错误:
COUNTRY=001,936,...语法错误:COUNTRY命令的第一参数为国家代码(Country Code),第二参数为代码页(Code Page)。001代表美国(代码页 437)。如果要配置简体中文环境(代码页 936),国家代码应为086(即COUNTRY=086,936,C:\DOS\COUNTRY.SYS)。使用001,936会导致部分区域日期/时间格式与双字节字符解析异常。CHOICE交互的IF ERRORLEVEL顺序:在 4 楼的AC和TP2标签逻辑中:在 DOS 的IF ERRORLEVEL 4 GOTO WENDA IF ERRORLEVEL 3 GOTO TP1 IF ERRORLEVEL 2 GOTO CTMOUSE IF ERRORLEVEL 1 GOTO SHARECOMMAND.COM中,IF ERRORLEVEL n的语义是“返回值大于或等于 $n$”。原帖按照从大到小的顺序检测是正确的;但在早期版本中常有开发者误用升序(先判断 1),导致永远命中第一个分支。4. 各版本 DOS 内核特性解析(关于 2.2 规划版)
原帖列出了几个不同内核计划,其实际技术差异如下:
- MS-DOS 7.10 与 Win98 内核:原版 MS-DOS 7.10 即提取自 Windows 95 OSR2 / Windows 98 / 98 SE(核心文件为
IO.SYS与MSDOS.SYS)。所谓“DOS 7.1 自制版”本质上是对 Windows 98 的实模式核心进行了去图形化包装,原生支持 FAT32 分区和大硬盘(LBA / INT 13h 扩展)。- MS-DOS 6.22 内核:仅支持 FAT12/FAT16 文件系统,单个逻辑驱动器最大容量为 2GB,不支持 INT 13h 扩展寻址(最大只能访问 BIOS 寻址限制内的 8.4GB 硬盘)。
- Windows ME 内核(MS-DOS 8.0):微软在 WinME 的
IO.SYS中默认禁用了实模式 DOS 引导功能(移除了直接进入纯实模式的接口,默认强制拉起WIN.COM并锁定了AUTOEXEC.BAT/CONFIG.SYS处理)。要在 WinME 内核下实现纯 DOS 运行,必须通过补丁修改IO.SYS中的跳转指令以解除实模式锁定。此外,WinME 移除了多项经典实模式维护工具。