Bios/Real模式下的C编译器?
所以,我想编写一个操作系统。引导加载程序是在汇编中编写的。现在我做了内核,但是可以用C写吗?我在gcc-S上尝试过,但在windows上使用了im,输出文件是: .file“Kernel.c” .文本Bios/Real模式下的C编译器?,c,assembly,operating-system,C,Assembly,Operating System,所以,我想编写一个操作系统。引导加载程序是在汇编中编写的。现在我做了内核,但是可以用C写吗?我在gcc-S上尝试过,但在windows上使用了im,输出文件是: .file“Kernel.c” .文本 .ident“GCC:(MinGW.org GCC Build-2)9.2.0”这是一个相当复杂的过程-但是如果您能够访问gnu binutils,您可以使用objcopy: gcc -c -m16 -Os -ffreestanding -Wall -Wextra -fno-exceptions
.ident“GCC:(MinGW.org GCC Build-2)9.2.0”这是一个相当复杂的过程-但是如果您能够访问gnu binutils,您可以使用objcopy:
gcc -c -m16 -Os -ffreestanding -Wall -Wextra -fno-exceptions -o main.o main.c
ld -melf_i686 -static -nostdlib --nmagic -Ttext 0x1000 -o boot/kernel_entry.elf main.o
objcopy -Obinary boot/kernel_entry.elf kernel.bin
这将输出一个二进制文件,您可以使用qemu执行该文件
如果您需要一个示例,那么您可以在这里找到一个使用makefile的好示例项目:Watcom编译器支持实模式代码。您甚至可以选择8086作为目标CPU(但是,您也可以选择80286或80386)
编译器也支持分段代码
但是,至少旧版本10.6只支持旧的OMF对象文件格式(更高版本似乎支持COFF,但我怀疑分段代码是否支持COFF)
这种对象文件格式很难转换为可读性更好的文件格式
如果您的内核小于64K,您可以创建一个“DOS COM”文件(由编译器支持)。普通gcc不支持编译实数模式的代码。考虑使用IA16 GCC或一个设计用于实际模式的编译器,例如开放的WATCOM。注意,这会生成一个32位内核。OP想要在实模式下编程。@fuz-Ah然后我会编辑我的答案-仍然基本相同
gcc-m16
生成本质上是32位代码但编码为16位模式的代码。它不知道分段,结果在i286或更早的处理器上不起作用。这并不是编写16位软件的好方法。@fuz如果它适用于似乎正在学习atm的OP,那么它是否是一种好方法并不重要,因为交叉编译gcc超出了SO答案的范围