|
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
状态 离线
|
|
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 |
|