Функция для чтения секторов с вики реально рабочая, я её перевёл на фасм и запустил в своёй оси вместо ide шной. Плюсы в том, что больше стало инфы о дисках, и работаем командами mov, а не in out, для этого добавлен дополнительный дма движок в аши, так же можно вешать несколько команд сразу и LFB адрес 48бит. Вот моя:
;cl-номер диска с 0 по 31, esi-номер сектора, edi-адрес в памяти ;ebx-количество байт, dx-количество секторов
read_ahci_dma: movzx eax,cl ;первый диск shl eax,7 ;умножим на 128 - 80h add eax,100h ;добавим 256 - 100h add eax,[ahciBUS] ;адрес диска mov ebp,[eax] ;Адрес команд
add ebp,32 ;вторая команда, нужно искать свободную и забивать туда
mov word[ebp],5 ;pmp=0 C=0 b=0 r=0 p=0 w=0 a=0 cfl=5 add ebp,2 mov word[ebp],1 ;количество таблиц add ebp,2 mov dword[ebp],0 ;размер передоваемых байт от устройства во время передачи изменяется add ebp,4
mov dword[ebp],def39 ;адрес на таблицу с инфой и таблицами [31:07] add ebp,4 mov dword[ebp],0 add ebp,4 mov dword[ebp],0 add ebp,4 mov dword[ebp],0 add ebp,4 mov dword[ebp],0 add ebp,4 mov dword[ebp],0
mov ebp,def39 ;Создадим CFIS
mov byte[ebp],27h ;FIS_REG_H2D add ebp,1 mov byte[ebp],80h ;pmport=0 c=1 add ebp,1 mov byte[ebp],25h ;READ SECTORS DMA EXT add ebp,1 mov byte[ebp],0 add ebp,1 mov [ebp],esi ;LBA add ebp,3 mov byte[ebp],40h ;1<<6 LBA mode add ebp,1 shr esi,24 mov [ebp],esi add ebp,4 mov [ebp],dx ;количество секторов add ebp,2 mov word[ebp],0 add ebp,2 mov dword[ebp],0
add ebp,70h ;Создадим PRDT mov [ebp],edi ;куда читать add ebp,4 mov dword[ebp],0 add ebp,4 mov dword[ebp],0 add ebp,4 or ebx, 80000000h ;количество байт и включим прерывания [21:00] mov [ebp],ebx
add eax,38h ;запустим нашу команду CI mov ebx,[eax] mov edx,1 shl edx,1 or ebx,edx mov [eax],ebx
@@:mov ebx,[eax] test ebx,ebx ;test [eax],edx ;ждём завершения и выходим jnz @b ret
Прерывания можно и не включать, по завершении контроллер сам обнуляет бит команды, перед использованием функции нужно забить адреса для команд Забивается в ней только одна прд запись из 65535, если байт забъёте больше, чем 22^2 не прочитает.
Нужно на большие объёмы создавать много таблиц прд и проверку на завершение лучше не делать, чтобы проц не занимать, а по завершении запускать команды из обработчика прерываний.
Последний раз редактировалось Станислав 14 мар 2012, 06:46, всего редактировалось 1 раз.
|