OSDev

для всех
Текущее время: 28 апр 2024, 11:51

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: Помогите с багом в загрузчике.
СообщениеДобавлено: 02 ноя 2013, 15:09 

Зарегистрирован: 02 ноя 2013, 14:48
Сообщения: 5
Помогите, пожалуйста!
Есть код загрузчика:
Код:
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 перезагружается!
Заранее спасибо!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите с багом в загрузчике.
СообщениеДобавлено: 02 ноя 2013, 16:05 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Команда retfd использует 32-битные значения стека, поэтому должно быть
pushd 08h
pushd PM_entry
retfd

Если Bochs перезагрузится снова, то смотри описание ошибки в файле bochsout.txt


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите с багом в загрузчике.
СообщениеДобавлено: 02 ноя 2013, 16:20 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Верно, retfd извлек бы дополнительный word из стека, хотя не уверен что его значение как-то бы повлияло на результат работы команды. Вопрос в том, определен ли вообще стек и зачем так извращаться, когда есть официально задокументированный для этой цели и более эффективный far jump.

Код:
     org 1000h
Если вы пытаетесь таким способом выполнить выравнивание на указанный адрес, то вы грубо ошибаетесь. Правильный вариант:
Код:
  rb 1000h-$


"org 200h" тоже неправильно используется.

Сегмент кода и сегмент стека должны быть 32-разрядными. Или нужно убрать "use32".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите с багом в загрузчике.
СообщениеДобавлено: 02 ноя 2013, 19:22 

Зарегистрирован: 02 ноя 2013, 14:48
Сообщения: 5
Спасибо!Попробую


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите с багом в загрузчике.
СообщениеДобавлено: 02 ноя 2013, 19:25 

Зарегистрирован: 02 ноя 2013, 14:48
Сообщения: 5
Там в первом случае исправлю.А во втором на всякий случай. IDT всё равно занимает место
до смещения 1000h
Сегмент кода и данных у меня один (так можно?) и он 32 битный
только селекторы грузятся в уже в pm.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите с багом в загрузчике.
СообщениеДобавлено: 02 ноя 2013, 19:34 

Зарегистрирован: 02 ноя 2013, 14:48
Сообщения: 5
Упс... Я забыл перенастоить sp.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите с багом в загрузчике.
СообщениеДобавлено: 02 ноя 2013, 19:43 

Зарегистрирован: 02 ноя 2013, 14:48
Сообщения: 5
Ёёё,я тут с кодом намудрил!
Просто я его писал неделю назад ночью :lol: и после этого не смотрел.
Пойду переписовать ...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите с багом в загрузчике.
СообщениеДобавлено: 02 ноя 2013, 19:54 

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

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

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB