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: Помогите с багом в загрузчике.

Ёёё,я тут с кодом намудрил!
Просто я его писал неделю назад ночью :lol: и после этого не смотрел.
Пойду переписовать ...

Автор:  phantom-84 [ 02 ноя 2013, 19:54 ]
Заголовок сообщения:  Re: Помогите с багом в загрузчике.

jBES писал(а):
Там в первом случае исправлю.А во втором на всякий случай. IDT всё равно занимает место
до смещения 1000h
Нет, убрать все org кроме "org 600h".

Цитата:
Сегмент кода и данных у меня один (так можно?) и он 32 битный
только селекторы грузятся в уже в pm.
Я имел в виду, что у тебя дескрипторы в GDT описывают 16-разрядные сегменты, а код после "use32" идет 32-разрядный.

Инициализации стека вообще нигде не видно.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/