月例卓話

マルチブートに失敗。パソコンが動かなくなった―「BTX-Halted」って何だろう。
黒はじめに木和彦＊（8086）との互換性のために用意された 20 ビッ

PC（Personal Computer) の世界でもっと広トのモードであり，アドレス空間は１MB に限く使われているコンピュータアーキテクチャは，定される．現在ではシステム立ち上げ時にのみ

イ ン テ ル の IA-32 で あ る． こ こ で は， そ の使われている．

IA-32 の 上 に ど の よ う に し て Unix 系 OS

そして，これらのモードを使い分けなければ（Operating System）のひとつである FreeBSDならないことが，立ち上げに使われるプログラを乗せるのか，そのやり方のごく始めのプロセムをより一層複雑なものにしていると思う．古スについて書くつもりである．

いプログラムがそのまま使えることは IA-32 の技術的詳細を書く力はないので，全体の流れ強みであると同時に，金の鎖でもあるようだ．

を書くつもりであるが，スマホにもタブレット
1.事の始まりに も SNS（Social Network Service) に も 全 く
興味がない，いわばデジタルデバイドで格差を現役を引退してからは，路傍の石のようなもつけられた側の一人である私が書くのだから，ので，取り立ててすることもなく，無聊な日々不安感でいっぱいである．

を送ることになった．

なお，どの分野でもそうなのであろうが，締め切りのない生活自体は大層気楽なものだ

IT の 世 界 も ま た， た く さ ん の 略 語 で 溢 れ かが，少し工夫をしないと体も頭も早く劣化するえっている．一種の業界用語なのだろう．これのではないかと心配になる．少し負荷を掛けならの略語は，この分野になじみの薄い人にとっいといけない．幸いにも，体の方は，ゴルフにては極めて大きな参入障壁である．文句を言っ誘ってくれる知人がいてそれなりに動かす機会ても始まらないので，できるだけ正式名称を併に恵まれた．残る課題は頭である．負荷になる記した．

ようなものはないかと考え，思いついたのがPC の OS である．現役時代は Windows が必須

動作モードについてであったが，路傍の石となった今は何でも自分

IA-32 には三つの動作モードがあるが，そのの好きな OS を選ぶことができる．

う ち ユ ー ザ に と っ て 重 要 な の は Protected

OS に，CP/M，DOS，Windows， と い う 流

Mode と Real Address Mode で あ る． 両 者 のれ が あ る と す れ ば，CP/M，UNIX，LINUX，大きな違いはアドレスの計算方法にある．標準という別の流れに手を染めてみるのも悪くないの モ ー ド は 前 者 で あ る． 後 者 は 初 期 の CPUと考え，UNIX 系の FreeBSD を使ってみるこ＊

元三洋電機㈱研究開発本部

第 300 回京都化学者クラブ例会（平成 27 年 6 月 6 日）講演
82

海洋化学研究第28巻第 2 号

平成27年11月

とにした．一台の PC に二つの OS を混在させ

乱 暴 な や り 方 だ が 確 実 に 停 止 で き る Lethal

る，デュアルブートシステムの実現である．

Weapon である．一体何が起こったのか，時間

取りあえず，自分の PC に内蔵されているはたっぷりあるし，少し調べてみようと思った

160GB の HDD（Hard Disk Drive）に空きパーのが，事の始まりである．

ティションを作り，FreeBSD をダウンロード

ほんの少しのハードウェアの知識と，アッセした後，マニュアルに従ってインストールした．

ンブラと，C 言語とを武器に FreeBSD のブーインストールに成功した FreeBSD は，サクサ

ト プ ロ セ ス に 挑 ん だ わ け で， ま る でクと快適に動いたが，キーボードからコマンドJABBERWOCKY を読み取ろうとした「鏡のを 打 ち 込 ん で 動 か す CUI（Character-based

国の Alice」のようなものだと，その無謀さにUser Interface）であり，また，アプリケーショ

今では呆れている．

ンが何も入っていないこともあって，少し使い
2.Bootstrap

勝手が悪い．
そこで，いろいろ調べていると，FreeBSD

FreeBSD を立ち上げる（Boot する）ためには，をベースにした SU-FreeSBIE という LIVE-CD

