Мое почтение всем. Пытаюсь заткнуть прерывания от винчестера, но они почему-то все равно приходят. При чем, как всегда, под виртуальными машинами все Ок (Bochs, VMWare), на реальном железе процедура обработки прерывания выполняется. Пробовал разные варианты: и подождать DRDY и очистить "ожидающие" прерывания (хотя, по идее, это не нужно), но прерывания приходят и приходят. У кого-нибудь есть варианты, почему такое может быть? Тестовый код выглядит так: Код (Text): org 0x7C00 xor ax, ax mov ds, ax mov es, ax mov ss, ax mov sp, 0x7C00 cli mov ax, 0xB800 mov es, ax mov dword [0x76 * 4], .hndlr ;Select device mov al, 0x0 mov dx, 0x1F6 out dx, al ;Wait DRDY mov dx, 0x1F7 .wait_DRDY: in al, dx test al, 0x40 mov word [es:0x2], 0x731 jz .wait_DRDY mov word [es:0x2], 0x720 ;Read status mov dx, 0x1F7 in al, dx nop nop nop nop ;Read alternate status mov dx, 0x3F6 in al, dx nop nop nop nop ;Set nIEN mov al, 0x2 out dx, al ;Send IDENTIFY_DEVICE for test mov dx, 0x1F7 mov al, 0xEC out dx, al sti jmp $ .hndlr: mov ax, 0xB800 mov es, ax mov word [es:0x0], 0x730 iret times 510 - ($ - $$) db 0xFF dw 0xAA55 Вроде бы, никаких ошибок нет. У кого-нибудь есть идеи? Заранее благодарен.
Заткнуть прерывания от винта можно следующим образом: Код (Text): StandardIDEBases dd 1F0h,3F6h,170h,376h mov esi,offset StandardIDEBases mov edx,[esi+4] mov al,2 out dx,al ; 1 - st chanel disable mov edx,[esi+12] out dx,al ; 2 - nd chanel disable Но, это работает только для IDE винтов для которых диапазон ввода/вывода фиксирован. Если у Вас винт воткнут в RAID контроллер или SATA винт - то надо искать соответствующий девайс на шине PCI узнать диапазон адресов ввода/вывода и далее работать с ним как с обычным IDE, ну или почти как с обычным.
Вообще то IDE тоже надо на PCI искать, потому что во-первых может быть подключён дополнительный IDE контроллер и IO адреса у него будут другие, а во-вторых интегрированный контроллер тоже может работать не в Legacy, а в Native режиме и адреса у него могут быть любые - хотя такое практически и не встречается...
Exception13 А в чем отличие от моего кода? Как я понял из экспериментов, прерывание всегда приходит всего один раз, когда выставляешь nIEN. Тестил на двух разных устройствах. Пришлось смириться с этим фактом.