我正在开发自己的操作系统。我已经完成了引导扇区并成功加载了我的内核。我的开发环境是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)
我更改后,一切正常!我真的对这个问题感到困惑。有人能向我解释一下吗?
我已经通过以下语句修改gcc
和ld
的标志来生成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位目标文件会导致我上面描述的现象。。。