Hardware Initialization，BIOS， に 始 ま っ て，用のパッケージが，摂南大学工学部の井上先生

Boot0，Boot1，Boot2 といくつものステップをの手によってアップされていることに気がつい経なければならない．最初の二つのステップ，た． マ ウ ス で 動 か す GUI（Graphical User

即 ち，Hardware Initialization と BIOS と に はInterface) が 使 え， 電 子 回 路 設 計 な ど ア プ リ

一般のユーザが手を入れることはできない．

ケーションソフトもひとつにまとめられており，

Hardware Initialization は Intel の領域であり，使いやすそうなので，ダウンロードし CD に焼BIOS は BIOS 専門メーカの仕事である．従っいた．しかし，実際に使ってみると，当然のこて，その内容について知る必要はないのだが，とではあるが CD ベースのため，立ち上げに時興味の趣くままに少し調べてみた．

間が掛かるのと，新たに作成したデータの保存2.1ができない，という二つの問題に直面した．幸Hardware Initialization

い，SU-FreeSBIE の中に USB メモリに落とし

PC の電源スイッチを入れると，電源回路は込むためのインストーラが予め用意されていた所定の電圧が安定して出力されている事を確認ので，それを使って立ち上げ可能な USB メモ

し た 後，CPU（Central Processing Unit） にリを作った．

Power Good の信号を送る．

これなら大丈夫直ぐに動く，と思ったのだが，Power Good の 信 号 を 受 け 取 っ た CPU は，予想に反して，立ち上げると，GPR（General内部に組み込まれた BIST（Built in Self Test）

Purpose Register) の 内 容 を ダ ン プ し た 後，と呼ばれる一連のテストプロセスを実行する．

「BTX Halted」のメッセージを出して動きを止BIST の詳細は不明だが，CPU 内部のマイクロめてしまった．キーボードを始め一切の入力がコードの入力の全ての組み合わせなどもテスト受け付けられない．電源を切ることすらできなされるようだ．BIST をパスすると，全てのレい．最初の頃は，他にやり方を思いつかなかっジスタが所定の値に初期化されプログラムの実たので，電源ケーブルを抜いて PC を止めた．

行が始まる．

Transactions of The Research Institute of
Oceanochemistry Vol. 28 No. 2, Nov., 201583CPU の 動 作 モ ー ド を 決 め る CR0（Controlデ ィ ス プ レ イ な ど I/O 機 器 の 動 作 確 認 やRegister 0） の 初 期 値 は 60000010H で あ り，DRAM（Dynamic Random Access Memory）

Real Address Mode であることを示している．のテストなどのほかに，大事な仕事として，最初に実行されるアドレスは FFFFFFF0H でIVT（Interrupt Vector Table）の設定がある．

ある．このアドレスは CPU の動作モードがOS が動いていない状況では，PC に何かをさReal Address Mode で あ る に も 関 わ ら ず

せようとすれば BIOS の持つ機能を利用するしProtected Mode のアドレス計算方法で作られか 手 段 が な い．IVT は，BIOS の 提 供 す るる．しかし，IA-32 の一連のブートプロセスは

Low-Level I/O の 機 能 の 入 り 口 の ア ド レ ス

Real Address Mode で動くため，アドレス計（Entry Point) を一覧表にしたようなもので，算方法の変更が必要である．そのためにはセグ

IA-32 の持つ INT n という割り込み命令を使っメントレジスタ CS に新しい値をセットすればてアクセスする．

良い．これは，Far Jump という命令を実行す周辺機器の初期化と動作確認を終え，必要なることで可能である．

IVT を設定した BIOS の最後の仕事は，設定しFFFFFFF0H のアドレスは 32 ビットアドレたばかりの IVT の中の 0x19 のルーティンを呼ス空間の最高値 4GB から 16 バイト下がった所び出し実行することである（Int 19H のコマンであり，そこには通常は Far Jump 命令が置かドを使って割り込みをかける）．呼び出されたれている．この命令により，CPU は BIOS のInt 19H は，HDD の最初のセクタに書かれてエントリーポイントである POST（Power onいる 512 バイトのデータ（Boot0）をメインメ

