【问题标题】:16 bit C code for real mode kernel实模式内核的 16 位 C 代码
【发布时间】:2011-10-06 22:14:54
【问题描述】:

我不知道如何为 16 位实模式编译我的 C 内核。我尝试了各种编译器,但都没有运气。我的引导加载程序只是将原始扇区从软盘(我的内核就在磁盘上的第一个扇区之后)加载到物理内存地址 1000h:0000h 然后跳转到它。如何编译我的 C 内核以在 16 位实模式下工作?

我的基本内核:

void OSmain()
{
    unsigned char *videoram = (unsigned char *) 0xb8000;
    videoram[0] = 65;                                     /* character 'A' */
    videoram[1] = 0x07;                                   /* forground, background color. */

    while( 0 )
    {

    }
}

我尝试过的编译器是 GCC、tinyCC 和 DMC。我的目标是获得一个可以跳转以开始执行的平面二进制文件。

【问题讨论】:

  • 运气与此无关。您尝试过哪些编译器,结果如何?您是否能够让编译器生成所需的汇编代码?使用代码启动时没有得到预期的结果吗?
  • Digital Mars 编译器应该仍支持 16 位目标,但我不确定编译器/链接器必须具备何种能力来解析固定段地址或创建与位置无关的代码。尽管如此,它可能值得一看:digitalmars.com/features.html
  • 对于 dmc 编译器,16 位 C 代码的示例编译/链接命令是什么?我阅读了一些文档,但我仍然有点不确定应该为编译器和链接器使用哪些开关......

标签: c compiler-construction kernel 16-bit real-mode


【解决方案1】:

首先,我建议您查看OSDev Wiki,其中包含用于开发您自己的操作系统和组件的资源。

其次,您是否考虑过在汇编中编写引导加载程序,以实模式启动,切换到保护模式,然后然后跳转到您的(32 位)编译内核?

【讨论】:

  • 如果我切换到保护模式,我可以使用 gcc 4.4.1,例如 32 位编译器?
  • 当然。同样,通过该链接查找有关您需要采取的确切步骤的更多信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-15
  • 1970-01-01
  • 2017-02-04
相关资源
最近更新 更多