Kernel BIOS中断0x10导致从QEMU中的ROM循环启动 问题

Kernel BIOS中断0x10导致从QEMU中的ROM循环启动 问题,kernel,qemu,rom,Kernel,Qemu,Rom,我正在用C语言编写一个基本内核,带有一点汇编代码。我想将视频模式更改为0x13,但当我调用int0x10时,QEMU陷入了从ROM启动的循环中,它似乎在重复执行内核 文件夹 kernel.asm bits 32 global start extern _kmain section .text align 4 dd 0x1BADB002 dd 0x00 dd -(0x1BADB002 + 0x00) start:

我正在用C语言编写一个基本内核,带有一点汇编代码。我想将视频模式更改为
0x13
,但当我调用
int0x10
时,QEMU陷入了从ROM启动的
循环中,它似乎在重复执行内核


文件夹 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;
}

我使用以下命令编译并运行内核:

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
中断

仅使用C
kmain
函数调用

仅带
int 0x10
中断


您确定重新启动是因为
int 0x10
而不是因为您的
main
函数吗?如果我删除了对C
kmain
函数的调用,它仍然会循环。您应该使用类似
haltloop:
\
hlt
\
jmp haltloop
的东西,而不仅仅是
hlt
。但不确定这是否解决了您的问题。另一个问题是您没有设置IDT,也没有进入Real或Virtual 86模式来运行中断10h调用,因为您需要使用视频BIOS服务。
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