Self Test）へジャンプすると同時に，新しいモリの 0x7c00 に読み込んでくる．更に，読みCS がセットされるので Real Address Mode に込 み が 終 了 す れ ば， プ ロ グ ラ ム カ ウ ン タ を入ることにもなる．

0x7c00 にセットして今読み込んだばかりのプロ グ ラ ム の 先 頭 か ら 実 行 す る． ど う し て

2.2

BIOS-Basic Input Output System

0x7c00 に読み込むのかは定かではないが，世BIOS は PC を立ち上げるための極めて優れ界中で広く使われたパソコン（PC/AT）をデた工夫だと思う．BIOS は，PC の立ち上げにザインした IBM の技術者が決めたアドレスで必要なプログラムの集まりで基本的にはソフト

あ る． 当 時 の 標 準 的 な メ イ ン メ モ リ

ウェアであるが，ROM（Read Only Memory)

32KB(0x8000） の ト ッ プ 1KB(1024 バ イ ト：に書き込まれ予めマザーボードに組み込まれて0x400 バイト）を作業領域に確保したのであろいるので，ハードウェアの一部のようなものでう言う説は何となくうなずける．

ある．最近では Flash NAND メモリを使って，この最初のセクタに書かれた 512 バイトの情アップデートを可能にしたシステムも出ている

報 は MBR（Master Boot Record） と 呼 ば れ，ようだが，BIOS が壊れたら PC は二度と立ちPC を立ち上げるためには極めて重要なもので上がらなくなるので，必要がない限り触れてはある．IBM の技術者はこの重要な情報を守るいけない．アップデート中に誰かが電源ケーブため，第 1 トラックには MBR 以外書いてはいルを蹴飛ばしたら一巻の終わりである．

けないという規則も定めたようだ（第 2 トラッ

BIOS の仕事は多岐にわたる．キーボード，84

ク規定）．従って，第 1 トラックの第 2 セクター

海洋化学研究第28巻第 2 号

平成27年11月

以降は空である．てきている．

最近の BIOS に興味のある方には Bochs の標準的なプログラムの動きで見てみると，BIOS プログラム（rombios.c）が参考になると0x7c00 に読み込まれた MBR は，先ず自分自思う．しかし，C 言語で書かれた 1 万行にも及身を 0x600 に移し 0x7c00 以降を空にする．こぶプログラムでなかなかの難物である．

れは，このプログラムの最後で再び BIOS をコールして，0x7c00 に次のステップのプログ2.3

Boot0（MBR）ラムを読み込むためである．次に，PT をひとInt 19H でメモリの 0x7c00 に読み込まれたつひとつ順にチェックして，立ち上げ可能な512 バイトの MBR は大きく 3 つの部分に分かパーティションを探す．それが見つかれば，マれている．512 バイトのうち，0x0 から 0x1bd

ジックナンバ 0x55AA が所定の位置に書かれまでの 446 バイトにはブートプログラムが書かていることを確認した後，今見つけたパーティ

れ， 続 く 0x1be か ら 0x1fd の 64 バ イ ト は PTションの先頭セクタ（Boot1）を BIOS を利用（Partition Table) として使われている．最後のして 0x7c00 に読み込んでくる．標準 MBR で2 バイト，0x1fe と 0x1ff は 0x55AA でなければあればこれらの内容は 512 バイトに十分収まるならない．これはマジックナンバと呼ばれ，このだが，FreeBSD の Boot0 ではユーザプロンのセクタが正当なブートセクタであることを示プトを出したりする関係で 512 バイトぎりぎりすために使われる．PT は HDD を分割して使である．

うための工夫で，ひとつの HDD を最大 4 つの2.4パーティションに分割して使うことができる．
パーティションと言っても物理的に分割するわ

Boot1

Boot1 もまた 512 バイトの短いプログラムで，けではなく，ソフト的に分けて使おうというこ

最後の 2 バイトにはマジックナンバ 0x55AAとだけなので，分割し直すことも容易だ．

が書かれている．PT はない．Boot1 の仕事はPC/AT では，パーティションの属性情報をBTX（Boot Extender) と Boot2 とをメモリに記録するのに 1 パーティションあたり 16 バイ

