コンピュータが起動してからBIOSが読み込まれて「プログラム」として動き出すイメージが湧きません。どういうイメージで捉えればいいですか?

補足

疑問が増えたのですが、、kernel.cのmainの中でOSを起動している箇所はどこでしょうか?

パソコン | Linux系35閲覧

ベストアンサー

0

ThanksImg質問者からのお礼コメント

ありがとうございました!!他の方の回答と合わせてわかりやすかったです!!最初に得知恵の物理アドレスにあるプログラムを実行するようにCPU自体が作られているからそうなるんですねという感じで、流れは1234のような感じでなんとなく違和感消えました!

お礼日時:5/17 18:09

その他の回答(4件)

0

イメージで捉える必要はないし、捉えるべきではありません。ただ事実を事実として受け入れる(覚える)、やるべきことはそれだけです。 あなたがどう思おうと、どう解釈しようと、CPUは0と1の羅列をプログラムと認識して、それに書かれた通りの動作を行います。それが事実です。 機械語はある規則に従って構成されているので、その規則さえ覚えれば人間だって「読む」ことができます。たかがその程度のモンですよ、CPUも機械語も。

0

PCの電源が投入されると、電源ユニットが作動し、電圧が安定するとマザーボードに電力が供給されます。 マザーボードは準備が整うまでCPUにリセット信号を送り続け、完了するとリセット信号は止まり、いよいよCPUが動作を開始します。 CPUにはアドレスバス、データバスがあって、例えば64ビットCPUなら64本のアドレスバスのピンがあります。 アドレスバスは文字通りアドレス値、データバスはデータ値を扱います。 このピンの接続によって機器やメモリーの物理アドレスのマッピング位置が決まります。 Intel系では起動する直後は下位20ビットのアドレスだけが有効で、それ以上のビットは0でマスクされています。 つまり最大16MBのアドレス空間しかアクセス出来ません。 その最終16バイトのアドレスである0xffff0をCPUは読みに行く決まりです。 そこにBIOS ROMの先頭アドレスが設定されています。 だからBIOSを勝手に読みに行ってくれます。 CPUが直接処理するのはマシン語といい、16進数の羅列です。 これを人が読みやすくするために便宜的に16進数の数字に名前を付けたものがアセンブリ言語です。 今のIntel系CPUはCISC命令ベースですが、RISC的な要素やSIMD命令サポートなどもあるため単純には説明出来ません。 ただ、例えばBIOSが終了してディスクアクセスが可能になった段階からOS無しでプログラミングするシチュエーションを想定して説明するなら、CPU処理は古典的なそれと同じです。 Intel系CPUには実行中のアドレスを管理するRIP(EIP)レジスタがあります。 今いるアドレスの命令が実行完了すると、このレジスタが今の命令サイズ分加算され、次の命令の先頭アドレスに移動します。 アセンブリ言語の命令をニモニックといい、そこにオペランドと言うのが0〜3個くらいまでくっつきます。 オペランドはレジスタや即値、アドレスなどが入ります。 例えば、代入命令であるmovはメモリーやレジスタにある値を他のレジスタやメモリーに代入しますが、 mov rax, 0123456701234567h ならraxレジスタに即値を代入する意味です。 (この表記はIntel式で、UNIX系は逆順のAT&T式になります) これをマシン語にすると、何バイトかの16進数に置き換わります。 これがプログラムコードとしてROMやRAMのアドレスを次々と移動しながら実行していきます。 この時、CPU内部ではレジスタの値が変化します。 実行中のアドレスを管理するRIPもそうだし、代入先レジスタもそうだし、フラグレジスタ(RFLAGS)も変化します。 RFLAGSはオーバーフロー、値の正負、各フラグ条件とかが設定され、この結果によって分岐命令が処理されます。 こうして、命令次第ではジャンプしたり分岐したりして、任意の命令に飛ぶことで処理が行われます。 じゃあどうやってCPUはそもそも命令を実行し続けるのかと言うと、CPUにクロック信号が入力されるからです。 全てのマシン語命令には消費クロックがあって、そのクロック分を使うことで実行されます。 CPUクロック信号は、俗に言うCPUの動作周波数のことです。 厳密には分周されるので違うのですが、概ねそんな感じです。 だから、動作周波数が早いほど、命令実行が早くなり、結果として処理が高速になるわけです。 この原理は、電卓やArduinoみたいなマイコンでも同じで、オシレーターと言う部品が搭載されていてそこからクロック信号が作られます。

補足について。 BIOSは、例えば先程の20ビットアドレスしかアクセス出来なかったモードもここで設定されてリアルモードやプロテクトモードに推移させる仕組みです。 OSがどうやって起動するかと言えば、BIOSがディスクコントローラーを初期化し、IOポートやIOメモリーにマウントされるからです。 CPUからアドレスやIOポートとしてディスクコントローラーにアクセス出来るようになるので、やっとSSDやHDDにアクセスする足がかりが出来るわけです。 ディスクコントローラーを介して、最初にディスクの先頭を読み込みに行きます。 ここにMBRがあり、その中のIPLと言う小さなプログラムが読み込まれます。 MBRはさらにパーティションテーブルを読みに行き、ようやくブートローダに辿り着きます。 このブートローダがOSの起動ポイントにマッピングしています。 やっとOSカーネルの読み込みが開始され、ここでファイルシステムのロードが行われます。

0

CPUは起動すると必ず、 「最初に特定の物理アドレスにあるプログラムを実行する」 と、決まっているからです そこにプログラムを置いておけば、勝手に起動します 多くのCPUは、0x00000000番地からあるプログラムを実行しますが インテルCPUのように0xFFFFFFF0番地から実行するようなCPUもあります

0

>> その0と1達があったとしてが使ってるCPUが読み取れる機械語だった場合、CPUが「あ、これ分かる。実行するよ」って勝手に解釈してくれるんですか?そんなわけ無いと思うんですが そんなわけがあるんです。 貴方は日本語を書いているわけですが、どのように覚えました? 誰かに教わって覚えたんですよね? 今貴方は日本語を頭の中でいわばプログラミングのように叩き込まれているから読めるし書けるし、文章を組み立てる事もできるのです。 このように考えると既に機械語として読み込む機能がCPUに備わっているなら0と1でも解釈できますよね?