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