32 bitモードに移行しても、nasm で開発していたのでは
労力は軽減されません。
できれば、gcc などのコンパイラを利用したいところです。
では、具体的にどのようにすれば利用できるのでしょうか。
gcc が出力するコード自体は通常のマシン語です。
WindowsやLinuxといった特定のOS以外では動かない、
ということはありません。
OSに依存するのはライブラリや例外処理などです。
したがって、これらを使わなければ
独自カーネルの開発にも利用できます。
gcc が出力する実行ファイルは通常、
ヘッダ、コード、データなどを1つのファイルにまとめたものです。
通常、OS はヘッダを解析して実行ファイルを読み込み、
再配置など必要な追加処理を適用してからエントリポイントにジャンプします。
しかし、
カーネルの読み込みはアセンブラで書く必要がありますので、
複雑なヘッダ処理などは極力避けたいところです。
複雑な処理を避けるには、次のようにします。
ld -static --script=ldscript -nostdlib --section-start .text=0x110000 -e 0x110000 -o mykernel.exe mystartup.o ... objcopy -O binary --remove-section=.idata --remove-section=.reloc --remove-section=.debug mykernel.exe mykernel.bin
OUTPUT_FORMAT(pei-i386)
ENTRY(x86startup_entry)
SECTIONS
{
.text __image_base__ + 16 :
{
*(.text)
*(SORT(.text$*))
*(.data)
*(SORT(.data$*))
*(.rdata)
*(SORT(.rdata$*))
*(.pdata)
}
.bss BLOCK(16) :
{
*(.bss)
_bss_end = . ;
}
.reloc BLOCK(__section_alignment__) :
{
*(.reloc)
}
}