C内核-在虚拟机上运行良好,但在实际计算机上运行不正常?

C内核-在虚拟机上运行良好,但在实际计算机上运行不正常?,c,assembly,operating-system,kernel,hex,C,Assembly,Operating System,Kernel,Hex,我正在制作一个基本的C内核。(由汇编程序加载)我使用i686 elf windows交叉编译器编译它。我的C代码如下: void cls(); void drawhappy(); void main(){ char *vidptr = (char *)0xb8000; cls(); drawhappy(); } void cls(){ char *vidptr = (char *)0xb8000; unsigned int j = 0; whil

我正在制作一个基本的C内核。(由汇编程序加载)我使用i686 elf windows交叉编译器编译它。我的C代码如下:

void cls();
void drawhappy();
void main(){
    char *vidptr = (char *)0xb8000;
    cls();
    drawhappy();
}

void cls(){
    char *vidptr = (char *)0xb8000;
    unsigned int j = 0;
    while(j < 80*2*25){
        vidptr[j] = ' ';
        vidptr[j+1] = 0x07;
        j = j+2;
    }
}

void drawhappy(){
    char *vidptr = (char *)0xb8000;
    const unsigned int linewidth = 80*2;
    vidptr[3] = 0xa7;
    vidptr[5] = 0xa7;
    vidptr[7] = 0xa7;
    vidptr[9] = 0xa7;
    vidptr[1+linewidth] = 0xa7;
    vidptr[5+linewidth] = 0xa7;
    vidptr[7+linewidth] = 0xa7;
    vidptr[11+linewidth] = 0xa7;
    vidptr[1+linewidth*2] = 0xa7;
    vidptr[3+linewidth*2] = 0xa7;
    vidptr[5+linewidth*2] = 0xa7;
    vidptr[7+linewidth*2] = 0xa7;
    vidptr[9+linewidth*2] = 0xa7;
    vidptr[11+linewidth*2] = 0xa7;
    vidptr[1+linewidth*3] = 0xa7;
    vidptr[5+linewidth*3] = 0xa7;
    vidptr[7+linewidth*3] = 0xa7;
    vidptr[11+linewidth*3] = 0xa7;
    vidptr[1+linewidth*4] = 0xa7;
    vidptr[11+linewidth*4] = 0xa7;
    vidptr[3+linewidth*5] = 0xa7;
    vidptr[5+linewidth*5] = 0xa7;
    vidptr[7+linewidth*5] = 0xa7;
    vidptr[9+linewidth*5] = 0xa7;
}

(Print-string.asm只打印字符串,切换到\u pm.asm切换到保护模式,Print\u string\u pm.asm在保护模式下打印字符串。)

您没有初始化段寄存器。尝试将引导扇区的开始更改为以下内容:

xor ax, ax
mov bp, 0x9000
mov ds, ax
mov es, ax
mov ss, ax ; disables interrupts until the end of the next instruction
mov sp, bp
mov [BOOT_DRIVE], dl

您是否在以前的阶段明确设置了视频模式?你的计算机上真的有BIOS吗,或者只是一个模拟的BIOS?不清楚你想如何引导它,因为它是一个受保护模式的ELF映像,而经典的引导扇区是在16位实模式下运行的。你需要一些引导加载程序(比如grub)或者可以理解它的固件。我有UEFI,这是否意味着它是仿真的@User35443您是否还没有编写任何引导加载程序代码或类似的代码?@Jester但是,为什么我可以在virtualbox上将其作为VM引导?关于具体编译步骤的最少示例位于:我在以下位置遇到了类似的问题:
xor ax, ax
mov bp, 0x9000
mov ds, ax
mov es, ax
mov ss, ax ; disables interrupts until the end of the next instruction
mov sp, bp
mov [BOOT_DRIVE], dl