独自のオペレーティングシステムをビルド
5639 ワード
これは、“あなた自身の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 >
Reference
この問題について(独自のオペレーティングシステムをビルド), 我々は、より多くの情報をここで見つけました https://dev.to/nsadisha/build-your-own-operating-system-1setupbooting-2im3テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol