0

我正在开发自己的操作系统。我已经完成了引导扇区并成功加载了我的内核。我的开发环境是 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)

我改了之后,一切正常!我真的很困惑这个问题。谁能给我解释一下?

4

1 回答 1

1

我通过以下声明修改了标志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

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

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

其中boot_sect.bin起着引导扇区的作用。

但是我还是不知道为什么64位的目标文件会出现我上面描述的现象……

于 2016-03-30T07:44:35.407 回答