OSDev http://osdev.su/ |
|
VESA отваливается что делать http://osdev.su/viewtopic.php?f=6&t=549 |
Страница 4 из 5 |
Автор: | Станислав [ 23 май 2012, 16:12 ] |
Заголовок сообщения: | Re: VESA отваливается что делать |
scuter писал(а): я вроди беру адрес VESA LFB и записываю туда картинку, неужели такое в процессоре предусмотрено, перенаправление адресов памяти процессора на адрес памяти другого устройства. хотя спасибо запояснение теперь понятно что монитор всё равно будет показывать даже если установить GDT IDT. Ты ставиш GDT IDT для защищённого режима, процессор и VESA здесь причём? Картинка 1024*768*4=3145728 байт в реальном 16 режиме нету, этот 32битный режим(он устанавливается только там а пользуются им в 32битном), бери VESA LFB и спокойно пользуйся в защищённом. Памяти в 32битном режиме 4гига, но верхние адреса для работы с памятью устройств используется, тем самым отбирая немного памяти у компа. Лучше пользоваться 64битном, там можно иметь мноого аперативки, видео памяти. |
Автор: | diablo [ 12 апр 2015, 21:33 ] |
Заголовок сообщения: | Re: VESA отваливается что делать |
У меня похожая проблема... @Bochs всё работает ok @QEMU TripleFault и соотв. ребут сразу после jmp gdt_code:pmode Код: Triple fault CPU Reset (CPU 0) EAX=00000011 EBX=00000143 ECX=000003e8 EDX=2193f401 ESI=00012d3e EDI=000015d8 EBP=0000253e ESP=00004000 EIP=00000380 EFL=00207006 [-----P-] CPL=0 II=0 A20=1 SMM=0 HLT=0 ES =4000 00040000 0000ffff 00009300 DPL=0 DS16 [-WA] CS =2000 00020000 0000ffff 00009b00 DPL=0 CS16 [-RA] SS =1000 00010000 0000ffff 00009300 DPL=0 DS16 [-WA] DS =4000 00040000 0000ffff 00009300 DPL=0 DS16 [-WA] FS =1000 00010000 0000ffff 00009300 DPL=0 DS16 [-WA] GS =1000 00010000 0000ffff 00009300 DPL=0 DS16 [-WA] LDT=0000 00000000 00000000 00008200 DPL=0 LDT TR =0008 00000580 00000067 00008900 DPL=0 TSS32-avl GDT= 00000000 00000000 IDT= 00040408 000007ff CR0=00000011 CR2=00000000 CR3=00000000 CR4=00000000 DR0=0000000000000000 DR1=0000000000000000 DR2=0000000000000000 DR3=0000000000000000 DR6=00000000ffff0ff0 DR7=0000000000000400 CCS=00000000 CCD=00000011 CCO=LOGICW EFER=0000000000000000 FCW=037f FSW=0000 [ST=0] FTW=00 MXCSR=00001f80 FPR0=0000000000000000 0000 FPR1=0000000000000000 0000 FPR2=0000000000000000 0000 FPR3=0000000000000000 0000 FPR4=0000000000000000 0000 FPR5=0000000000000000 0000 FPR6=0000000000000000 0000 FPR7=0000000000000000 0000 XMM00=00000000000000000000000000000000 XMM01=00000000000000000000000000000000 XMM02=00000000000000000000000000000000 XMM03=00000000000000000000000000000000 XMM04=00000000000000000000000000000000 XMM05=00000000000000000000000000000000 XMM06=00000000000000000000000000000000 XMM07=00000000000000000000000000000000 GDT= 00000000 00000000 - это разве нормально? Может код видеобиоса портит мою GDT ??? На реальном железе: раньше работало, после замены в/карты на Radeon HD7770 - ребут в том же месте... Очень долго мучал, искал ошибки в коде, но всё безуспешно... ЗЫ VESA инициализирую ДО перехода в PMODE, работаю через LFB ПАМАГИТЕ КТО ЧЕМ МОЖЕТЕ!!! |
Автор: | pavia [ 12 апр 2015, 23:01 ] |
Заголовок сообщения: | Re: VESA отваливается что делать |
При переходе в защищенный режим место завершения ошибки и место её возникновения может быть не связано. Одна из причин то что эммулятор выполняет за раз несколько команд. Поэтому я стараюсь всё перепроверять. И по хорошему дизассемблировать 10 команд до и после. Цитата: Может код видеобиоса портит мою GDT ??? Если разработчики quemu путают GDT c GDTR то вам этого делать не стоит.GDT портить не может. А вот GDTR не исключаю. Хотя вероятность этого очень мола. Это легко проверить если от дизассемблировать код видео биоса и сделать поиск перехода в защищенный режим. Но как я сказал что вероятность мола, то я бы вначале поискал ошибку в другом месте. Цитата: GDT= 00000000 00000000 - это разве нормально? Нет. Это не нормально. Но эмуляторам я не доверяю. Надо смотреть код перехода в защищенный режим. А вообще я бы посоветовал переходить в защищенный режим с включенными прерываниям. |
Автор: | diablo [ 13 апр 2015, 08:34 ] |
Заголовок сообщения: | Re: VESA отваливается что делать |
pavia писал(а): Поэтому я стараюсь всё перепроверять. И по хорошему дизассемблировать 10 команд до и после. Надо смотреть код перехода в защищенный режим. А вообще я бы посоветовал переходить в защищенный режим с включенными прерываниям. Код: ;------------------------------------------------------------------------------- lgdt [GDT_OFFSET] mov word[SYS_DATA+PDESCR+limit],IDT_SIZE-1 mov word[SYS_DATA+PDESCR+base_l],((DATASG<<4)&0fff0h)+IDT_OFFSET mov word[SYS_DATA+PDESCR+base_m],(DATASG>>12) mov byte[SYS_DATA+PDESCR+attr_1],FLAGS_DS mov byte[SYS_DATA+PDESCR+attr_2],0 lidt [SYS_DATA+PDESCR] ;------------------------------------------------------------------------------- ; открываем адресную линию A20 in al,92h or al,2 out 92h,al ; mov al,20h ; сигал EOI для разблокирования уровня ; out 020h,al ; IRQ клавиатуры и нижележащих ; out 0A0h,al ;------------------------------------------------------------------------------- ;%include "_8253.asm" ;set8253 %include "_8259.asm" set8259 ;set8259new ;------------------------------------------------------------------------------- mov byte[SYS_DATA+ps2_resolution],3 mov byte[SYS_DATA+ps2_samplerate],200 call ps2init ;------------------------------------------------------------------------------- smsw ax or ax,1 lmsw ax ; mov eax,cr0 ; or ax,1 ; mov cr0,eax jmp GDT_CODE<<3:p_mode ;------------------------------------------------------------------------------- p_mode: mov ax,GDT_SCRN<<3 mov ds,ax mov es,ax xor ax,ax mov di,ax mov cx,80*25 rep stosw ;------------------------------------------------------------------------------- ; mov ax,GDT_CODE<<3 ; mov fs,ax ;Error @286 ; mov gs,ax mov ax,GDT_DATA<<3 mov ds,ax mov ax,GDT_STCK<<3 mov ss,ax mov ax,GDT_FLAT<<3 mov fs,ax mov ax,GDT_SCRN<<3 mov gs,ax ; mov sp,INIT_SP mov ax,GDT_TSS0<<3 ltr ax ;80286 uses 16-bit(short) TSS Прикол в том, что без инициализации VESA, в текстовом режиме все работает - и в qemu и на реальном железе (Pentium D820) Ошибка возникает именно на jmp GDT_CODE<<3:p_mode - уверен в этом, т.к. ставил jmp $ до(виснет) и после(ребут) Естественно имеется обработчик исключений, но до него дело не доходит, что странно... Сразу Triple Fault и ребут... VESA инициализирую практически в самом начале... |
Автор: | pavia [ 13 апр 2015, 09:40 ] |
Заголовок сообщения: | Re: VESA отваливается что делать |
1) Как инициируешь GDTR? И GDT? 2) Тут ошибка, не учитывается переполнение. Код: mov word[SYS_DATA+PDESCR+base_l],((DATASG<<4)&0fff0h)+IDT_OFFSET mov word[SYS_DATA+PDESCR+base_m],(DATASG>>12) Можешь проверит при DSEG=9b00h и IDT_OFFSET=5000h Надо ((DATASG<<4)+IDT_OFFSET)&0ffffh ((DATASG<<4)+IDT_OFFSET)>>16 C GDTR тоже самое скорее всего. 3) Я таки не понял у вас код для 286 который не мог адресовать больше 16 МБайт. Как вы с LFB собрались работать не понятно! Почему код в p_mode: 16 битный? Цитата: jmp GDT_CODE<<3:p_mode В дизассемблере инструкцию проверяли правильно генерируется или нет?
|
Автор: | diablo [ 13 апр 2015, 10:14 ] |
Заголовок сообщения: | Re: VESA отваливается что делать |
pavia писал(а): 1) Как инициируешь GDTR? И GDT? Код: ;Set up GDT mov si,GDT add si,bp mov di,GDT_OFFSET mov cx,GDT_ENTRIES<<2 rep movsw ;skipped lgdt [GDT_OFFSET] pavia писал(а): 2) Тут ошибка, не учитывается переполнение. Код: mov word[SYS_DATA+PDESCR+base_l],((DATASG<<4)&0fff0h)+IDT_OFFSET mov word[SYS_DATA+PDESCR+base_m],(DATASG>>12) Можешь проверит при DSEG=9b00h и IDT_OFFSET=5000h Надо ((DATASG<<4)+IDT_OFFSET)&0ffffh ((DATASG<<4)+IDT_OFFSET)>>16 C GDTR тоже самое скорее всего. Спасибо, исправил... Только вот GDT располагается намного раньше 0xFFFF - так что не думаю, что эта ошибка была критичной... Код: INT_OFFSET equ 8h INT_SIZE equ 4*100h IDT_OFFSET equ INT_OFFSET+INT_SIZE %ifdef USE_X64 IDT_SIZE equ 16*100h %else IDT_SIZE equ 8*100h %endif GDT_OFFSET equ IDT_OFFSET+IDT_SIZE GDT_NULL equ 0 GDT_STCK equ 1 ;08h GDT_CODE equ 2 ;10h GDT_DATA equ 3 ;18h GDT_SCRN equ 4 ;20h ;skipped FLAGS_CS equ 10011010b ;9ah ;P|DPL|11|C|R|A FLAGS_DS equ 10010010b ;92h ;P|DPL|10|E|W|A FLAGS_US equ FLAGS_CS|(RPL<<5) ;11111010b ;0fah FLAGS_ES equ FLAGS_DS|(RPL<<5) ;11110010b ;0f2h ;skipped ;структура для описания дескрипторов сегментов struc descr limit resw 1 ;00h Граница, биты 0..15 base_l resw 1 ;02h база, биты 0..15 base_m resb 1 ;04h база, биты 16..23 attr_1 resb 1 ;05h байт аттрибутов 1 ;P|DPL|S|TYPE attr_2 resb 1 ;06h байт аттрибутов 2 ;G|D/B/X|L|AVL|LIM16-19 base_h resb 1 ;07h база, биты 24..31 endstruc ;pdescr istruc descr ; iend ;GDT GDT istruc descr ;00h ; at limit, dw GDT_SIZE-1 at limit, dw 0xFFFF at base_l, dw ((DATASG<<4)&0xFFFF)+GDT_OFFSET at base_m, db (DATASG>>12) iend gdt_stck istruc descr ;08h at limit, dw 0xFFFF at base_l, dw (STCKSG<<4)&0xFFFF at base_m, db (STCKSG>>12) at attr_1, db FLAGS_DS ;P|DPL|0|TYPE ; at attr_2, db 0 ;G|X|0|AVL|LIMIT iend gdt_code istruc descr ;10h at limit, dw code_size-1 at base_l, dw (CODESG<<4)&0xFFFF at base_m, db (CODESG>>12) at attr_1, db FLAGS_CS ;P|DPL|11|C|R|A ; at attr_2, db 0 ;G|D|L|AVL|LIMIT iend gdt_data istruc descr ;18h at limit, dw 0FFFFh ;data_size-1 at base_l, dw (DATASG<<4)&0xFFFF at base_m, db (DATASG>>12) at attr_1, db FLAGS_DS ;P|DPL|10|E|W|A ; at attr_2, db 0 ;G|B|0|AVL|LIMIT iend gdt_scrn istruc descr ;20h %ifdef USE_VESA at limit, dw 0xFFFF at base_l, dw (VESASG<<4)&0xFFFF at base_m, db (VESASG>>12) %else at limit, dw 0xFFF at base_l, dw (SCRNSG<<4)&0xFFFF at base_m, db (SCRNSG>>12) %endif at attr_1, db FLAGS_ES at attr_2, db 11011111b ;G|X|0|AVL|LIMIT ;%ifdef USE_LFB ; at limit, dw 0xFFFF ; at base_l, dw (FLATSG<<4)&0xFFFF ; at base_m, db (FLATSG>>12) ; at base_h, db (FLATSG>>16) ; at attr_1, db FLAGS_DS ;%endif iend pavia писал(а): 3) Я таки не понял у вас код для 286 который не мог адресовать больше 16 МБайт. Как вы с LFB собрались работать не понятно! Почему код в p_mode: 16 битный? А вот это особый момент... Изначально, чисто ради интереса, я стал писать под 80286 (ибо их у меня аж ДВА штуки))) И теперь код по большей части так и остался 16-битным... Переделать на 32/64-бит пока не получилось... Хотя TSS 32-битные... Кстати, вопрос: в NASM достаточно использовать директиву BITS ? И еще есть проблема при переделывании на 32/64 - я так понимаю надо заменить всё 16-битные команды 32-битными? Верно? Ибо у меня сразу всё виснет, а bochs ругается мол неверный префикс LOCK итп НО! В bochs ведь работает! Код: 00163568000i[CPU0 ] | IOPL=3 ID vip vif ac vm rf NT of df IF tf sf zf af PF cf 00163568000i[CPU0 ] | SEG sltr(index|ti|rpl) base limit G D 00163568000i[CPU0 ] | CS:0010( 0002| 0| 0) 00020000 0000ffff 0 0 00163568000i[CPU0 ] | DS:0038( 0007| 0| 0) 01000000 5fffffff 1 0 00163568000i[CPU0 ] | SS:0008( 0001| 0| 0) 00060000 0000ffff 0 0 00163568000i[CPU0 ] | ES:0038( 0007| 0| 0) 01000000 5fffffff 1 0 00163568000i[CPU0 ] | FS:0050( 000a| 0| 0) 00000000 ffffffff 1 1 00163568000i[CPU0 ] | GS:0020( 0004| 0| 0) e0000000 00ffffff 1 0 pavia писал(а): Цитата: jmp GDT_CODE<<3:p_mode В дизассемблере инструкцию проверяли правильно генерируется или нет?да, там всё ок... Код: 0000037E 0F01E0 smsw ax
00000381 83C801 or ax,byte +0x1 00000384 0F01F0 lmsw ax 00000387 EA8C031000 jmp word 0x10:0x38c 0000038C B82000 mov ax,0x20 |
Автор: | pavia [ 13 апр 2015, 11:36 ] |
Заголовок сообщения: | Re: VESA отваливается что делать |
Код: at base_l, dw ((DATASG<<4)&0xFFFF)+GDT_OFFSET at base_m, db (DATASG>>12) Тут тоже надо исправит и забыть про эту ошибку. Так в коде ничего не видно. Предлагаю перед установкой бита CR0.PE Сделать отладочный вывод. И смотреть что портится. Проверяйте всё по порядку. Вначале.SGDT Потом проверить выравнивание базы. И самое главное придел. Затем дескриптор CS сегмента. Цитата: IOPL=3 вот это не нормально должен быть 0.Цитата: НО! В bochs ведь работает! Это основы тестирования. Прохождения теста не означает отсутствия ошибок. А виду того что проверить все параметры невозможно. То отгадать где и когда произойдёт ошибка невозможно. Цитата: И еще есть проблема при переделывании на 32/64 - я так понимаю надо заменить всё 16-битные команды 32-битными? Верно? Ибо у меня сразу всё виснет, а bochs ругается мол неверный префикс LOCK итп Я считаю что проще переписать. Так как не надо будет корячится с расчётами и обрабатывать переполнения. А так достаточно изменить кодовую таблицу при помощи use32. |
Автор: | diablo [ 13 апр 2015, 12:16 ] |
Заголовок сообщения: | Re: VESA отваливается что делать |
Цитата: Тут тоже надо исправит и забыть про эту ошибку. Да-да, исправил) Просто сюда кинул до исправления... Цитата: Сделать отладочный вывод А как его сделать-то, если уже перешли в граф.режим? Снова вернуться в текстовый? Попробовал сейчас... В режим 108h (80*25) не переходит... Как быть? Цитата: IOPL=3 вот это не нормально должен быть 0. Ну, если я правильно понимаю, при IOPL=3 любая задача с любым CPL имеет доступ ко всем портам - не думаю, что на данный момент это критично... Хотя, странно... Код: IOPL equ 0 ;!!! EFLAGS equ (IOPL<<12)|(1<<9)|(0<<8) ;IF=1,TF=0 Где я мог ошибиться? ЗЫ Блин... Ну без весы-то работает везде!!! |
Автор: | pavia [ 13 апр 2015, 12:52 ] |
Заголовок сообщения: | Re: VESA отваливается что делать |
Цитата: А как его сделать-то, если уже перешли в граф.режим? Снова вернуться в текстовый? Попробовал сейчас... В режим 108h (80*25) не переходит... Как быть? Вместе LFB если не путаю должны работать оконный режим можешь выводить графику в A000h:0000h - A000h:FFFFh. Код: {Получить указатель на шрифт}
procedure GetCharMap; assembler; asm PUSHA MOV AX,1130h; MOV BH,03h; INT 10h; MOV Word PTR [CharMap+2],es; MOV Word PTR [CharMap+0],bp; POPA RET end; {Вывод текста на экран} {для режима CGA 320x200x8Бит под нужное переделать несложно} procedure WriteText(x,y:Integer; s:String; Color:Byte); var yy,b,c,i,j,k:Word; begin for i:=1 to Length(S) do begin yy:=Word(y)*Width; c:=Byte(s[i]); for j:=0 to 7 do begin b:=CharMap^[c*8+j]; for k:=0 to 7 do if b shl k and 128<>0 then begin Buffer^[yy+x+k]:=Buffer^[yy+x+k] xor Color; end; yy:=yy+Width; end; x:=x+16; end; end; |
Автор: | diablo [ 13 апр 2015, 13:22 ] |
Заголовок сообщения: | Re: VESA отваливается что делать |
pavia писал(а): Цитата: GDT= 00000000 00000000 - это разве нормально? Нет. Это не нормально. Но эмуляторам я не доверяю. Вот же ж ёмаё... Действительно, GDT не загружается... Поставил jmp reboot перед jmp pmode, и вижу следующее: Без %define USE_VESA всё OK: Код: CPU Reset (CPU 0) EAX=000000fe EBX=00000143 ECX=000003e8 EDX=2193f401 ESI=00010000 EDI=000015e0 EBP=00000000 ESP=00004000 EIP=000008aa EFL=00247006 [-----P-] CPL=0 II=0 A20=1 SMM=0 HLT=1 ES =4000 00040000 0000ffff 00009300 DPL=0 DS16 [-WA] CS =2000 00020000 0000ffff 00009b00 DPL=0 CS16 [-RA] SS =1000 00010000 0000ffff 00009300 DPL=0 DS16 [-WA] DS =4000 00040000 0000ffff 00009300 DPL=0 DS16 [-WA] FS =1000 00010000 0000ffff 00009300 DPL=0 DS16 [-WA] GS =1000 00010000 0000ffff 00009300 DPL=0 DS16 [-WA] LDT=0000 00000000 00000000 00008200 DPL=0 LDT TR =0008 00000580 00000067 00008900 DPL=0 TSS32-avl GDT= 00040c10 0000ffff IDT= 00040410 000007ff А если определить USE_VESA, то видим: Код: CPU Reset (CPU 0) EAX=000000fe EBX=00000143 ECX=000003e8 EDX=2193f401 ESI=00012d3e EDI=000015e0 EBP=0000253e ESP=00004000 EIP=000008f8 EFL=00207006 [-----P-] CPL=0 II=0 A20=1 SMM=0 HLT=1 ES =4000 00040000 0000ffff 00009300 DPL=0 DS16 [-WA] CS =2000 00020000 0000ffff 00009b00 DPL=0 CS16 [-RA] SS =1000 00010000 0000ffff 00009300 DPL=0 DS16 [-WA] DS =4000 00040000 0000ffff 00009300 DPL=0 DS16 [-WA] FS =1000 00010000 0000ffff 00009300 DPL=0 DS16 [-WA] GS =1000 00010000 0000ffff 00009300 DPL=0 DS16 [-WA] LDT=0000 00000000 00000000 00008200 DPL=0 LDT TR =0008 00000580 00000067 00008900 DPL=0 TSS32-avl GDT= 00000000 00000000 IDT= 00040410 000007ff Т.е. почему-то портится GDT... Как я и предполагал... Буду разбираться...) |
Страница 4 из 5 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |