TalismanChet
@TalismanChet
Программист-любитель

Почему Qemu вылетает?

Я пишу ОС на fasm, и случайно все сломал. Я потратил несколько дней на то, чтобы понять в чем дело. Ничего не вышло.

Код

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;                                                              ;;
;; Copyright (C) HexOS author 2019-2022. All rights reserved.   ;;
;; Distributed under terms of the GNU General Public License    ;;
;;                                                              ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

format binary as "sec"

use16

org 0x07C00

jmp boot_entry

nop

boot_entry:

mov ax, 3
int 16

mov ah, 2
mov al, 10
mov cx, 2
mov bx, 0x07E00
mov bp, 0
mov es, bp
int 13h

mov sp, 7E0h
mov bp, 7E00h
mov ds, bp
jmp 0000:7E00h

cli
hlt
jmp $-2

times 510-$+$$ db 00h

dw 0AA55h

; MACROS

macro movs reg, src {
    push ax
    mov ax, src
    mov reg, ax
    pop ax
}

; HEADER
org 0x8100

jmp p32
nop

db "system/kernel.hex", 00h
times 243-$+$$ db 00h

dd 00000000h
dd 00000000h
dd 00001000h
db 10000000b

; DATA

osname db "HexOS", 00h
osver  db "v0.9.4", 00h
oscopy db "Ivan Chetchasov Vladimirovich 2019-2022 (c) All rights reserved.", 00h

; SYSDATA

GDT: dw 0
    .size dw @f-GDT-1
    .linear dd GDT
    .code = $ - GDT
        dw -1,0
        db 0,9ah,0cfh,0
    .data = $ - GDT
        dw -1,0
        db 0,92h,0cfh,0
    .pointer:
        dw GDT.size
        dd GDT
    @@:

; EXECUTABLE

; switch to P-mode

p32:

cli                     ; NO more interrupts
lgdt fword[GDT.pointer] ; Load GDT
mov eax, cr0            ; Where my CR0?
or al, 1                ; set lowest bit
mov cr0,eax             ; apply changes
jmp GDT.code:pmode     ; jump next

macro IRQ IRP {
    dw IRP AND 65535
    dw 8
    db ?
    db 10001111b
    dw (IRP SHR 16) AND 65535
}

use32

curx dd 0
cury dd 0
winw dd 160
winh dd 50

color:
.normal db 0x0F
.error  db 0xFC
.block  db 0x70
.bsod   db 0x1F

printsz:
    mov ebx, 0xB8000
    .cycle:
        lodsb
        cmp al, 00h
        je .end
        push ebx
        add ebx, [curx]
        add [curx], 2
        mov word [ebx], ax
        pop ebx
        jmp .cycle
    .end:
    ret

IDT:
    ; ISRs
    IRQ ISR._0
    IRQ ISR._1
    IRQ ISR._2
    IRQ ISR._3
    IRQ ISR._4
    ; pointer
    .pointer:
        dw @f-IDT-1
        dd IDT
    @@:

raise_bsod:
    mov ah, [color.bsod]
    mov esi, bsod
    call printsz
    cli
    hlt

ISR:
    ._0: ; #DE
        call raise_bsod
        iret
    ._1: ; #DB
        cli
        hlt
        iret
    ._2: ; #NMI
        call raise_bsod
        iret
    ._3: ; #BP
        cli
        hlt
        iret
    ._4: ; #OF
        call raise_bsod
        iret
    ;

bsod:
db "                                                                                "
db "                                                                                "
db "                                                                                "
db "                                                                                "
db "             ((((((                                                             "
db "           ((::::::(             ERROR OCCURRED                                 "
db "         ((:::::::(                                                             "
db "        (:::::::((                                                              "
db "        (::::::(                                                                "
db " :::::: (:::::(            Patential reasons:                                   "
db " :::::: (:::::(              - Corrupted file system/kernel.hex                 "
db " :::::: (:::::(              - This is an unstable kernel                       "
db "        (:::::(            Ways to solve the problem:                           "
db "        (:::::(              - reinstall system                                 "
db "        (:::::(              - install stable kernel                            "
db " :::::: (::::::(                                                                "
db " :::::: (:::::::((         If it is not unstable realise or                     "
db " ::::::  ((:::::::(        kernel was not touched, write me                     "
db "           ((::::::(       in Habr OS writing blog. Thanks.                     "
db "             ((((((                                                             "
db "                                                                                "
db "                                                                                "
db "                                                                                "
db "                                                                                "
db "                                                                                ", 0x00

pmode:

use32

; I also need to set data segment

mov ax, GDT.data
mov ds, ax
; stack segment
mov ss, ax
; graphic segment
movs gs, ax

lidt fword [IDT.pointer]

; Call 32-bit kernel

call main

; footer, just halt
; because os mustn`t
; reach this part of
; code so maybe fatal
; error happened.

cli
hlt
jmp $-2

; 32-BIT PART
main:
    int 0
    ret

db 128

times 5120-$+$$ db 00h


Расследование

Сначала проверил адреса и размеры файлов через бинарный редактор.

Адрес ядра в образе C.H.S = 0.0.2:
62a6fffeecb7c672754199.png

Размер ядра в образе S = 5616/512-1 = 9
62a7014f6b087315774600.png

Код первого сектора(есть в листинге в тексте вопроса):

org 0x07C00
jmp boot_entry
nop
boot_entry:
mov ax, 3
int 16
mov ah, 2
mov al, 10
mov cx, 2
mov bx, 0x07E00
mov bp, 0
mov es, bp
int 13h
mov sp, 7E0h
mov bp, 7E00h
mov ds, bp
jmp 0000:7E00h
cli
hlt
jmp $-2
times 510-$+$$ db 00h
dw 0AA55h

я пробовал поменять al на 9, но это ничего не поменяло.

UPD

Я нашел что-то странное... прыжок в 0х0:00, вот:
62a715a8c965c333902003.png
Я так и не понял, что здесь произошло.

UPD2

Я нашел ещё более странную вещь: после прыжка в начало памяти, там что-то выполняется, а потом управление возвращается моему коду, но в нем уже появляются инструкции, которые я не писал:
62a72087e87e3702599776.png

UPD3

Я нахожу все больше несовпадений.
Вот код:
62a8aad90fd68795645778.png
А вот, как он выполняется:
62a8ab291bbc1276521715.png
  • Вопрос задан
  • 207 просмотров
Пригласить эксперта
Ответы на вопрос 2
jcmvbkbc
@jcmvbkbc
http://dilbert.com/strip/1998-08-24
Я потратил несколько дней на то, чтобы понять в чем дело. Ничего не вышло.

Эта часть вопроса не даёт нам никакой полезной информации. Рассказывай что делал, а мы попробуем понять, что пошло не так в твоём расследовании.
Ответ написан
TalismanChet
@TalismanChet Автор вопроса
Программист-любитель
Правильный ответ дал dodo512, который подсказал нетрогать ds. Только вот сделал он это в комментариях
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы