オペレーティングシステムを書く-ブートプロセス(その1 )


This post was originally published here


シンプルなOSを構築する学習の私の旅
どのように多くの回のOSブックを読んでいるが、コードを1つにされていないですか?オペレーティングシステム(OS)の本は退屈ですが、理論だけが実際にOSがどのように動作するかを理解することを難しくします.ここでは私の試みは、シンプルなOSを作成し、いくつかの概念のドキュメントを学んだ.



始める前に
Macで、Homebrewをインストールして、Qemu
いくつかのシステムでは、qemuは複数のバイナリに分割されます.qemu - system - x 86 six 64 binfileを呼び出します.


これらの低レベルのプログラムを連続的にマシンを再起動したり、重要なデータをディスクから廃棄したりすることなくテストするには、CPUエミュレータQemuを使用します.
私はMac(M 1チップ付き)で働いています.QemuはM 1チップでいくつかの問題があるので、Dockerコンテナの中でこれらの経験を実行できます.docker run -it ubuntu bash .
qemuを実行してください-- nographicと- cursesはDockerコンテナの中で引数をcursesします

NASM
NASMはインテルX 86アーキテクチャのアセンブラと逆アセンブラです.これは16ビット、32ビット(IA - 32)と64ビット(x 86 - 64)プログラムを書くのに使用できます.


我々がコンピュータを始めるとき、最初に、それはオペレーティングシステムの概念を全く持ちません.どうにか、それはオペレーティングシステムをロードしなければなりません---どんなコンピュータでもあるかもしれません.

ブートプロセス
オペレーティングシステムを起動することは小さなプログラムのチェーンに沿って制御を移します.


バイオス
PCがオンにされるとき、コンピュータは基本的な入力出力システム(BIOS)[ 16 ]標準に固執する小さなプログラムを始めます.このプログラムは、通常、PCのマザーボード上の読み出し専用メモリチップに格納される.BIOSは、最初にメモリからチップにロードされ、コンピュータがオンになったときに初期化されるソフトウェアルーチンの集合である.BIOSは、画面、キーボード、ハードディスクなどのコンピュータの重要なデバイスの自動検出と基本的な制御を提供します.
注意:現代のオペレーティングシステムではBIOSの機能を使用しません.BIOSをバイパスするハードウェアと直接対話するドライバを使用します.今日、BIOSはいくつかの初期診断( Power On - self - test )を実行し、ブートローダに制御を移します.


‌ブートセクタ‌

BIOSでは、BIOSにはファイルシステムの概念がないので、オペレーティングシステムをディスクから単にファイルに読み込むことはできません.BIOSは、シリンダ2、ヘッド3、セクタ5等のディスク装置の特定の物理的位置から特定のセクタ(通常512バイト)のセクタを読み出す必要がある.
それで、BIOSが我々のOSを見つける最も簡単な場所は、ブートセクタとして知られているディスク(すなわちシリンダ0、ヘッド0、セクター0)の1つのセクタにあります.「ディスクがブート可能である」ことを確認するために、BIOSは、疑わしいブートセクタのバイト511および512がバイト0 xaa 55であるのをチェックする.もしそうならば、BIOSは第1のセクターをアドレス7 C 00 Hにロードして、プログラムカウンタをそのアドレスにセットして、そこからCPU実行コードをさせました.これは今までで最も簡単なブートセクターです.
e9 fd ff 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[ 29 more lines with sixteen zero-bytes each ]
00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa

上記のブートセクターでは、3つの重要な機能があります.
1 )初期3バイト、0 xE 9 , 0 xfd , 0 xffとして16進数では、CPUメーカーが定義したマシンコード命令で、無限のジャンプを実行します.
2 ) 0 x 55と0 xaaの最後の2バイトはマジックナンバーを構成します.これはBIOSに、これは本当にブートブロックであり、ドライブのブートセクターに起こるデータではないことを伝えます.(リトルエンディアン形式で)
3 )ファイルはゼロでパディングされています( '*'は0のために省略されています).
最初のセクタはマスターブートレコード、またはMBRと呼ばれます.第1セクタのプログラムはMBRブートローダと呼ばれます.
それで、各々の記憶装置(例えばフロッピードライブ、ハードディスク、CDドライブなど)を通してBIOSループを通して、ブートセクターをメモリに読み込んで、それがマジックナンバーで終わるとわかる最初のブートセクターを実行し始めるようにCPUに指示します.これは、我々がコンピュータの支配をつかむところです.


‌ブートローダ
BIOSプログラムはブートローダと呼ばれるプログラムにPCの制御を移すでしょう.ブートローダはOSをロードしたり、ハードウェアと直接実行したり通信したりするアプリケーションをロードします.OSを走らせるには、最初に書くのがブートローダです.ここでは簡単なブートローダです.
;
; A simple boot sector program that loops forever. ;
9

; Define a label, "loop", that will allow ; us to jump back to it, forever.
; Use a simple CPU instruction that jumps
; to a new memory address to continue execution. ; In our case, jump to the address of the current ; instruction.



loop:
    jmp loop


; When compiled, our program must fit into 512 bytes,
; with the last two bytes being the magic number,
; so here, tell our assembly compiler to pad out our
; program with enough zero bytes (db 0) to bring us to the ; 510th byte.


times 510-($-$$) db 0


; Last two bytes (one word) form the magic number, ; so BIOS knows we are a boot sector.

dw 0xaa55

nasmでコードをコンパイルし、binファイルに書き込みます.nasm -f bin boot_sect_simple.asm -o boot_sect_simple.bin試してみましょう.qemu boot_sect_simple.binいくつかのシステムでは、実行する必要があります
「ハードディスクからブートする」と言うウィンドウが表示されます何もない.そこに行く、シンプルなブートローダが準備ができている!
続きを読むhere
すみません、ゴーストから貼ったコピーはタフでした!