注册 登录
编程论坛 汇编论坛

关于硬盘DMA传送

ljg438 发布于 2012-06-02 14:08, 3205 次点击
;本人硬盘的总线号 0,设备号31,FUNTION 2(SLAVE),主设备为0,31,5但不能作为DMA主控设备(PCI CMD REG=3,BIT2不能置位)
;硬盘DMA基地址REG=0E091H(OFFSET 20H),即CONTROL REG=0E090H,STATUS REG=0E092H,PRD REG=0E094H
;base address reg=0e0d0h
;本人的问题在于:为什么按照INTEL 82801AA(ICH0)的资料无法用DMA读去硬盘缓冲区?本论坛藏龙卧虎,请进到此贴的大牛一定留下个一言半语点化下小弟,不胜感激!!!
;程序如下:
.model small
.386
.code
start:
cli
mov al,0ffh
out 0a1h,al

mov dx,0e090h
mov al,0
out dx,al

mov dx,0e092h
mov al,6
out dx,al

mov ax,4000h
mov es,ax
mov di,0
mov eax,40000h
mov dx,0e094h
out dx,eax
mov eax,20000h
stosd
mov eax,80000200h
stosd

mov eax,0
call readsector

mov al,1
mov dx,0e090h
out dx,al

mov dx,0e092h
l1:
in al,dx
test al,4
jz l1
mov al,6
out dx,al

mov ah,4ch
int 21h

readsector proc near
push eax
push dx
mov dx,0e0d3h
out dx,al
inc dx
shr eax,8
out dx,al
inc dx
shr eax,8
out dx,al
inc dx
shr eax,8
add al,0e0h
out dx,al

mov dx,0e0d2h
mov al,1
out dx,al
mov dx,0e0d7h
mov al,20h
out dx,al
l0:
in al,dx
cmp al,58h
jnz l0
pop dx
pop eax
retn
end start



24 回复
#2
bingghost2012-06-04 00:49
膜拜啊   膜拜啊   
#3
ljg4382012-06-04 12:55
大哥有话直说,膜拜什么??
#4
zjsxwc2012-06-05 19:44
首先如果你是在没有操作系统或者dos下的时候这是可以搞定的.
然后如果是在linux,Windows这些现代操作系统下,你不能直接用汇编操作io,,万幸现代操作系统都给出了相应的io操作接口(所谓的驱动drivers),我们可以方便地调用这些接口来操作io,而不必担心错误的操作导致硬件损坏。

对于Windows下操作dma可以参考microsoft提供的此文  http://download.

对于linux下操作dma可以参考 Jonathan Corbet的   http://
#5
ljg4382012-06-07 19:58
大哥,这点我还不知道么,当然是在DOS下了,我的目标人群是主板开发人员,但遗憾的是这些底层武工高手一般没时间上论坛这类网站,很难在这里碰到
#6
zklhp2012-06-07 20:01
以下是引用ljg438在2012-6-7 19:58:33的发言:

大哥,这点我还不知道么,当然是在DOS下了,我的目标人群是主板开发人员,但遗憾的是这些底层武工高手一般没时间上论坛这类网站,很难在这里碰到

没法啊 这就几个学生 大牛没有 像我都不是搞计算机的 呵呵
#7
ljg4382012-06-07 20:07
我连个学生都不是啊,我是农民工啊,我自学的,(别歧视我)  :)
#8
zjsxwc2012-06-10 19:54
回复 5楼 ljg438
擦,不要黑我大DOS ,我大DOS 可以像你这样直接 用eax这个寄存器?

[ 本帖最后由 zjsxwc 于 2012-6-10 21:31 编辑 ]
#9
zklhp2012-06-10 20:49
以下是引用zjsxwc在2012-6-10 19:54:44的发言:

擦,不要黑我大DOS ,我大DOS 可以用eax这个寄存器?

理论上可以。。
#10
zjsxwc2012-06-10 20:57
回复 9楼 zklhp
实模式下 DOS 可以用32位寄存器eax ?
#11
zklhp2012-06-10 21:06
以下是引用zjsxwc在2012-6-10 20:57:19的发言:

实模式下 DOS 可以用32位寄存器eax ?
可以进保护模式嘛
#12
zklhp2012-06-10 21:07
核心的问题就是 进了保护模式 还算DOS么 所以这个问题。。
#13
ljg4382012-06-13 12:23
回复 4楼 zjsxwc
多谢ZJSXWC兄的关心,现在我已经独立解决了。这个问题的关键点在于命令的顺序不能颠倒
如下
.MODEL SMALL
.386
.CODE
START:
CLD
MOV AX,40000H ;PRD DESCRIPTOR
MOV ES,AX
MOV DI,0
MOV EAX,20000H
STOSD
MOV EAX,80000200H
STOSD

