みけCATのにっき(仮)
つれづれなるまゝに、日くらし、PCにむかひて、心に移りゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。
(本当か!?)
出典

「パソコンも OSなければ ただの箱」は9割ウソ

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

「パソコンも OSなければ ただの箱」は9割ウソ

投稿記事 by みけCAT » 12年前

皆さんこんにちは。みけCATです。
私は先日、ある研究に成功しました。
それは、ズバリ「SDカードのルートディレクトリにBOOT.BINという名前で保存したプログラムを実行する研究」です。
え、BashとかPerlなどのスクリプトをBOOT.BINという名前で保存して実行すればいい?
そんなせこいことはしません。
え、「拡張子が違うファイルだけどLinuxさえあれば関係ないよねっ」?
はいはい、想像はご自由に。

しかし、今回の成果を使えば、なんと(理論上)OSの入っていないパソコンでも、任意のプログラムを実行できるのです!
(実際にOSの入っていないパソコンを持っていないのでわかりませんが・・・)

早速、どうやったかをお見せしましょう。
鍵は、頑張って書いたこの2本のプログラムです。
プログラムA
► スポイラーを表示
プログラムB
► スポイラーを表示
プログラムAは、主にファイル検索・読み出しのプログラムと、プログラムBを読み込んで実行するためのプログラムです。
プログラムBは、プログラムAに入りきらなかったファイル読み出し用のプログラムの一部と、
プログラムAがファイル操作をするために必要なパラメータの設定、BOOT.BINの読み込みと実行をするプログラムです。

この2本のプログラムを、まずgccでオブジェクトファイルに変換し、objdumpなどを用いてバイナリに変換します。
プログラムAから変換したバイナリを、SDカードの最初のセクタの適切な位置に書き込みます。
where_to_write_programA.png
プログラムAを書き込む位置
プログラムBから変換したバイナリを、SDカードの最初のパーティションの最初のセクタの適切な位置に書き込みます。
where_to_write_programB.png
プログラムBを書き込む位置
あとは同様の技法で作成したバイナリを、SDカードのルートディレクトリにBOOT.BINという名前で保存します。
一旦パソコンをシャットダウンして、SDカードをパソコンの適切な位置に入れた状態で起動すると・・・
[youtube][/youtube]
はい!プログラムの起動成功です!
同じくSDカードのルートディレクトリにあるIMAGE.BMP(640x480の16色ビットマップ)を読み込んで描画するプログラムを実行してみました。

まず、BIOSがプログラムAとその後についているパーティションの情報を0x7C00に読み込んで実行してくれます。
プログラムAが、プログラムBとその前に付いているファイルにアクセスするための情報を0x7E00に読み込んで実行します。
プログラムBが、BOOT.BINを0x0500に読み込んで実行します。
理論上はこのような動作原理になっているはずです。

この実行方法の面白いところは、計算機のメモリを好きなだけ自由に使えることです。
(厳密には予約領域があるので、完全に自由ではないですが・・・)
普段のC言語やJavaでのプログラミングだと、あらかじめ確保したメモリ領域しか使えない(ことになっているよう)ですからね。
さらに、Windows上でメモリにバイナリをロードし、それを直接CPUで実行しようとしたら怒られてしまいそうですが、
この世界では普通にできます。

このシステムはまだ発展途上で、今のところ
・FAT16しか使えない(NTFSやext3はもちろんのこと、FAT32やFAT12もダメ)
・ディスクの最初の65536セクタしか使えない(SDカードのパーティションをいじって無視できるようにできたはず)
・その他、条件によって失敗する?
という制約があります。

ところで、起動される方のBOOT.BINですが、今はアセンブリを直接書いて制作しています。
しかし、もしもっと書きやすいスクリプトを人間が書き、それを自動でアセンブリに変換できれば、
プログラムが作りやすくなるかもしれません。

え、結局OSを作ってることになるんじゃないかって?
・・・これ一次ローダ(プログラムA・B)&二次ローダ(BOOT.BIN)だもん!OSじゃないもん!

結論
パソコンも BIOSなければ ただの箱?

ISLe
記事: 2650
登録日時: 15年前

Re: 「パソコンも OSなければ ただの箱」は9割ウソ

投稿記事 by ISLe » 12年前

いまはPC/AT規格があるのでハードウェアを直接叩く必要もなくてずいぶんと楽ですよね。

8ビットパソコン時代はI/Oポートからディスクコントローラーに対して直接命令を送ったりするために、各種半導体のデータシートを取り寄せるなど資料集めがたいへんでした。
パソコン雑誌にパソコン本体の回路図やらROMの逆アセンブラソースが掲載されて、それを見ながら直接ハードウェアを叩いて遊ぶという時代でしたしね。