LINUX.ORG.RU

Аппаратное программирование


0

0

Подскажите, пож-та, сайты с описаниями интерфейсов взаимодействия с устройтсвами "первой необходимости" на уровне портов ввода/вывода (интересует ps/2 keyboard, ps/2 mouse и т.п.) Еще может кто сталкивался: из описания VBE3.0 (скачано с www.vesa.org) нашел, что можно использовать эти функции из PM, соответственно, выполняю все операции по инструкции (создаю нужные 16-ти битные дескрипторы и т.д. и т.п.), но не работает - происходит исключение в момент, когда прерывания запрещены (код vesa bios, скопированный в другую область памяти) - комп ребут. Причем, запрос информации (VBE Info) работает, а вот видеорежим не включает. Подобная "фигня" с клавиатурой: по описанию, должен бит 1 устанавливаться в 0 в порту 64h при свободной очереди команд, но он всегда у меня в 1 установлен (комп виснет). Разобрав исходники ядра linux-2.6.3-7mdk, не нашел там, чтобы это применялось. Там используется скан-код подтверждения команды. В исходниках MenuetOS, например, вообще эта штука не используется (команды клавиатуре не посылаются). Короче, написал я тут много, но проблем еще больше. Просто, изучая ассемблер, по ходу дела пишу ядро собственной ОС, столкнулся с "аппаратным непониманием". Извиняюсь немного за оффтопик, но все же думаю, что подкините ссылку на "прозрачные" исходники или статейку на эту тему. Спасибо заранее.

★★★

Ответ на: комментарий от anonymous

уверен, он только по дурацки версию выдает: 0200h, хотя интерфейс защищенного режима через и структура PMInfoBlock есть только в VBE 3.0. Работает и PMInit (ее по докам надо вызывать первой, перед остальными вызовами, что и сделано). Да, карточка Radeon 9000 Pro. Вот кусок кода инициализации PMInfoBlock, videobios скопирована в основную память, все селекторы вроде бы корректные (проверял), исключений не вызывают
.....
mov edi,[PMInfoBlock]
mov eax,GDT_bdata1_sel
mov ds,eax
mov word [edi+8],GDT_bdata2_sel
mov word [edi+10],GDT_A0000h_sel
mov word [edi+12],GDT_B0000h_sel
mov word [edi+14],GDT_B8000h_sel
mov word [edi+16],GDT_bdata1_sel
mov byte [edi+18],1
mov bx,word [edi+6]

push es ds
pop es ds

mov [vbe_call],bx
push es
mov eax,GDT_bdata2_sel
mov es,eax
mov ecx,600h/4
xor eax,eax
xor edi,edi
rep stosd
pop es
call vesa_bios
mov edi,[PMInfoBlock]
movzx ebx,word [es:edi+4]
mov [vbe_call],bx

mov ax,4F02h
mov bx,4115h
call vesa_bios <--- вот на этом ребут

....
vesa_bios:
pushad
mov [pm_stack_ss],ss
mov [pm_stack_esp],esp
mov ss,[rm_stack_ss]
mov esp,[rm_stack_esp]
call far dword [vbe_call]
mov ss,[pm_stack_ss]
mov esp,[pm_stack_esp]
popad
ret
pm_stack_ss dw ?
pm_stack_esp dd ?
rm_stack_ss dw GDT_16bitSS_sel
rm_stack_esp dd 3ffh

Дескрипторы в GDT:

GDT_A0000h db 0FFh,0FFh,0,0,0Ah,10010010b,0,0
GDT_B0000h db 0FFh,0FFh,0,0,0Bh,10010010b,0,0
GDT_B8000h db 0FFh,7Fh,0,80h,0Bh,10010010b,0,0
GDT_bdata1 db 0FFh,7Fh,0,0,0,10010010b,0,0
GDT_bcode db 0FFh,7Fh,0,0,0,10011010b,0,0
GDT_bdata2 db 0FFh,05h,0,0,0,10010010b,0,0
GDT_16bitSS db 0FFh,03h,0,0,0,10010010b,0,0

В доках написано, что при вызове VESA BIOS нужно в SS загрузить селектор 16-тибитного сегмента данных, а sp = 0, но я не понял, как такое реализовать (как сделать call после этого??? Я не хочу делать все это через Task switch). Кстати, если вызывать vesa bios с 32-битным смещением - вылетает на retf - #GP

Envel ★★★
() автор топика
Ответ на: комментарий от Envel

Да, забыл, базы дескрипторов там инициируются динамически (не смотрите, то там 0)

Envel ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.