OSDev http://osdev.su/ |
|
Помогите с багом в загрузчике. http://osdev.su/viewtopic.php?f=6&t=816 |
Страница 1 из 1 |
Автор: | jBES [ 02 ноя 2013, 15:09 ] |
Заголовок сообщения: | Помогите с багом в загрузчике. |
Помогите, пожалуйста! Есть код загрузчика: Код: format binary org 600h include "macros.inc" jmp N N: push cs push cs pop ds pop fs push 0b800h pop es xor si,si xor di,di mov [redx],dx mov [rebx],ebx mov [reax],eax mov [recx],ecx jmp gotoPM redx dw ? rebx dd ? reax dd ? recx dd ? gotoPM: in al,92h or al,2 out 92h,al cli in al,70h or al,80h out 70h,al lgdt fword [GDTR] lidt fword [IDTR] mov eax,cr0 or al,1 mov cr0,eax push word 08h push dword PM_entry retfd ;============================================+ times 200h-($$-$) db 0 ;| org 200h ;| ;============================================+ IDT: ;| times 13 dq 0 ;| dw EOI,10001110000000b,08h,0h ;| dw GP_handler,10001110000000b,08h,0h ;| times 18 dq 0 ;| dw EOI,10001110000000b,08h,0h ;| dw RIQ0_handler,10001110000000b,08h,0h ;| dw RIQ1_handler,10001110000000b,08h,0h ;| times 255 - 33 ;| dw EOI,10001110000000b,08h,0h ;| ;============================================+ label IDT_SIZE at $-IDT ;| ;____________________________________________+ ;--------------------------------------------+ org 1000h ;| ;============================================+ GDT: ;| NULLS db 00h,00h,00h,00h,00h,00h,00h,00h ;| CODES db 0ffh,0ffh,00h,00h,00h,9ah,0h,0h ;| DATAS db 0ffh,0ffh,00h,00h,00h,92h,0h,0h ;| ;============================================+ label GDT_SIZE at $-GDT ;| ;____________________________________________+ ;--------------------------------------------+ GDTR: ;| dd GDT_SIZE - 1 ;| dw GDT ;| ;____________________________________________+ ;--------------------------------------------+ IDTR: ;| dd IDT_SIZE - 1 ;| dw IDT ;| ;============================================+ use32 PM_entry: mov eax,10h mov ds,ax mov ds,ax mov es,ax mov fs,ax mov gs,ax mov edi,0b8000h xor esi,esi mov ebx,ok mov al,07h call PM_printc jmp $ ok db "ok",0 PM_printc: mov ah,al s: mov al,[bx] cmp al,0h je e mov [es:di],ax inc bx inc di inc di jmp s e: ret GP_handler: pop [GP_code] mov al,07h call PM_printc iretd GP_msg db "GP exception:" GP_code dd ? db 0h RIQ0_handler: jmp EOI RIQ1_handler: jmp EOI EOI: push eax mov al, 20h out 020h, al out 0a0h, al pop eax iretd но на переходе в PM (команда retfd) возникает тройное исключение и bochs перезагружается! Заранее спасибо! |
Автор: | Himik [ 02 ноя 2013, 16:05 ] |
Заголовок сообщения: | Re: Помогите с багом в загрузчике. |
Команда retfd использует 32-битные значения стека, поэтому должно быть pushd 08h pushd PM_entry retfd Если Bochs перезагрузится снова, то смотри описание ошибки в файле bochsout.txt |
Автор: | phantom-84 [ 02 ноя 2013, 16:20 ] |
Заголовок сообщения: | Re: Помогите с багом в загрузчике. |
Верно, retfd извлек бы дополнительный word из стека, хотя не уверен что его значение как-то бы повлияло на результат работы команды. Вопрос в том, определен ли вообще стек и зачем так извращаться, когда есть официально задокументированный для этой цели и более эффективный far jump. Код: org 1000h Если вы пытаетесь таким способом выполнить выравнивание на указанный адрес, то вы грубо ошибаетесь. Правильный вариант:Код: rb 1000h-$ "org 200h" тоже неправильно используется. Сегмент кода и сегмент стека должны быть 32-разрядными. Или нужно убрать "use32". |
Автор: | jBES [ 02 ноя 2013, 19:22 ] |
Заголовок сообщения: | Re: Помогите с багом в загрузчике. |
Спасибо!Попробую |
Автор: | jBES [ 02 ноя 2013, 19:25 ] |
Заголовок сообщения: | Re: Помогите с багом в загрузчике. |
Там в первом случае исправлю.А во втором на всякий случай. IDT всё равно занимает место до смещения 1000h Сегмент кода и данных у меня один (так можно?) и он 32 битный только селекторы грузятся в уже в pm. |
Автор: | jBES [ 02 ноя 2013, 19:34 ] |
Заголовок сообщения: | Re: Помогите с багом в загрузчике. |
Упс... Я забыл перенастоить sp. |
Автор: | jBES [ 02 ноя 2013, 19:43 ] |
Заголовок сообщения: | Re: Помогите с багом в загрузчике. |
Ёёё,я тут с кодом намудрил! Просто я его писал неделю назад ночью и после этого не смотрел. Пойду переписовать ... |
Автор: | phantom-84 [ 02 ноя 2013, 19:54 ] |
Заголовок сообщения: | Re: Помогите с багом в загрузчике. |
jBES писал(а): Там в первом случае исправлю.А во втором на всякий случай. IDT всё равно занимает место Нет, убрать все org кроме "org 600h".до смещения 1000h Цитата: Сегмент кода и данных у меня один (так можно?) и он 32 битный Я имел в виду, что у тебя дескрипторы в GDT описывают 16-разрядные сегменты, а код после "use32" идет 32-разрядный.только селекторы грузятся в уже в pm. Инициализации стека вообще нигде не видно. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |