3

単純なオペレーティングシステムを作成しようとしていますが、ブートローダーをコンパイルすると、次のエラーが発生します。

error: binary output format does not support external references

このエラーの意味はわかっていますが、バイナリ形式にコンパイルするときに外部参照を作成することは可能ですか?これが私の完全なコードです:

;Bootloader.s
[BITS 16]     
[ORG 0x7C00]
global loader
extern kmain

loader:
call kmain
times 510-($-$$) db 0
dw 0xAA55 

そして私のカーネル:

/*kernel.c*/
void kmain()
{
    unsigned char *vidmem = (unsigned char *) 0xb8000;
    int i
    for(i=1;i<=11;i+=2)
    {
        vidmem[i]=0x07;
    }
    vidmem[0]='H';
    vidmem[2]='e';
    vidmem[4],vidmem[6]='l';
    vidmem[8]='o';
    videmem[10]='!';
}

コンパイル方法:

nasm -o '/home/myusername/Cubed OS/Bootloader.o' '/home/myusername/Cubed OS/Bootloader.s'
4

1 に答える 1

3

リンク可能なオブジェクト ファイル形式でのみ、外部参照を持つことができます。ベアバイナリはそうではないため、直接行うことはできません。

(また、C 関数 AFAIK を呼び出す前に、スタックをセットアップする必要があります。)

これについては、次の 3 つの方法があります。

  • マルチブートを備えたブートローダーを使用し、カーネルを ELF イメージとして書き込みます。その例については、OSDevベア ボーンを参照してください。
  • 全体をアセンブリで記述します。たとえば、How to write a simple operating system を参照してください。
  • すべてを書き込んでC、リンカーのトリックを使用して、必要な場所に配置します。GCC ツールチェーンを使用したこの例は、次の場所にあります: Real mode in C with gcc : writing a bootloader
于 2011-08-20T13:31:47.673 に答える