OSDev http://osdev.su/ |
|
Загрузка с флешки http://osdev.su/viewtopic.php?f=6&t=455 |
Страница 11 из 13 |
Автор: | Станислав [ 08 дек 2011, 07:13 ] |
Заголовок сообщения: | Re: Загрузка с флешки |
Еще вопрс, куда нужно поставить функцию для получения сообщения от мышки юсбишной в idt, или так не получится и нужно номер прерывания искать в шинах pci IDT: dd 0,0 ; 0 dw syscall_handler, 08h, 1000111000000000b, 0 ; 1 dd 0,0 ; 2 dd 0,0 ; 3 dd 0,0 ; 4 dd 0,0 ; 5 dd 0,0 ; 6 dd 0,0 ; 7 dw int8_handler, 08h, 1000111000000000b, 0 ; 8 (IRQ 0 - системный таймер) dw int9_handler, 08h, 1000111000000000b, 0 ; 9 (IRQ 1 - клавиатура) dw int_EOI, 08h, 1000111000000000b, 0 ; 10 (IRQ 2 - ведомый контроллер прерываний) dw int_EOI, 08h, 1000111000000000b, 0 ; 11 (IRQ 3 - COM2) dw int_EOI, 08h, 1000111000000000b, 0 ; 12 (IRQ 4 - COM1) dw exGP_handler, 08h, 1000111000000000b, 0 ; 13 #GP dw int_EOI, 08h, 1000111000000000b, 0 ; 14 (IRQ 6 - FDD) dw int_EOI, 08h, 1000111000000000b, 0 ; 15 (IRQ 7 - LPT1) dw int_EOI, 08h, 1000111000000000b, 0 ; 16 (8) dw int_EOI, 08h, 1000111000000000b, 0 ; 17 (9) dw int_EOI, 08h, 1000111000000000b, 0 ; 18 (10) dw int_EOI, 08h, 1000111000000000b, 0 ; 19 (11) dw int_EOI, 08h, 1000111000000000b, 0 ; 20 (12) dw int_EOI, 08h, 1000111000000000b, 0 ; 21 (13) dw int_EOI, 08h, 1000111000000000b, 0 ; 22 (14) dw int_EOI, 08h, 1000111000000000b, 0 ; 23 (15) |
Автор: | SII [ 08 дек 2011, 08:28 ] |
Заголовок сообщения: | Re: Загрузка с флешки |
Такое прерывание будет идти не от мышки, а от хост-контроллера USB, к которому может быть подключено несколько разных устройств. Работать с этим контроллером не так уж и просто, так что лучше от поддержки мыши пока отказаться. |
Автор: | Станислав [ 08 дек 2011, 11:27 ] |
Заголовок сообщения: | Re: Загрузка с флешки |
SII писал(а): так что лучше от поддержки мыши пока отказаться. :) А если во всех прерываний от pci проверять какой нибудь байт отвечающий за то, что это мыш? Тоже не поканает? |
Автор: | SII [ 08 дек 2011, 13:04 ] |
Заголовок сообщения: | Re: Загрузка с флешки |
Для контроллера прерываний не существует такого устройства, как USB-мышь, USB-клавиатура, USB-флэшка и т.д. и т.п., для него существует лишь хост-контроллер USB. Более того, никакое USB-устройство самостоятельно не может послать сигнал прерывания -- таковой передаётся только в ответ на прямой запрос со стороны хост-контроллера. Ну а контроллер должен быть кем-то запрограммирован, понятное дело. BIOS его программирует, чтобы поддерживать некоторые устройства (те же клавиатуру и мышь), но никаких сервисов программе пользователя, насколько помню, не предоставляет. Правда, BIOS обычно может имитировать наличие клавиатуры и мыши PS/2, когда реально используются устройства USB, но тогда программа пользователя работает с ними через контроллер PS/2 (и не задумывается, что физически этого интерфейса вообще может не быть -- это головная боль разработчиков материнки и BIOS). Точно так же дисковые сервисы BIOS имитируют работу с флэшкой как с обычным диском, однако, если пользователь захочет работать с ней напрямую, без BIOS, ему придётся для начала создавать драйвер хост-контроллера USB, над котором будет работать драйвер флэшки (ну и драйверы клавиатуры и мыши, если таковые нужны), а над ним -- драйвер файловой системы, используемой на этой флэшке. В общем, весьма непростая задача. |
Автор: | Himik [ 08 дек 2011, 14:08 ] |
Заголовок сообщения: | Re: Загрузка с флешки |
Станислав писал(а): А если во всех прерываний от pci проверять какой нибудь байт отвечающий за то, что это мыш? А тебе что, только прерывание нужно? Прерывание - это самая малая часть механизма. Ты сначала весь механизм изучи, потом будет видно - что, откуда и куда. Да и обычно в настройках BIOS включен режим эмуляции USB клавиатуры и мыши на PS/2, так что можно с USB не заморачиваться. |
Автор: | phantom-84 [ 08 дек 2011, 16:51 ] |
Заголовок сообщения: | Re: Загрузка с флешки |
Еще забыли сказать, что хост-контроллер обычно вешается на прерывания выше 15. А это дополнительное увеличение объема работ. Поэтому используем интерфейс PS/2 и IRQ12 и не паримся. Я до сих пор не имею поддержки USB. Если кто-то хочет этим заняться, то можно скооперироваться. |
Автор: | phantom-84 [ 08 дек 2011, 16:58 ] |
Заголовок сообщения: | Re: Загрузка с флешки |
Станислав писал(а): IDT: Ну-ну... Больше советов давать не буду - незачем.
dd 0,0 ; 0 dw syscall_handler, 08h, 1000111000000000b, 0 ; 1 dd 0,0 ; 2 dd 0,0 ; 3 dd 0,0 ; 4 dd 0,0 ; 5 dd 0,0 ; 6 dd 0,0 ; 7 dw int8_handler, 08h, 1000111000000000b, 0 ; 8 (IRQ 0 - системный таймер) dw int9_handler, 08h, 1000111000000000b, 0 ; 9 (IRQ 1 - клавиатура) dw int_EOI, 08h, 1000111000000000b, 0 ; 10 (IRQ 2 - ведомый контроллер прерываний) dw int_EOI, 08h, 1000111000000000b, 0 ; 11 (IRQ 3 - COM2) dw int_EOI, 08h, 1000111000000000b, 0 ; 12 (IRQ 4 - COM1) dw exGP_handler, 08h, 1000111000000000b, 0 ; 13 #GP dw int_EOI, 08h, 1000111000000000b, 0 ; 14 (IRQ 6 - FDD) dw int_EOI, 08h, 1000111000000000b, 0 ; 15 (IRQ 7 - LPT1) dw int_EOI, 08h, 1000111000000000b, 0 ; 16 (8) dw int_EOI, 08h, 1000111000000000b, 0 ; 17 (9) dw int_EOI, 08h, 1000111000000000b, 0 ; 18 (10) dw int_EOI, 08h, 1000111000000000b, 0 ; 19 (11) dw int_EOI, 08h, 1000111000000000b, 0 ; 20 (12) dw int_EOI, 08h, 1000111000000000b, 0 ; 21 (13) dw int_EOI, 08h, 1000111000000000b, 0 ; 22 (14) dw int_EOI, 08h, 1000111000000000b, 0 ; 23 (15) |
Автор: | Станислав [ 09 дек 2011, 10:36 ] |
Заголовок сообщения: | Re: Загрузка с флешки |
Как вам такой пример заполнения idt используется в татОс idt_desc: dw idt_end - idt - 1 ;idt limit/size dd idt ;idt linear physical address idt: dw ir0 ;interrupt 00, div by 0 (fault) dw 0x08 db 0 db 0x8e ;=1000110b, ring=0 dw 0 dw ird ;interrupt 01, RESERVED by Intel dw 0x08 db 0 db 0x8e dw 0 dw ir2 ;interrupt 02, NMI nonmaskable (interrupt) dw 0x08 db 0 db 0x8e dw 0 dw ird ;interrupt 03, breakpoint (trap) dw 0x08 db 0 db 0x8e dw 0 dw ir4 ;interrupt 04, overflow (trap) dw 0x08 db 0 db 0x8e dw 0 dw ir5 ;interrupt 05, BOUND range exceeded (fault) dw 0x08 db 0 db 0x8e dw 0 dw ir6 ;interrupt 06, invalid opcode (fault) dw 0x08 db 0 db 0x8e dw 0 dw ird ;interrupt 07, no math coprocessor (fault) dw 0x08 db 0 db 0x8e dw 0 dw ir8 ;interrupt 08, double fault (abort-error code) dw 0x08 db 0 db 0x8e dw 0 dw ird ;interrupt 09, coproc segment overrun (fault) dw 0x08 db 0 db 0x8e dw 0 dw ird ;interrupt 10, invalide tss (fault-error code) dw 0x08 db 0 db 0x8e dw 0 dw ird ;int 11, segment not present (fault-error code) dw 0x08 db 0 db 0x8e dw 0 dw ir12 ;interrupt 12, stack seg (fault-error code) dw 0x08 db 0 db 0x8e dw 0 dw ir13 ;interrupt 13, gen protection (fault-error code) dw 0x08 db 0 db 0x8e dw 0 dw ird ;interrupt 14, page (fault-error code) dw 0x08 db 0 db 0x8e dw 0 dw ird ;interrupt 15, RESERVED dw 0x08 db 0 db 0x8e dw 0 dw ir16 ;interrupt 16, FPU coprocessor (fault) dw 0x08 db 0 db 0x8e dw 0 dw ird ;interrupt 17, alignment check (fault-error code) dw 0x08 db 0 db 0x8e dw 0 dw ird ;interrupt 18, machine check (abort) dw 0x08 db 0 db 0x8e dw 0 dw ird ;interrupt 19, SIMD floating point (fault) dw 0x08 db 0 db 0x8e dw 0 ;19-31 are reserved unnamed exceptions dw ird ;interrupt 20 dw 0x08 db 0 db 0x8e dw 0 dw ird ;interrupt 21 dw 0x08 db 0 db 0x8e dw 0 dw ird ;interrupt 22 dw 0x08 db 0 db 0x8e dw 0 dw ird ;interrupt 23 dw 0x08 db 0 db 0x8e dw 0 dw ird ;interrupt 24 dw 0x08 db 0 db 0x8e dw 0 dw ird ;interrupt 25 dw 0x08 db 0 db 0x8e dw 0 dw ird ;interrupt 26 dw 0x08 db 0 db 0x8e dw 0 dw ird ;interrupt 27 dw 0x08 db 0 db 0x8e dw 0 dw ird ;interrupt 28 dw 0x08 db 0 db 0x8e dw 0 dw ird ;interrupt 29 dw 0x08 db 0 db 0x8e dw 0 dw ird ;interrupt 30 dw 0x08 db 0 db 0x8e dw 0 dw ird ;interrupt 31 dw 0x08 db 0 db 0x8e dw 0 ;interrupts 32-255 are User defined non-reserved ;we reprogrammed the pic to put 16 hdwre interrupts here ;so they dont conflict with the above software ints ;pic1, irq0-irq7, port 0x20 ;pic2, irq8-irq15, port 0xa0 ;start of PIC1 interrupts dw irq0 ;interrupt 32=0x20, irq0, system timer dw 0x08 db 0 db 0x8e dw 0 dw irq1 ;interrupt 33, irq1, keyboard dw 0x08 db 0 db 0x8e dw 0 dw irqd1 ;interrupt 34, irq2, int from 2nd pic dw 0x08 db 0 db 0x8e dw 0 dw irqd1 ;interrupt 35, irq3, com2 dw 0x08 db 0 db 0x8e dw 0 dw irqd1 ;interrupt 36, irq4, com1 dw 0x08 db 0 db 0x8e dw 0 dw irqd1 ;interrupt 37, irq5, lpt2 dw 0x08 db 0 db 0x8e dw 0 dw irqd1 ;interrupt 38, irq6, floppy disc dw 0x08 db 0 db 0x8e dw 0 dw irqd1 ;interrupt 39, irq7, lpt1 dw 0x08 db 0 db 0x8e dw 0 ;************************** ;start of PIC2 interrupts ;************************** dw irqd2 ;interrupt 40=0x28, irq8, real time clock dw 0x08 db 0 db 0x8e dw 0 dw irqd2 ;interrupt 41, irq9, general i/o dw 0x08 db 0 db 0x8e dw 0 dw irqd2 ;interrupt 42, irq10, general i/o dw 0x08 db 0 db 0x8e dw 0 dw irqd2 ;interrupt 43, irq11, general i/o dw 0x08 db 0 db 0x8e dw 0 dw irq12 ;interrupt 44, irq12, ps2 mouse dw 0x08 db 0 db 0x8e dw 0 dw irqd2 ;interrupt 45, irq13, coprocessor dw 0x08 db 0 db 0x8e dw 0 dw irqd2 ;interrupt 46, irq14, hard disc dw 0x08 db 0 db 0x8e dw 0 dw irqd2 ;interrupt 47, irq15, general i/o dw 0x08 db 0 db 0x8e dw 0 ;if you want kernel services ;use 0x30 = 48 idt_end: |
Автор: | phantom-84 [ 09 дек 2011, 12:58 ] |
Заголовок сообщения: | Re: Загрузка с флешки |
Собственно это я и предлагал, только syscall можно подальше сдвинуть, оставив резерв для прерываний выше 15. Например, в типичной конфигурации с APIC'ом используются не 16, а 24 прерывания. Как я ранее сказал, я резервирую диапазон вплоть до вектора 60h исключительно для аппаратных прерываний. |
Автор: | Станислав [ 09 дек 2011, 13:42 ] |
Заголовок сообщения: | Re: Загрузка с флешки |
Ну я ещё не до конца разобрался, у меня клава и таймер пашут, а остальные молчат как партизаны. Хотя размаскеровал все mov al, 00000000b out 0x21, al ; Размаскируем прерывания все out 0xA1, al ; Размаскируем прерывания все А как себя ведут прерывания у вас.(кроме клавы и таймера)? Как (сдвинуть) пока тоже не понимаю. Мне вообще пока 60 не нужно, мне бы мышку, я на экране нарисовал прозрачные иконки, а двигать их нечем. :(((((((( В прошлом примере на 44 ом мыш pc2 висела, но это комп придется с pc2 доставать. |
Страница 11 из 13 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |