Linuxの勉強 パート1 ブートローダーについて 

Linux

ブートローダーとBIOS

ブートローダーとは

ブートローダーっていうのは簡単に言うと、電源を入れてOSを起動するときにBIOSが最初に読み込む小さなプログラムでOSを起動するためのプログラムです。
どれくらいかって言うと512バイトですね。
512って今だとかなり小さいですよね‥

BIOSとは

BIOSはコンピューターが安全に起動できるかを確認したり、OSにルーティン(この場合基礎となる命令)を提供するプログラムです。
ブートローダーはOS(WindowsやMac、Linux)は最初にBIOSによって最初にメモリに読み込まれるプログラムで、OSのプログラムをメモリに読み込むのを助けています。

電源を入れて、プロセッサーが起動すると、リアルモードに移行しメモリアドレス0FFFF0hの命令を実行し、BIOS(Basic Input-Output system)が呼び出されます。
日本語に直すと標準入出力システムって感じですね。

BIOSが最初に実行されるプログラムでROM(リードオンリーメモリー 読込専用)に保存されています。
このBIOSはコンピューターのマザーボードのチップの中に最初からあって、起動時に呼び出されてコンピューターがきちんと動くかの確認をしてくれます

起動されたBIOSはPOST(Power-On Self Test)日本語なら「起動時テスト」を行い、ハードウェアの設定が有効か、それから正しく機能しているかのチェックを行います。
不正に動いていた場合警報音やエラーメッセージが表示されます。

POSTが終わるとコンピューターはMBR(ディスクの一番最初のデータを保存する領域)からブートローダーを探し、コンピューターのメインメモリーに読み込みます。

BIOSさらに深掘り

BIOSは初期化を行いブートローダーを読み込む他に、もともとはプログラムと入出力装置のインターフェイスでした。

ハードウェアの構造が違っていても、途中にBIOSを挟むことでハードウェア間の差異を吸収していました。
しかしBIOSはメモリ上のデータの保護を前提としていないことがあり、マルチタスクの環境では個別のアプリケーションによるBIOSの呼び出しでデータの保護が損なわれることになるという危険性がありました。
要するに同時にアプリを2つ以上起動して作業していると、アプリを見張っている奴がいないので、アプリAがアプリBの使っているメモリに勝手に入ってきてデータを壊してしまうとい言うことが普通にあり得た。
今はそんなことないようなので安心してください。

マルチタスクが主流の現代型のOSはデバイスドライバーで自前のハードウェアとのインターフェイスを使っている。
だからこそ名前がBasic Input/Output Systemになるんですね。
プログラムで異なるハードウェアの入出力アクセスを既述するのは煩雑なので、プログラムはBIOSにやってもらいたい命令を記述してBIOSはそれをハードウェアにお願いする。
こうすると規格の違うハードウェアにも同じプログラムで命令できます。

そしてBIOSは0xfffffff0にROMから読み込まれ、実行を開始する。

因みにインテルは2020年にはBIOSをUEFIに置き換えると名言していて、BIOSももうすぐその役目を終える。
長い間影からコンピューターを支えてきたBIOSですが、遂に役目を終えるようです。お疲れ様でした。

コンピューターの階層構造

コンピューターは階層構造になっていて、アプリケーションは直接ハードウェアを操作できません。
OS内部でもコンピューターの動作(メモリの操作など)の核ととなる命令をアプリケーションが操作できると、アプリケーションが勝手にメモリをいじくりまわしてOSの堅牢性に穴が開いたりします。
なのでアプリケーションかららの要求を一々安全なものかOSはチェックしています。
命令の種類によっては何層にもなるセキュリティーを通過する必要があります。

大雑把に書くと
ハードウェア-システム-ユーザーインターフェイス-アプリケーション

のような階層になっており、一つの操作の度にこれを通過しなければなりません。
伝言ゲームのようなものです。一々こんなことをやっています。
と言ってもコンピューターは条件自体を電気的に解釈するので一瞬で通過してしまいます。
本当は一本道ではやくもっと枝分かれしてますが、大雑把にこんな感じです。

閑話休題。
BIOSは先ほどの階層の最も下に位置し、ここからハードウェアに命令を行い処理を実行させる力を持っています。

電源ON

ここかから横文字とか英字が沢山出てきますので頑張ってください。

ATX
インテルの考えたコンピューターの配線とか配置とかを決めた規格。
業界標準になっていてマザーボードの大きさとか規定しているみたいです。

このATX電源のパワーコネクタをコンセントにプラグインすると電源プラグに微量の電気が供給されます。
俗に言う待機電力ってやつです。

このパワーコネクタには沢山のピン(20~24)があって、そのうちのピンの電圧が高い状態から低い状態に移行した時にプログラムが起動するための電力を供給します。

ps_onピンの低電圧状態は瞬間的にDC(交流)スイッチにコンタクトします。

するとコンピューター各部への給電が開始されます。
しかし電源を供給した直後は電圧が安定せずシステムが暴走するかもしれないので、リセットシグナルを送り電圧が安定するのを待ちます。

リセットシグナルの命令はアドレス0xFFFF0に保存されていてリセットベクターとよびます
これは電源投入などによりリセットされたときに呼び出され実行される命令のアドレス(インテル)です。
要するに電源ONされたら0xFFFF0に行って命令を実行して電圧が安定するのを待機させます。

BIOSは各種レジスターのクリア(初期化)を実行していきます。 これもBIOSの仕事です。

レジスターちょっと補足
電気的に情報を保持してコンピューターが実行する命令や使用中の命令やデータが配置されている場所を記憶しています。
沢山の種類があり、アセンブリで直接弄ります。

その後はメモリー領域にスタックとかブートローダーとか色んなメモリ領域を確保とその他のキャッシュメモリやコントローラーなどの確認をしてPOSTに移ります。
何もなければPWR_OKシグナルを送り、PWR_OKピンをONしてcpuが受け取るとリセットシグナルを停止して、ようやくBIOSの制御に映る。
POSTには周辺機器の検査用のプログラムが保存されていて、それを実行させます

プログラミングおすすめ書籍

おすすめ書籍

なぜプログラムが動くのか。
平易な言葉で学べますが、初心者には難しいかもしれません。
でも読み終わった頃にはなんとなく理解しているでしょう。
初心者には家にあって損はありません。

UNIXの思想を学べます。
高尚なタイトルですが、コードはおろか難しい言葉も殆どありません。取っ掛かりに最適でその後のプログラミングに対する理解を一変させます。
なぜならこの思想はプログラミングそのものだからです。
一読の価値ありで、これは良書なので今後紹介したいと思っています。

まだまだありますがまたの機会に紹介したいと思います。

Linux コンピューター
スポンサーリンク
himazinをフォローする
私の頭の上の消しゴム

コメント

タイトルとURLをコピーしました