B IOS прерывание 0x10 вызывает загрузку из ПЗУ l oop в QEMU - PullRequest
2 голосов
/ 12 января 2020

Проблема

Я программирую базовое c ядро ​​на C с небольшой сборкой. Я хочу изменить режим видео на 0x13, но когда я вызываю int 0x10, QEMU застревает в booting from ROM l oop, где, как представляется, он многократно выполняет ядро.


Файлы

kernel.asm

bits 32
global start
extern _kmain

section .text

        align 4
        dd 0x1BADB002
        dd 0x00
        dd -(0x1BADB002 + 0x00)

start:
        mov ah, 0x00
        mov al, 0x13
        int 0x10
        call _kmain
        hlt

kernel. c

void print(int x, int y, int colour, char* text) {
    char* video = (char*)0xb8000;
    unsigned int a = 0;
    unsigned int b = 0;

    a = ((y - 1) * 160) + ((x - 1) * 2);

    while (text[b] != '\0') {
        video[a] = text[b];
        video[a + 1] = colour;
        ++b;
        a = a + 2;
    }

    return;
}

void clear(int colour) {
    char* video = (char*)0xb8000;
    for (int a = 0; a < 4000; a = a + 2) {
        video[a] = ' ';
        video[a + 1] = colour;
    }

    return;
}

void kmain() {
    clear(0xff);
    print(1, 1, 0xf0, "Some text...");

    return;
}

ссылка. ld

OUTPUT_FORMAT(pei-i386)
ENTRY(start)

SECTIONS
 {
   . = 0x100000;
   .text : { *(.text) }
   .data : { *(.data) }
   .bss  : { *(.bss)  }
 }

Я компилирую и запускаю ядро, используя следующие команды:

nasm -f elf32 kernel.asm -o ka.o
gcc -m32 -c kernel.c -o kc.o -ffreestanding -nostdlib -nostdinc
ld -T link.ld -o kernel ka.o kc.o
objcopy -O elf32-i386 kernel kernel.elf

qemu-system-i386 -kernel kernel.elf

Скриншоты

С C kmain вызов функции и int 0x10 прерывание

QEMU booting from ROM loop

Только с вызовом функции C kmain

QEMU with only the C kmain function

Только с int 0x10 прерыванием

With only the int 0x10 interrupt

...