MOV DX,0E094H  ;PRD ADDRESS
MOV EAX,40000H
OUT DX,EAX

MOV AL,1 ;STATUS REG
MOV DX,0E092H
OUT DX,AL
INC DX
MOV AL,0
OUT DX,AL
INC DX
OUT DX,AL
INC DX
OUT DX,AL
INC DX
MOV AL,0E0H
OUT DX,AL
INC DX
MOV AL,0C9H ;DMA READ CMD
OUT DX,AL

MOV AL,0
MOV DX,0E090H
OUT DX,AL

MOV DX,0E092H
MOV AL,6
OUT DX,AL

MOV AL,9
MOV DX,0E090H ;READ START
OUT DX,AL

MOV AH,4CH
INT 21H
END START


;该DEMO用于将硬盘MBR扇区读入绝对地址2000:0处,大家可以试是,结尾为55AA
关于各自寄存器的来源遍历PCI总线,唯一确定的OFFSET 0BH,0AH值为01 00(硬盘)
#14
ljg4382012-06-13 12:26
回复 11楼 zklhp
大哥,我无语了,汇编语言即是机器语言,现在还有8086么,都是P4以上了吧,还有什么指令不能执行的??
还32位,都64位了,参看指令前缀66,67H
#15
ljg4382012-06-13 12:27
回复 12楼 zklhp
32寄存器位不用进保护模式,指令前缀66H,67H
#16
ljg4382012-06-13 12:31
实模式甚至能访问4G内存,你们不知道么
#17
zklhp2012-06-13 12:33
4G内存的帖子我就转来了

我记得我回复了啊
#18
ljg4382012-06-13 12:43
.386p
code segment para use16
assume cs:code
start:
xor eax,eax
mov ebx,eax
mov ax,seg gdt0
she eax,4
mov bx,offset gdt0
add eax,ebx
mov dword ptr cs:[gdtbase],eax

cli
in al,0eeh
lgdt qword ptr cs:[gdtlen]
mov eax,cr0
or al,1
mov cr0,eax
mov bx,8
mov fs,bx
and al,0feh
mov cr0,eax

mov edi,0fffffff0h
mov cx,8
mov ax,2000h
mov ds,ax
mov si,0
l0:
mov ax,fs:[di]
mov ds:[si],ax
add ax,2
add si,2
add di,2
dec cx
cmp cx,0
jnz l0
mov ah,4ch
int 21h
gdtlen dw 0fh
gdtbase dd 0
gdt0 dq 0
gdt1 dq 00cf92000000ffffh
code ends
end start
;access 4g memory in dos,将2000:0与FFFF:0的16各字节比较一下吧,CPU上电的第一条指令
#19
ljg4382012-06-13 12:47
;错了2处,SHL EAX,4   去掉ADD AX,2

.386p
code segment para use16
assume cs:code
start:
xor eax,eax
mov ebx,eax
mov ax,seg gdt0
shl eax,4
mov bx,offset gdt0
add eax,ebx
mov dword ptr cs:[gdtbase],eax

cli
in al,0eeh
lgdt qword ptr cs:[gdtlen]
mov eax,cr0
or al,1
mov cr0,eax
mov bx,8
mov fs,bx
and al,0feh
mov cr0,eax

mov edi,0fffffff0h
mov cx,8
mov ax,2000h
mov ds,ax
mov si,0
l0:
mov ax,fs:[di]
mov ds:[si],ax
add si,2
add di,2
dec cx
cmp cx,0
jnz l0
mov ah,4ch
int 21h
gdtlen dw 0fh
gdtbase dd 0
gdt0 dq 0
gdt1 dq 00cf92000000ffffh
code ends
end start
#20
ljg4382012-06-13 12:51
日,还有一处,MOV AX,FS:[EDI]
#21
a2619353482012-06-13 14:45
最近有容乃大跑哪里去了...都没人回答我问题了!!
#22
ljg4382012-06-13 14:53
回复 21楼 a261935348
你想知道什么?
#23
ljg4382012-06-13 14:54
DOS下当然可以用32位寄存器
#24
ljg4382012-06-13 14:55
包括64位
#25
ghhr62014-11-28 05:54
啊,正是我需要的资料,mark一下先
1