中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: 重要发现,纯DOS下,直接寻址4G 上一主题 | 下一主题
cxdzxc
新手上路





积分 10
发帖 4
注册 2010-6-13
状态 离线
『楼 主』:  重要发现,纯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 ]

2010-6-14 10:06
查看资料  发短消息 网志   编辑帖子  回复  引用回复
cxdzxc
新手上路





积分 10
发帖 4
注册 2010-6-13
状态 离线
『第 2 楼』:  

http://topic.csdn.net/u/20100613 ... ba5dd47f.html?56205


hpsmouse

()鼠()

等 级:

#15楼 得分:0回复于:2010-06-14 09:50:54验证成功,不过这个 0x67 好像只对 movs 有用,对一般的 mov 没用。

2010-6-14 11:01
查看资料  发短消息 网志   编辑帖子  回复  引用回复
cxdzxc
新手上路





积分 10
发帖 4
注册 2010-6-13
状态 离线
『第 3 楼』:  

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装入空描述符,然后再切回实模式,之后再运行这段程序就会出问题了。

2010-6-15 10:08
查看资料  发短消息 网志   编辑帖子  回复  引用回复
cxdzxc
新手上路





积分 10
发帖 4
注册 2010-6-13
状态 离线
『第 4 楼』:  

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命令运行就会死机了

2010-6-15 10:09
查看资料  发短消息 网志   编辑帖子  回复  引用回复
netwinxp
高级用户





积分 741
发帖 366
注册 2007-7-25
状态 离线
『第 5 楼』:  

DOS下访问4G要先打开A20,否则访问偶数地址会出问题。

2010-6-17 20:50
查看资料  发短消息 网志   编辑帖子  回复  引用回复
AlexZhang
系统支持





积分 952
发帖 410
注册 2007-2-8
状态 离线
『第 6 楼』:  



  Quote:
Originally posted by netwinxp at 2010-6-17 08:50 PM:
DOS下访问4G要先打开A20,否则访问偶数地址会出问题。

对头,需要打开A20地址线

2010-6-17 22:22
查看资料  访问主页  发短消息 网志   编辑帖子  回复  引用回复
johnsonlam
银牌会员

阿林


积分 1410
发帖 497
注册 2004-6-28
来自 九龍,香港
状态 离线
『第 7 楼』:  



  Quote:
Originally posted by AlexZhang at 2010-6-17 10:22 PM:

对头,需要打开A20地址线


根 據 Jack Ellis 兄 所 說 , A20 控 制 原 來 也 挺 『 不 標 準 』 ...

1) Port 92h logic
2) keyboard-port logic

還 要 用 時 上 鎖 和 解 鎖 lock / unlock , 煩 !




我 的 網 站 - http://optimizr.dyndns.org
2010-6-18 23:58
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
netwinxp
高级用户





积分 741
发帖 366
注册 2007-7-25
状态 离线
『第 8 楼』:  

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 ]

2010-6-20 13:59
查看资料  发短消息 网志   编辑帖子  回复  引用回复
gssxd
新手上路





积分 6
发帖 3
注册 2010-5-19
状态 离线
『第 9 楼』:  



[ Last edited by gssxd on 2010-6-21 at 22:42 ]

2010-6-21 22:40
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
gssxd
新手上路





积分 6
发帖 3
注册 2010-5-19
状态 离线
『第 10 楼』:  



  Quote:
Originally posted by netwinxp at 2010-6-20 13:59:
KBC是286以后的标准,92口不标准(它是MAC总线的标准,很多机子不能用,要在在BIOS SETUP把A20 Fast打开(如果有此项的话)才能支持),KBC法对x86通用,不过切 ...

关于A20 Disable以及Enable,还是要看BIOS里面的实现的。DOS下都是在调用INT15,BIOS提供的接口,属于Rumtime。BIOS在引导OS之前会把A20给Disbale。

2010-6-21 22:47
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
netwinxp
高级用户





积分 741
发帖 366
注册 2007-7-25
状态 离线
『第 11 楼』:  

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 ]

2010-6-22 18:25
查看资料  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: