Assembly Kernel.c未执行完整代码[OS从头开始]

Assembly Kernel.c未执行完整代码[OS从头开始],assembly,x86,kernel,bootloader,osdev,Assembly,X86,Kernel,Bootloader,Osdev,我是一个操作系统的初学者,我正在尝试从头开始构建操作系统(遵循以下步骤)。虽然我可以执行作者提供的代码。但是,当我添加自定义引导加载程序(显然需要更多内存,并等待键盘中断加载内核),然后尝试添加教程中提到的驱动程序时,我的内核不会执行完整的代码(可能会,也可能不会) 实际上,我在kernel.c中有5条print语句(当我不添加任何驱动程序时,所有语句都可以正常工作),但一旦我开始添加驱动程序(即使我没有执行任何驱动程序函数),代码似乎就避免了底部的print语句 我尝试更改内核偏移量,但似乎没

我是一个操作系统的初学者,我正在尝试从头开始构建操作系统(遵循以下步骤)。虽然我可以执行作者提供的代码。但是,当我添加自定义引导加载程序(显然需要更多内存,并等待键盘中断加载内核),然后尝试添加教程中提到的驱动程序时,我的内核不会执行完整的代码(可能会,也可能不会)

实际上,我在kernel.c中有5条print语句(当我不添加任何驱动程序时,所有语句都可以正常工作),但一旦我开始添加驱动程序(即使我没有执行任何驱动程序函数),代码似乎就避免了底部的print语句

我尝试更改内核偏移量,但似乎没有任何效果

kernel.c


void clear_screen() // clear the entire text screen
{
    char *vga = (char *)0xb8000;
    unsigned int i = 0;
    while (i < (80 * 25 * 2))
    {
        vga[i] = ' ';
        i++;
        vga[i] = COLOR;
        i++;
    }
}

unsigned int kprintf(char *message, unsigned int line) // the message and then the line #
{
    char *vga = (char *)0xb8000;
    unsigned int i = 0;

    i = (line * 80 * 2);

    while (*message != 0)
    {
        if (*message == '\n') 
        {
            line++;
            i = (line * 80 * 2);
            *message++;
        }
        else
        {
            vga[i] = *message;
            *message++;
            i++;
            vga[i] = COLOR;
            i++;
        }
    }

    return (1);
}


void main() // like main in a normal C program
{
    clear_screen();
    kprintf("Hi!\nThis is our Kernel\n", 2);
    kprintf("Our Team Members:\n", 12);
    kprintf("1. Aditya Garg \n",13);
    kprintf("2. Ayush Agarwal\n", 14);
    kprintf("3. Anup Aglawe \n", 15);
    kprintf("4. Anshuman yadav \n", 16);
    kprintf("5. Ujjaval shah \n", 17);
};
驱动程序/端口

unsigned char port_byte_in (unsigned short port);
void port_byte_out (unsigned short port, unsigned char data);
unsigned short port_word_in (unsigned short port);
void port_word_out (unsigned short port, unsigned short data);
在添加驱动程序文件夹之前

添加驱动程序文件夹后(我没有使用驱动程序的任何功能)


另外,如果有人要求,我可以分享我的全部代码。

根据屏幕截图,其中只打印了部分菜单,我可以猜测您的内核(
kernel.bin
)尚未完全加载到内存中。在
load_kernel
中,您可以执行以下操作:

load_kernel:    
    mov bx, KERNEL_OFFSET 
    mov dh, 1                ; <----- Number of sectors to read
    mov dl, [BOOT_DRIVE]
    call disk_load
    ret

您需要增加这个数字以读取足够的扇区来加载整个内核。要计算出要加载的扇区数,请计算
kernel.bin的大小,将511加上,然后除以512。numsectors=(filesize+511)/512计算加载
filesize
文件所需的512字节扇区数,四舍五入到最接近的512字节扇区。将该值加载到DH。

非常感谢@MichaelPetch。它似乎正在为NoHyLee工作,您可以为QEMU调整您的OS映像:QEMU IMG调整大小的OSimix.Bin 1M,这将允许您在Bootloader中读取没有磁盘错误的多个扇区,这是因为QEMU将您的OS映像视为整个磁盘。
    unsigned char result;

    __asm__("in %%dx, %%al" : "=a" (result) : "d" (port));
    return result;
}

void port_byte_out (unsigned short port, unsigned char data) {

    __asm__("out %%al, %%dx" : : "a" (data), "d" (port));
}

unsigned short port_word_in (unsigned short port) {
    unsigned short result;
    __asm__("in %%dx, %%ax" : "=a" (result) : "d" (port));
    return result;
}

void port_word_out (unsigned short port, unsigned short data) {
    __asm__("out %%ax, %%dx" : : "a" (data), "d" (port));
}
unsigned char port_byte_in (unsigned short port);
void port_byte_out (unsigned short port, unsigned char data);
unsigned short port_word_in (unsigned short port);
void port_word_out (unsigned short port, unsigned short data);
load_kernel:    
    mov bx, KERNEL_OFFSET 
    mov dh, 1                ; <----- Number of sectors to read
    mov dl, [BOOT_DRIVE]
    call disk_load
    ret
; load 'dh' sectors from drive 'dl' into ES:BX