いわゆる「AWARD BIOS」は、多くのマザーボードで使用されているが、その内部的な仕様についての情報は少ない。本備忘録は、ASUS 製 A7V マザーボードの BIOS イメージを突撃実験室が独自に解析して得た情報をまとめたものである。本稿で提供している情報に関しては万全を期したつもりだが、したがって、その正確性は保証できないし、この情報を使用したことに起因するいかなる損害も担保することはできないことをご承知願いたい。特に BIOS いじりに失敗すれば確実にパソコンが立ち上がらなくなるという危険があるので、BIOS を改造されるときは当然だが自己の責任において行っていただきたい。
AWARD BIOS を開発していた AWARD 社は、1998年9月に
Pheonix 社に吸収されたため、現在 AWARD BIOS を開発しているのは Pheonix 社である。しかし、元来より AWARD 社が開発していたものは、今でも「AWARD BIOS」と呼ぶのが正しいようだ。また、AWARD BIOS にはバージョンがいくつもあり、現在もっとも広く使われているのは、大別してバージョン4系(4.50, 4.51, 4.60 など)とバージョン6系 (6.00 など)の二種類である。最新のマザーボードは、主にバージョン6系を搭載しているようだ。本稿でいう「AWARD BIOS」は、特に断りがない限り AWARD のバージョン6系 BIOS を指す。
また、一般的に「BIOS」と呼ばれているものは、マザーボードの ROM に書き込まれているソフトウェアの総称であって、その具体的な中身は、ご存じのようにマザーボードごとに異なる。AWARD が開発しているのは、全てのマザーボードにおいて基本となる部分(いわゆる BIOS コール機能や、Plug and Play、電源管理など)だけであり、通常は、マザーボードメーカによる独自の拡張が加えられてマザーボードに搭載されている。本稿の情報は、ASUS A7V の BIOS(AWARD のバージョン 6.00)から得た情報を元にしているため、ほかのマザーボードの BIOS では異なる部分があるかも知れないが、同じ AWARD BIOS 6.00 であれば、ほぼ共通であると思われる。
- メモリーマップ
A7V の BIOS は、2M bit の Flash ROM に搭載されており、ROM イメージのサイズは 256K バイトである。そのメモリーマップの概要を、表1に示す。
表1. メモリーマップ
パート名 | 開始アドレス | バイト数 | 内容 |
終了アドレス |
A | 0x00000 | 0x20000 (131,072) bytes | BIOS の付随ファイル (LHA 圧縮形式) |
0x1ffff |
B | 0x20000 | 0x14000 (81,920) bytes | System BIOS (LHA 圧縮形式) |
0x33fff |
C | 0x34000 | 0x05000 (20,480) bytes | asus.bmp(詳細は不明) (LHA 圧縮形式) |
0x38fff |
D | 0x39000 | 0x01000 (4,096) bytes | 設定保存領域 |
0x39fff |
E | 0x3a000 | 0x01000 (4,096) bytes | Decompression BIOS (LHA 伸張プログラム) |
0x3afff |
F | 0x3b000 | 0x03000 (12,288) bytes | [不明] |
0x3dfff |
G | 0x3e000 | 0x02000 (8,192) bytes | BootBlock BIOS (起動 BIOS) |
0x3ffff |
- 「BIOS の付随ファイル」の部分には、BIOS の基本的な機能とは直接に関係はないものの、BIOS の付加的な機能として必要なファイルが複数格納されている。具体的には、CPU マイクロコードや、NCR SCSI BIOS、省電力仕様を示す「Energy Star」の EPA イメージなどが挙げられる。これらのファイルは、それぞれが少々特殊なヘッダを持った LHA アーカイブとして圧縮されているのが特徴的である。ファイル一つ一つが別個の LHA アーカイブになっており、このパートには一つ以上のファイルが格納されているあるため、複数の LZH ファイルが一つに繋がったような形をしている。アーカイブの形式については、後で詳しく説明する。余った未使用の領域は、0xff で埋められる。
- 「System BIOS」は、その名の通り BIOS の中核的な部分であり、BIOS の主要な機能は全てここで実装されている。おなじみの設定画面も、この中にある。System BIOS も、パート A の部分と同様に LHA アーカイブの形式で圧縮されているが、ファイル数は一つだけである。0x20000 から LHA アーカイブの終わりまでを、byte 単位で総和したものの LSB である 1 byte のチェックサムが、LHA アーカイブの終了バイト直後にある。このチェックサムが合わないと、システムは立ち上がらない。このチェックサム以降の未使用の領域は、0xff で埋められる。
- asus.bmp というファイル名のアーカイブが独立して存在している。ファイル名からして何らかのビットマップと思われるが、詳細は不明である。余った未使用の領域は、0xff で埋められる。
- BIOS のコンフィギュレーションを保存している領域と思われる。ASUS のサイトからダウンロードしてきたばかりの真っさらの BIOS ROM イメージは全て 0xff で埋まっているが、ROM に書き込んで使用すると何かのデータが記録される。未使用の領域は、0xff のままである。
- 「Decompression BIOS」は、LHA アーカイブとして圧縮された BIOS を伸張するためのプログラムで、当たり前だが無圧縮のバイナリとして独立して存在している。余った未使用の領域は、0x00 で埋められる。
- 用途は不明だが、何かのデータが埋まっている。
- 「BootBlock BIOS」は、パソコンが立ち上がった直後に実行される部分で、無圧縮のバイナリである。パソコンの立ち上げに必要な処理を終えると Decompression BIOS を呼び、圧縮されている System BIOS を伸張してメモりに展開し、処理を System BIOS に渡す。余った未使用の領域は、0x00 で埋められる。
- アーカイブ形式
- 概要
AWARD の BIOS は、ROM のスペースを節約するためか、BootBlock BIOS や Decompression BIOS など機能的に圧縮できない部分を除けば、全て圧縮されて格納されている。圧縮されたデータの形式は、ヘッダの部分に少しだけ異なる点があることを除けば、-lh5- 形式の LHA アーカイブと同一である。したがって、バイナリエディタなどでアーカイブを切り出して、普通の lha を使用すれば BIOS の ROM イメージから抜き出した圧縮アーカイブを伸張することも可能だし、その逆もまた、普通の lha で生成した LZH ファイルのヘッダ部分を少し書き換えれば可能である。
いわゆる LZH ファイルでは、一つのアーカイブに複数のファイルをまとめることも出来るが、AWARD BIOS の ROM イメージで使用されているものにおいては、複数のファイルがある場合でもファイルごとにそれぞれが別個のアーカイブとして圧縮されている。例えば、表1 の A パートには複数のファイルが存在するが、先述した通り、ファイルを一つだけ含んだ複数の LZH ファイルが途切れなく繋がっているような形をしている。
- アーカイブのデータ形式
AWARD BIOS に含まれる圧縮アーカイブは、MS-DOS 用 の lha 2.55 で生成されたアーカイブと殆ど同一である。-lh5- 形式で圧縮されており、データ部分は、通常の LZH と全く同じだ。ヘッダも通常の LZH とほぼ同一だが、異なる点が2カ所ある。表2 に、AWARD BIOS で使用されているアーカイブのデータ形式を示す。
表2. AWARD BIOS アーカイブヘッダ
オフセット | データ型(サイズ) | 機能 | 内容 |
0x0000 | u_int8_t | ヘッダサイズ | 「圧縮メソッド」を先頭に終端までのヘッダサイズ |
0x0001 | u_int8_t | ヘッダチェックサム | 「圧縮メソッド」を先頭に「ヘッダサイズ」分の byte 総和 |
0x0003 | char[5] | 圧縮メソッド | "-lh5-" で固定 |
0x0007 | u_int32_t | 圧縮後データサイズ | (可変) |
0x000b | u_int32_t | 圧縮前データサイズ | (可変) |
0x000f | u_int32_t | ※ファイル種別 | (可変) |
0x0013 | u_int8_t | ダミー | 0x20 で固定 |
0x0014 | u_int8_t | ヘッダ種別 | 0x01 で固定 |
0x0015 | u_int8_t | ファイル名文字列長 | (可変) |
0x0016 | ファイル名文字列長分 | ファイル名 | ファイル名の文字列 |
(不定) | u_int16_t | ファイル CRC | 圧縮前のファイル CRC |
(不定) | u_int8_t | ※OS 種別 | 0x20 で固定 |
(不定) | u_int16_t | ヘッダ終端 | 0x0000 で固定 |
(不定) | 圧縮後データサイズ分 | 圧縮データ | (可変) |
(不定) | u_int8_t | アーカイブ終端 | 0x00 で固定 |
※印を付けた部分が、異なるところだ。それ以外は、全て通常の LZH ヘッダと同一である。「ファイル種別」の部分には、通常の LZH ヘッダでは圧縮前のファイルのタイムスタンプが記録されているが、AWARD BIOS においては「ファイル種別」が記録される。また、MS-DOS で作成したアーカイブの LZH ヘッダでは「OS 種別」に 0x4d が記録されるが、AWARD BIOS では 0x20 になる。
Decompression BIOS は、ほぼ全ての項目のチェックを行っており、何かが違っているとパソコンが立ち上がらなくなる。
- ファイル種別
AWARD BIOS の ROM イメージには、複数のファイルが圧縮されて格納されているため、それらを区別するために LZH アーカイブヘッダの「ファイル種別」という 32bit の数値を用いている。つまり、BootBlock BIOS または System BIOS が必要なファイルを伸張させるために Decompression BIOS を呼び出す際には、特定のレジスタに引数として「ファイル種別」を格納しておく。すると、Decompression BIOS は、ROM イメージの中から「ファイル種別」と合致するアーカイブを検索し、もし見つかればそれを伸張してメモリに展開する仕組みになっている。特に、ファイル種別が 0x50000000 のものは、BootBlock BIOS から伸張され、それ以外のものは System BIOS から伸張されるようになっているようだ。
たとえば、ASUS A7V には、表3 のようなファイルがあった。ファイル種別の数値割り当てに規則性はないようで、全てを把握するのは難しい。また、個々のファイルがどういう働きをしているのかについても、中身を解析していくしかなく、不明な点は多い。
表3. ASUS A7V の BIOS に格納されているファイル一覧
ファイル名 | ファイル種別 | 機能 |
cpucode.exe | 0x40010000 | CPU マイクロコード |
AWARDEXT.ROM | 0x60000000 | 不明 |
awardepa.epa | 0x40020000 | EPA 画像ビットマップ |
ACPITBL.BIN | 0x40030000 | APCI テーブル |
cav_shdw.bin | 0x40070000 | 電源関係? |
pci32.rom | 0x08000000 | NCR SCSI BIOS |
u100b20.bin | 0x40130000 | Promise Ultra 100 BIOS |
stn.bin | 0x50000000 | System BIOS |
asus.bmp | 0x50000000 | ASUS ロゴ |
- BIOS チューニング
AWARD BIOS の ROM イメージを操作させてくれるフリーのプログラムは、いくつか流通している。その中でも有名なもので cbrom.exe という(かつては)AWARD が公開していたプログラムがある。これは、個々の LZH ファイルを ROM イメージから抜き出したり、また自前で容易したファイルを、圧縮した上で ROM イメージの中に格納するためのプログラムだが、AWARD 社が Phoenix 社に吸収されてから Phoenix 社が Web 上の配布サイトに公開中止を積極的に要請したらしく、現在では入手難となっているようだ。
チューンド BIOS の第一歩としては、おなじみ「ENERGY Star」の EPA イメージを自前のものに差し替えてみると(ロゴチューンが好きな向きには?)面白いと思う。Windows BMP イメージを EPA ビットマップイメージ形式に変換する bmp2epa.exe というプログラムがあるので、これを使えば自前の EPA ビットマップイメージを比較的簡単に生成することが可能だ。変換したあとは、先述した cbrom.exe を用い、ROM イメージの中にあるデフォルトの EPA ビットマップイメージを自作のものに差し替えれば良い。すると、パソコンが起動したときに自作のロゴを表示させられる。
もはや初心者お断りの領域なので、これらをダウンロードできるサイトには敢えてリンクしないし、質問に答えるつもりもないので、悪しからず。興味がある方は、海外のサイトもヒットするサーチエンジンなどで探せば出てくる。ここで公開した情報が、マニアックな BIOS チューニングのお役に立てれば幸いである。
cbrom.exe が入手難のため、突撃実験室では、それに代わるオリジナルものを開発中です。取り敢えず、BIOS イメージの中にある LHA アーカイブをダンプするものを作りましたので、実用性はありませんが公開します。いまは、ROM イメージのアーカイブ部分を抽出する機能しか実装していませんが、いずれは BIOS の中身を書き換えられるようにしたいと思っています。
ダウンロード→ [
MS-DOS バイナリ] [
ソースコード]
自分で BIOS イメージを解析するために作ったものを勢いで治しただけのものなので、かなりいい加減です。保証は一切ありませんので、各自の責任において使用してください。開発は FreeBSD 上の gcc と gdb で行い、MS-DOS バイナリのコンパイルは、
LSI-C 3.30c 試食版で行っています。実際に使う人は少ないと思いますが、バグ報告やコードのフィードバックなどがあれば歓迎します。利用、改造、配布はご自由に。
【名称】
award.exe (Version 1.00)
【書式】
award.exe [-s] file
【解説】
award.exe は、file で指定された AWARD BIOS の ROM イメージファイルの中から LHA アーカイブとして格納されている部分を検索し、その全てについての情報を一覧として標準出力にダンプします。アーカイブごとのダンプの見方は、以下の通りです。
OFFSET | アーカイブが存在するオフセットアドレスを16進数で示します。 |
TYPE | アーカイブのファイル種別を16進数の数値で示します。また、括弧内には、ファイル種別の説明が表示されます。 |
FILENAME | そのアーカイブに圧縮されているファイルの名称です。 |
COMP SIZE | アーカイブに圧縮されているデータの圧縮後ファイルサイズを16進数で表示します。また、括弧内は10進数で表示です。 |
COMP SIZE | アーカイブに圧縮されているデータの圧縮前ファイルサイズを16進数で表示します。また、括弧内は10進数で表示です。 |
また、オプションとして以下のものがあります。
-s | このオプションが指定されたときは、ROM イメージファイルの中に含まれる全てのアーカイブを、それぞれ別個の lzh ファイルとしてカレントディレクトリに保存します。なお、この機能によって生成された lzh ファイルは、ヘッダ部分が MS-DOS の lha によって生成される lzh ファイルとは若干ながら異なるため、一部の lha 互換ソフトウェアでは読み込めないことがあります。 |