読み込み BTX を走らせることにある．

トを使う．4 つのパーティションだと全部で 64

FreeBSD のパーティションは，パーティバイトである．また，パーティションの開始位ションの先頭セクタから数えて，セクタ 0 には置と長さの記録には 16 バイトのうち各々4 バ

Boot1 が書かれ，セクタ 1 にはパーティションイトが使われる．PC/AT が実用化された当時をアクセスするのに必要な Disk Label と呼ばは，HDD の容量がさほど大きくなかったのでれる情報が書かれている．セクタ 2 からセクタ4 バイトもあれば十分だったのだが，１TB を15 には BTX と Boot2 とがあり，セクタ 16 以超える現在の HDD で使うには不十分である．

降はスーパーブロックと呼ばれ，ファイルシス

そこで現在では，使用禁止になっている第 1 トテムに関する情報が入っている．

ラックの第 2 セクタ以降を PT に使おうという

従って，Boot1 の仕事はパーティションの先提案がなされている．この新しい PT は GPT

頭 16 セクタを読み込み，BTX と Boot2 とをメ（GUID Partition Table）と呼ばれ，新バージョ

モリ上で再配置し，BTX を走らせれば完了す

ンの OS では標準でサポートされるようになっるが，途中で MBR を再読み込みしたりするたTransactions of The Research Institute ofOceanochemistry Vol. 28 No. 2, Nov., 201585

め，その動きは結構複雑である．

ス キ ャ ン し て ロ ー ダ ー プ ロ グ ラ ム（/boot/ロ ー ド ア ド レ ス は 0x8c00 で あ る が， パ ーloader）を探し出す．そして，BIOS を利用しティションの先頭 16 セクタには Boot1 自身もてそれをメモリへロードした後 loader を走ら含まれるため BTX は 0x9000 にロードされる

せる．

ことになる．BTX の先頭 0x10 バイトはヘッダ

loader もまた BTX のクライアントであり，なので，BTX のエントリーポイントは 0x9010

システムの構成条件について書かれたファイルである．

群を順次読み取り，それに基づいて OS の立ち上げを行う．これでブートは完了である．

2.5

BTX

なお，今回の発端となった「BTX Halted」

BTX は， 基 本 的 に は Protected Mode で 動のエラーメッセージは loader の実行時に発せく 小 さ な OS で あ る． こ の 小 さ な OS はら れ た も の だ と 推 定 さ れ た． そ の た め SU-

Protected Mode で動くユーザプログラムと，FreeSBIE の /boot/loader を FreeBSD8.2 の そReal Address Mode で動く BIOS とを結びつけれと置き換えることでこのトラブルを解消するる重要な役割を担っている．BTX の提供することができた ( と思っている）．

この機能のおかげで，ユーザプログラムからおわりにBIOS の持つ様々な Low-LevelI/O の機能を利用 す る こ と が で き る．BTX は Real Address

何もわからないまま FreeBSD の勉強を始め，Mode と Protected Mode の二つの異なる動作一応の解決を見て，これからどうしようか，とモードの間を往復しなければならないので，そいうひとつの分岐点に差し掛かっていた時なののプログラムはかなり複雑であり，また，非常で，今までの経過をまとめる卓話の機会を頂き，に難しいプログラミング技術が使われている．

感謝している．
この後どうするのか，ここで止めるのか，あ2.6

Boot2

るいは loader から kernel へと駒を進めるのか，

Boot2 は，BTX の提供する機能を利用する後者の方に進みそうな気もする．ともあれ，合ユーザ側のプログラム，即ち BTX のクライア目的的に行動する事がベストだとは思わないのントである．ブートストラップの最終段階で働で「これを知る者はこれを好む者に如かず，こく少し大きなプログラムで，Boot0 や Boot1 にれを好む者はこれを楽しむ者に如かず」という比べれば相当に高度な仕事をこなす．

孔子の教えを踏まえて，大いに楽しんで行きた

Boot2 は FreeBSD のファイルシステムを読いと思っている．

み取った後，ハードディスクのディレクトリを

86

海洋化学研究第28巻第 2 号

平成27年11月