当我调用一个函数来打印一个字符时,这是一个惊人的现象



我正在开发自己的操作系统。我已经完成了引导扇区并成功加载了我的内核。我的开发环境是Ubuntu 14.04和GCC 4.8。我的内核将在BOCHS下运行。我想在屏幕上的特定位置打印一个特定的字符,所以我创建了一个这样的函数:

void print_char(char target, int col, int row, unsigned char attribute) {
    //attribute controls the colour of the character
    char * vidmem = (char *) VIDEO_ADDRESS; //#define VIDEO_ADDRESS 0xb8000
    *vidmem = target;
    //TODO: add other control statements
}

我在main函数中调用这个函数,它是我的内核的入口点:

print_char('T', 0, 0, (unsigned char) 0x0f);

上面的代码应该在屏幕左上角打印字符"T"。它没有出现!在我更改了print_char:的声明之后

void print_char(char target, int col, int row, int attribute)

或者类似的东西:

void print_char(char target, int col, int row)然后将其称为print_char('T', 0, 0)

我更改后,一切正常!我真的对这个问题感到困惑。有人能向我解释一下吗?

我已经通过以下语句修改gccld的标志来生成32位.o文件和'.bin'文件(我的ubuntu是64位版本),从而解决了这个问题。

%.o: %.c ${HEADERS} gcc -ffreestanding -m32 -c $< ${CFLAG} -o $@

kernel.bin: kernel/kernel_entry.o ${OBJ} ld -o $@ -melf_i386 -Ttext 0x1000 $^ --oformat binary

其中kernel_entry.o将确保我们的例程在内核代码中找到main函数的入口。然后我通过获取操作系统图像

os-image: boot/boot_sect.bin kernel.bin cat $^ > os-image

其中CCD_ 15扮演引导扇区的角色。

但我仍然不知道为什么64位目标文件会导致我上面描述的现象。。。

相关内容

  • 没有找到相关文章