【问题标题】:C Compiler in Bios/Real Mode?Bios/Real 模式下的 C 编译器?
【发布时间】:2021-03-28 00:57:43
【问题描述】:

所以,我想编写一个操作系统。引导加载程序是用汇编语言编写的。现在我做内核,但可以用 C 语言编写它吗?我在 gcc -S 上试过,但我在 windows 上试过,输出文件是: .file“内核.c” 。文本 .ident "GCC: (MinGW.org GCC Build-2) 9.2.0"

【问题讨论】:

  • 普通 gcc 不支持实模式编译代码。考虑使用 ia16-gcc 或专为实模式设计的编译器,例如 Open Watcom。

标签: c assembly operating-system


【解决方案1】:

“Watcom”编译器支持实模式代码。您甚至可以选择 8086 作为目标 CPU(但是,您也可以选择 80286 或 80386)。

编译器也支持分段代码。

不过,至少老版本10.6只支持老的OMF对象文件格式(后面的版本好像支持COFF,但我怀疑分片代码是否支持COFF)。

这种目标文件格式很难转换为可读性更好的文件格式。

如果您的内核大小小于 64K,您可以创建一个“DOS COM”文件(编译器支持)。

【讨论】:

    【解决方案2】:

    这是一个相当复杂的过程 - 但如果您可以访问 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 的示例项目:https://github.com/cfenollosa/os-tutorial

    【讨论】:

    • 请注意,这会生成一个 32 位内核。 OP 想在实模式下编程。
    • @fuz Ah 然后我会编辑我的答案 - 还是差不多
    • gcc -m16 产生本质上是 32 位代码但编码为 16 位模式的代码。它不知道分段,结果在 i286 或更早的处理器上不起作用。这不是编写 16 位软件的好方法。
    • @fuz 如果它适用于似乎正在学习 atm 的 OP,那么它是否是一种好方法并不重要——因为交叉编译 gcc 超出了 SO 答案的范围跨度>
    猜你喜欢
    • 2014-12-14
    • 1970-01-01
    • 2013-07-06
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 2012-05-08
    相关资源
    最近更新 更多