独自のオペレーティングシステムをビルド



これは、“あなた自身のOS”シリーズシリーズの最初の記事です.このシリーズでは、Linuxカーネルで独自のオペレーティングシステムを構築する方法をご案内します.カスタムオペレーティングシステムの開発は簡単な仕事ではありません.しかし、あなたは、この記事シリーズの終わりにあなた自身の単純なオペレーティングシステムを開発することができます.
私は開発のためのオペレーティングシステムとしてUbuntuを使用します.開発中に直接メモリにアクセスしなければならないので、安全な目的のためにバーチャルボックス環境でこれらすべてを試してみましょう.私は、この記事シリーズでCとアセンブリ言語を使用しています.
では、始めましょう!

開発環境の設定


Ubuntuを仮想ボックスにインストールしたならば、次のステップはいくつかの必要なパッケージをインストールすることです.端末でこのコマンドを実行するだけで、それらをインストールすることができます.
sudo apt-get install build-essential nasm genisoimage bochs bochs-sdl

ビルド必須


このパッケージには、GNUデバッガ、G++/GNUコンパイラコレクション、およびCプログラムをコンパイルするために必要なツールやライブラリが含まれます.

NASM


アセンブリを使用しているので、アセンブリプログラムをコンパイルするためにnasm ( netwideアセンブラ)を使用しなければなりません.

genisoimage


このパッケージはファイルシステム用のISOイメージファイルを生成する必要があります.

ボッシュ


これは、オペレーティングシステムのデバッグに使用するエミュレータです.

ブート


ブートはコンピュータを起動するプロセスです.電源ボタンを押すと、コンピュータは、オペレーティングシステムにコンピュータの制御をハンドオーバする前にいくつかのプログラムを実行します.
ブートプロセス図

バイオス


BIOSプログラムは、通常、PCのマザーボード上の読み取り専用のメモリチップに格納されています.BIOSプログラムの最初の役割は、画面に印刷するためのいくつかのライブラリ機能をエクスポートし、キーボード入力などを読むことです.

ブートローダ


このプログラムのタスクは、オペレーティングシステムにコンピュータの制御をハンドオーバすることです.しかし、いくつかの制限のため、ブートローダはしばしば2つの部分に分割されます.ブートローダーの最初の部分はコントロールを2番目の部分に転送し、最後にコントロールをオペレーティングシステムに転送します.
私たちは既存のブートローダを使用します.なぜなら、低レベルのコードをたくさん書く必要はないからです.GRUBは正しいメモリ位置にオペレーティングシステムをロードします.
ダウンロードGRUB:https://github.com/littleosbook/littleosbook/raw/master/files/stage2_eltorito

オペレーティングシステムのコンパイル


ここでは、アセンブリコードのほとんどを使用します.このプログラムは、Eaxレジスタに非常に特定の数0 xcafebabeを書きます.次のコードをLoaderというファイルに保存します.s
< div >
ファイルローダ.sは以下のコマンドで32ビットのELF [ 18 ]オブジェクトファイルにコンパイルできます
<> P >
クラスをハイライト表示する
nasm -f elf32 loader.s
< div >

カーネルのリンク


次に、grubはカーネルをメモリにロードする必要があります.1 MB未満のアドレスがGRUB自体、BIOSとメモリマップされたI/Oによって使用されるので、それは0 x 00100000(1メガバイト(MB))より大きいメモリアドレスにロードされるべきです.p >
< div class ="LagagCount - gig - Link - tag "
"スクリプトのID "https://gist.github.com/nsadisha/1203aeef5af9673419ec8ff4603f114d.js//>
< div >
リンカスクリプトをlinkというファイルに保存します.LDそして、実行可能ファイルは以下のコマンドでリンクできます
<> P >
クラスをハイライト表示する
ld -T link.ld -melf_i386 loader.o -o kernel.elf
< div >
最後に実行可能ファイルを生成します.エルフ.p >
それから、ダウンロードされたファイル(stage 2 ' eltorito)をローダと同じプロジェクトの場所にコピーします.sとリンク.その他p >

ISOイメージファイルの作成


ISOイメージは、仮想または物理的なマシンでロードできるタイプです.そこで、genisoimageパッケージでカーネルのISOイメージを作成します.ISOを生成する前に、特定のフォルダ構造を作成し、ブートローダとカーネルを別の場所にコピーする必要があります.これは以下のコマンドを実行します.br/>
<> P >
クラスをハイライト表示する
mkdir -p iso/boot/grub # create the folder structure
cp stage2_eltorito iso/boot/grub/ # copy the bootloader
cp kernel.elf iso/boot/ # copy the kernel
< div >
最後に、設定ファイルメニュー.GRUBのLSTを作成しなければなりません.このファイルは、カーネルがどこにあるかをGRUBに伝え、いくつかのオプションを設定します
< div class ="LagagCount - gig - Link - tag "
"スクリプトのID "https://gist.github.com/nsadisha/70c40bdccb4d96015089ea3c1737a49d.js//>
< div >
< file >ファイルメニューを置きます.フォルダ内のLST ISO/boot/grub/次にISOフォルダの内容は以下のようになります.< br/>
<> P >
クラスをハイライト表示する
iso
 |-- boot
       |-- grub
       |     |-- menu.lst
       |     |-- stage2_eltorito
       |-- kernel.elf
< div >
あなたのフォルダ構造が正しいなら、以下のコマンドでISOイメージを生成できますbr/>
<> P >
クラスをハイライト表示する
genisoimage -R \
            -b boot/grub/stage2_eltorito \
            -no-emul-boot \
            -boot-load-size 4 \
            -A os \
            -input-charset utf8 \
            -quiet \
            -boot-info-table \
            -o os.iso \
            iso
< div >
<高橋潤子>ISOファイルp >

bochsでOSを走らせる


現在、我々はOSを使っているbochsエミュレータのOSを走らせることができます.ISOイメージ.その前の1つの最後のことは、bochsは起動する設定ファイルを必要とし、簡単な設定ファイルの例を以下に示します.
< div class ="LagagCount - gig - Link - tag "
"スクリプトのID "https://gist.github.com/nsadisha/01fe4957b150f57a1a0bd083a810e4bc.js//>
< div >
このファイルをbochsrcとして保存します.プロジェクトのルートディレクトリにあるtxt ( loader . sと同じ場所).そして、以下のコマンドを実行してbochsエミュレータでOSを起動します.br/>
<> P >
クラスをハイライト表示する
bochs -f bochsrc.txt -q
< div >
エクストラ:端末のエラーが表示されたら、displayCountライブラリを変更してください.試してみて!p >
<高橋潤子>エミュレータが画面にテキストを持たない場合は、端末に入力し、Enterキーを押します.OSを起動します.p >
< tt > bochsを終了した後、bochsによって生成されたログをチェックできます.テキストエディタで開くこともできます.
<> P >
クラスをハイライト表示する
cat bochslog.txt
< div >
< tt >出力のどこかにbochsによってシミュレートされたCPUのレジスタの内容を見るべきです.RAX = 00000000カフェベーブやEAX =カフェベーブを見つけたら(出力を64ビットサポートしていない場合に依存します).p >
お祝いおめでとう!あなたのOSはうまくブートしました!p >
あなたが私のOSをブートするために作成した完成したコードをダウンロードすることができます
<高橋>p >
ありがとうございます!p >