16位C代码用于实模式内核

5

我不知道如何为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。我的目标是得到一个扁平的二进制文件,我可以跳转到该文件开始执行。


1
请参见https://dev59.com/tnVC5IYBdhLWcg3wpSzf。 - Dietrich Epp
1
运气与此无关。你尝试过哪些编译器?结果如何?你是否能够让编译器生成所需的汇编代码?当您使用自己的代码启动时,是否未获得预期结果? - Greg Hewgill
数字玛斯编译器据说仍支持16位目标,尽管我不确定编译器/链接器具有解析固定段地址或创建位置无关代码的能力。尽管如此,查看一下可能是值得的:http://www.digitalmars.com/features.html - Michael Burr
对于dmc编译器,16位C代码的编译/链接命令的示例是什么?我已经阅读了一些文档,但仍然不确定应该使用哪些编译器和链接器开关.... - TheFuzz
1个回答

6

首先,我建议您查看OSDev Wiki,该网站提供了大量资源来开发您自己的操作系统和组件。

其次,您是否考虑用汇编语言编写引导加载程序,该程序从实模式开始,切换到保护模式,然后跳转到您编译的(32位)内核?


1
如果我切换到保护模式,我可以使用gcc 4.4.1的32位编译器吗? - TheFuzz
1
当然可以。再次通过该链接查找更多关于您需要采取的确切步骤的信息。 - Adam Maras

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接