最近のLinuxは設定まわりが大変ですね。
昔のUnixのときは、それこそシステムのブートアップのスクリプトを自分で読み取って、場合によっては自分で書き足したりもしていたものですが、今はそれどころじゃないし。
なんとかかんとかログとかに出ていた手掛かりを元に、あとはネットで調べてようやっと問題を解決できるという程度。
色々と複雑に要素が絡み合っているので難しいです。ネットがなきゃ解決不可能。
ちなみに、ブートという言葉は元々ブートストラップから来てたんじゃなかったっけかな。自分の靴紐をひっぱって持ち上げるとかいった意味から来てたんじゃなかったかなぁ。
昔のコンピューターは手動で起動プログラムを読み込ませなければいけなかったのを、OSの一部であるブートローダーが最初にメモリーに展開され、それがさらにOSを起動させるというようになったんですよね。今じゃあたりまえの機構ですが。
インテルの8080系の8bit CPU は、リセット信号をリセットピンに入力するとアドレスの 0000 番地から順番にマシン語を実行するようになっていて、そのためにマイコンのモニタープログラムは 0000 番地を起点として動作するようになっていたんですよね。一方でモトローラーの 6801 系のCPU は確か FFFE と FFFF のふたつの番地で指定されたアドレスを起点としてプログラムを実行していたと記憶が。
レジスターの構成も違うんですよね。8080系はアキュムレータを中心として複数のレジスターがあったのに対して、6801 系は2つのアキュムレータをメインとして、あとはメモリー上に展開されている情報を活用して動作してたんじゃなかったかなぁ。6801 系のはあまりよく知らないのですが。
当時は相対アドレスができなかったのですが、8080の上位互換性を持っていたザイログのZ80はレジスターが8080の2倍分あるだけじゃなくて、インデックスレジスタがあって、アドレスポインタからの相対アドレスを指定できるようになっていたので、いわゆるリロケータブルなコーディングができるようになったのでした。今では、コンパイラーの出力するオブジェクトファイルはリロケータブルなのが当然ですが、初期のコンパイラーは絶対アドレスを計算しないといけなかったんですよね。なんで、2パスコンパイルといって、一度処理のコンパイルを行ってから、ルーチン同士のアドレスを計算してひとつのプログラムにするのでした。
昔の言語はそのコンパイルが容易にできるように構造が工夫されていたみたいです。FORTHとかはかなり逐語的にコンパイルできたみたいですし。