50466


現在、オペレーティングシステムの開発をしています。  
これまで[この質問](https://stackoverflow.com/questions/33603842/how-to-make-the-
kernel-for-my-bootloader)に対する回答で記述されているブートローダーを使用して開発を進めてきました。  
しかし、このブートローダーはメモリマップの0x9000にカーネルをロードしています。  
これだと0x9000~0xA0000までしかメモリを使用することができません。  
開発中のカーネルはこのメモリサイズを超えてしまったため、起動できなくなってしまいました。  
通常、カーネルはメモリの0x100000以降に配置するそうです。  
[osdev.org](https://wiki.osdev.org/Expanded_Main_Page)などOS開発のサイトを見ても説明ばかりでどのように実装していいのかわかりませんでした。  
A20の有効化、GDTの初期化などをした上でカーネルを0x100000にロードするブートローダーを作成するにはどうすればいいでしょうか？  
回答よろしくお願いします。


CC BY-SA 4.0
2018-11-18T19:25:05.200
50421
2018-11-20T08:39:48.903
24999
question
linux c assembly kernel
ブートローダーの作成方法について


最初に、システムの起動時に何が行われているのかを  
[OS のブートシーケンス](http://www14.plala.or.jp/campus-
note/vine_linux/install/boot_sequence.html) とか [Boot
Sequence](https://wiki.osdev.org/Boot_Sequence) のような記事を読んで理解するのが良いと思います。

カーネルを入れるのに必要なメモリサイズが決まってから（コードの大枠を書き終えてから）、カーネルを格納する場所を決めてください。  
もちろん、ハードウェア構成（どんなCPUを使っていて、ブートデバイスの種類(HDD,FD,USBメモリ,,)と容量、メインメモリのサイズと配置）を把握しておく事も重要です。

このあたりの基本的な事情・情報を考えて、カーネルを置くアドレス範囲といった具体的な事を決めていきます。


CC BY-SA 4.0
2018-11-20T08:39:48.903
50466
2018-11-20T08:39:48.903
217
50421
answer