![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-09-03 22:57 |
共 47,812 主题排行 / 349,914 发帖 / 今日 0 篇 / 48,266 会员排行 |
| DOS开发编程 & 发展交流 (开发室) » 重要发现,纯DOS下,直接寻址4G |
| 可打印版本 3,150 / 10 |
| 第1楼 cxdzxc | 发表于 2010-06-14 10:06 |
| 新手上路 发帖 4 积分 10 | |
|
重要发现,纯DOS下,直接寻址4G 重要发现,纯DOS下,不操作CR0,不装载描述符,直接寻址4G,欢迎验证
romdizhi equ 0fffffff0h mov esi,romdizhi huancun equ 80000h qushu: xor ax,ax mov ds,ax mov es,ax mov edi,huancun mov ecx,10h/4 db 67h ;就是这句,非常关键 rep movsd mov ax,huancun/10h mov ds,ax mov es,ax [ Last edited by cxdzxc on 2010-6-14 at 10:09 ] |
|
| 第2楼 cxdzxc | 发表于 2010-06-14 11:01 |
| 新手上路 发帖 4 积分 10 | |
|
http://topic.csdn.net/u/20100613/14/513861a8-fce6-476e-ab6e-d279ba5dd47f.html?56205
hpsmouse ()鼠() 等 级: #15楼 得分:0回复于:2010-06-14 09:50:54验证成功,不过这个 0x67 好像只对 movs 有用,对一般的 mov 没用。 |
|
| 第3楼 cxdzxc | 发表于 2010-06-15 10:08 |
| 新手上路 发帖 4 积分 10 | |
|
cnzdgs
(满天星\n技术问题请勿私聊) 等 级: 2 更多勋章 #40楼 得分:0回复于:2010-06-15 01:54:48 16位代码中加上67H前缀就表示使用32位寻址,在实模式下也可以使用32位寻址,但要求相关段寄存器必须已装入适当的描述符,貌似还要求段寄存器的当前值必须为0(这点未验证过)。 在Windows的虚拟DOS环境中不允许使用32位寻址;在虚拟机中则要依赖于“虚拟”的具体实现,能否运行未知。在某些实体机纯DOS环境中可以运行,是由于启动时BIOS程序曾切入过保护模式,并且在ds、es中装入了32位段描述符,而在切回实模式时没有清除,所以在实模式中仍可使用。可以做个简单的验证,自己写一小段程序,切入保护模式,将ds、es装入空描述符,然后再切回实模式,之后再运行这段程序就会出问题了。 |
|
| 第4楼 cxdzxc | 发表于 2010-06-15 10:09 |
| 新手上路 发帖 4 积分 10 | |
|
cxdzxc
等 级: #42楼 得分:0回复于:2010-06-15 09:30:51 经过实验,王老师和DelphiGuy说的是正确的,应该是我的BIOS---在ds、es中装入了32位段描述符,而在切回实模式时没有清除,所以在实模式中仍可使用 下面帖出实验代码: org 100h cli xor eax,eax mov ax,cs shl eax,4 add [gdtzhizhen+2],eax lgdt [gdtzhizhen] mov eax,cr0 or al,1 mov cr0,eax mov bx,gdt1-gdt0 mov ds,bx mov es,bx and al,0feh mov cr0,eax mov ah,4ch int 21h gdt0 dd 0,0 gdt1 db 0ffh,0ffh,0,0,0,92h,0fh,0 gdtzhizhen dw $-gdt0,gdt0,0 ---------------------------- 用NASM编译成一个COM文件,先在DOS下运行这个文件,然后DEBUG 装入先前的实验代码,G命令运行就会死机了 |
|
| 第5楼 netwinxp | 发表于 2010-06-17 20:50 |
| 高级用户 发帖 366 积分 741 | |
|
DOS下访问4G要先打开A20,否则访问偶数地址会出问题。
|
|
| 第6楼 AlexZhang | 发表于 2010-06-17 22:22 |
| 系统支持 发帖 439 积分 1,025 | |
Originally posted by netwinxp at 2010-6-17 08:50 PM: 对头,需要打开A20地址线 |
|
| 第7楼 johnsonlam | 发表于 2010-06-18 23:58 |
| 银牌会员 发帖 497 积分 1,410 来自 九龍,香港 | |
Originally posted by AlexZhang at 2010-6-17 10:22 PM: 根 據 Jack Ellis 兄 所 說 , A20 控 制 原 來 也 挺 『 不 標 準 』 ... 1) Port 92h logic 2) keyboard-port logic 還 要 用 時 上 鎖 和 解 鎖 lock / unlock , 煩 ! |
|
| 第8楼 netwinxp | 发表于 2010-06-20 13:59 |
| 高级用户 发帖 366 积分 741 | |
|
KBC是286以后的标准,92口不标准(它是MAC总线的标准,很多机子不能用,要在在BIOS SETUP把A20 Fast打开(如果有此项的话)才能支持),KBC法对x86通用,不过切换慢,而且有时会和USB键鼠冲突(写KBC A20位时要先禁止KBC数据缓冲区写入,写完后再去掉禁止,否则USB键鼠有可能错误写到KBC命令缓冲区造成USB键鼠失效)。
我最早看到的DOS下利用FS、GS访问4G是梁肇新(就是那个超级结巴的开发者)9x年写的“在DOS实模式下直接存取4GB内存”一文,现在的“砖家”抄袭够狠的,全成了“原创”。 实模式下访问4G的最大问题是——对于FFFF:FFFF以上内存没有管理,所以还是通过INT 15、XMS、EMS、DPMI稳妥。 [ Last edited by netwinxp on 2010-6-20 at 14:14 ] |
|
| 第9楼 gssxd | 发表于 2010-06-21 22:40 |
| 新手上路 发帖 3 积分 6 | |
![]() [ Last edited by gssxd on 2010-6-21 at 22:42 ] |
|
| 第10楼 gssxd | 发表于 2010-06-21 22:47 |
| 新手上路 发帖 3 积分 6 | |
Originally posted by netwinxp at 2010-6-20 13:59: 关于A20 Disable以及Enable,还是要看BIOS里面的实现的。DOS下都是在调用INT15,BIOS提供的接口,属于Rumtime。BIOS在引导OS之前会把A20给Disbale。 |
|
| 第11楼 netwinxp | 发表于 2010-06-22 18:25 |
| 高级用户 发帖 366 积分 741 | |
|
CMOS里面的A20 Fast Enable/Disable是指提不提供92H口来快速切换A20的状态,如果Disable掉就不提供92H口,只能用慢速的KBC来切换,它和A20 Enable/Disable不是一回事。INT 15H事实上也是通过KBC或者92H口来操作。至于所谓的FireWare Runtime其实也就是把总线操作、I/O操作、所需数据用ASL(微软要求的格式)包装起来方便windows acpi操作硬件罢了,本质上和以前的APM差不多,只不过APM通过INT 15H调用,需切换到实模式(比如win98的关机),windows可以在保护模式通过ACPI根据ASL定义来操作硬件而已。ASL是微软提供标准和工具,说白了也就形成变相上的垄断,看看linux在实现ACPI上走了多少弯路不就明白了?其实如果里面放的是没经过“故意编译”的脚本,别的操作系统实现起来也不难了。
[ Last edited by netwinxp on 2010-6-22 at 18:52 ] |
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |