Linux勉強 パート2 BIOSからブートローダー

Linux

リアルモード

ウィキペディアの説明

x86プロセッサの起動時の動作モードでありBIOSはこのモードで動作している

ウィキペディアにはこうあります。
wiki
ウィキペディアてよく知らないことをちょっと知りたいだけで物凄い量の前提知識が必要になりますよね。
同じように書いてたら意味がないので超簡単に厳密さを省いて説明します。

プロセッサ
ソフトウェアから入力された情報(プログラム)を管理する機械。
ある規則(命令セット)にそって送られてくるデータを沢山のオンとオフの電気信号に変換して解釈しています。
X86
Intelの作っているCPUと命令セットの総称。
BIOS(バイオス)
コンピューターの電源投入時最初に呼び出され、故障などの確認するプログラム。
こいつがOSを呼び出す働きをします。

リアルモード

BIOSがOSは起動をした時にコンピューターを扱う最初のモードです。
扱えるメモリ(記憶領域)が非常に小さくほとんど何もできないほど制約の大きな状態からコンピューターの起動はスタートします。
この制約とはリアルモードでのレジスタの幅はは16ビット、利用できるメインメモリのアドレス空間は1Mバイトまでというものです。
これは1Mバイトの壁と呼ばれます。

このリアルモードは実際のコンピューターがどれだけメモリを持っているかとかは気にしません。
どんなに強力な計算能力があってもコンピューターの起動時リアルモードでは上記の制約があり、使用できなくなっています。

レジスタ
コンピューターの脳みそ。
ここに今作業しているメモリの情報や計算を行うときに扱う数字が記憶されます。
思い出すだけなので高速で情報を取り出せます。
メモリ
コンピューター上の作業空間。
ここにプログラムの命令やデータを並べます。

勉強机だとか言われたりしますね。
思い出すだけのレジスターと違っていちいち引き出しを開けたりと取り出すのに時間がかかります。
机が小さいと辞書を開いたままにできず、使うたびに使わないものは閉まって新しいもの取り出さなければなりません。
今だとラップトップ(ノートパソコン)でも8GBとか普通なのでリアルモードの1MBがいかに小さいかが分かると思います。

リアルモードのままだとせっかく高価で高性能なコンピューターを買っても意味がありません。
なので一度リアルモードでコンピューターを起動して、プロテクトモードという広大なメモリ空間にアクセスできる状態へ移行するという面倒な処理があります。

「なら最初からリアルモードなんかななくせよ」と言いたくなります。
しかしそうもいかないのです。
どうしてこんな作業を行うかというと、それは古いモデルのコンピューター用のプログラムを動かせる互換性を保つ為です。
簡単に説明すると昔の古いモデルのコンピューター上で動いていたソフトウェアを現代のコンピューターで使うことがあるのです。
しかし古いモデルは現代の強力な計算能力を持て余してしまいます。
未だに古いモデルが活躍する場面があるので、その古いモデルのソフトウェアのプログラムが機能する状態を残してあるのです。
面倒ですが、古いモデルとの互換性の為にリアルモードが存在しています。

セグメント方式のメモリの指定方法はこちらでまとめてあります。

コンピューターの主記憶装置管理(メモリマネージメント)
主記憶装置(メインメモリ) メインメモリ wikiの説明です。 コンピュータのメインバスなどに直接接続されている記憶装置で、レイテンシやスループットは速いが比較すると小容量である。 wiki ウィキペディアです。 レイテンシ...
セグメント方式
メモリを分割して管理する方法。
分割されたメモリをセグメントと呼びます。

リアルモードで使用できるアドレスバスは20bitです。
そしてその大きさを指定するレジスタのアドレス幅は16ビットになります。
なのでアドレスをレジスタで表現するには4ビット足りません。
どうするかというとまずアドレスを2つに分解します。
一つは基底となる「ベース」です。
もう一つはそのベースから目的のアドレスまでの距離「オフセット」です。

ベースにオフセットを足し合わせて目的のアドレスを表現します。
このとき合成されたアドレスをリニアアドレスと呼びます。

ベース+オフセット=リニアアドレス

この時ベースは既述したように16ビットなのでアドレスバスの幅20ビットに合わせて16倍(4ビットシフト)させます。
例えば二進法で0000100000000000だとすると横に4つずれて1000000000000000になります。
これにオフセットの数値を加算してアドレスを指定します。
オフセットは16バイトのレジスタで指定するで2の16乗、64キロバイトまでしか表現できません。
つまりリアルモードでのセグメント(プログラムこデータやコードの大きさ)の範囲は64キロバイトが限界になります。
かなり大きな制約です。

リアルモードの保護機能

現在のコンピューターのOSにはメモリを保護する機能があります。
もしOSにインストールされているアプリケーションがOSが管理するメモリ領域にアクセスできてしまうと大事なデータを書き換えたり、パスワード書き換えたりということができてしまいます。
なので今のコンピューターにはアプリケーションに与えられている実行権などの属性を確認し、勝手に他のアプリケーションやOSの使用するメモリ領域にアクセスできないようになっています。
しかし、リアルモードの能力では簡単な保護機能すら持てずプログラムが暴走してOSなどの機能を奪うことも考えられます。

リアルモードは互換性のため

既述しまひたが、なぜこんな面倒なことをするかというと、当時の主流である8ビットCPUから8086へ移行を最重要視したintelは従来のモデルのプログラムを新しいモデル8086 で使えるようにするため、互換性のあるリアルモードを導入しました。
しかしメモリの管理機構などは当時の技術では一つのチップに収まりきらず後回しにされました。
過去のモデルをを継承し続けないと市場で受け入れられないという側面があります。

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

おすすめ書籍

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

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

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

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

コメント

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