特集記事
Last updated 2002-07-29

インターフェース 2002年7月号 特集記事・読者の皆様からの質問&訂正コーナー

インターフェース 2002/7月号特集号「Linux徹底詳解 ― ブート&ルートファイルシステム」に寄せられた読者の方々からの質問です。間違いの指摘なども含め、不明な点などありましたらいつでもお気軽にご連絡ください。

西 田 亙 (NISHIDA Wataru)

Bochs のビルド方法 2002/6/10 Nishikita 様

Linux徹底詳解は大変勉強になりました。プログラムの構造等非常にわかりやすく説明されていて、いままで理解できなかったことが、随分と理解できるようになりました。ありがとうございます。

さて 不躾なお願いですが、Bochsのビルドで照会されている gcc-snapshotの入手方法、ビルド方法
を教えていただけませんか?ご迷惑でなければ是非教えてください。よろしくお願いします。

gcc snapshots の URL は以下の通りです。
http://gcc.gnu.org/snapshots.html

ビルド方法については、
http://gcc.gnu.org/install/

もしくはアーキテクチャは異なりますが、次のページをご参照ください。
http://www.skyfree.org/memorandum/2001-08-2.html


Red Hat 環境での .rodata セクションについて 2002/6/20 竹下様

Interface7月号の西田様の記事とても感謝しております。昔からPCのブートアップのプロセスやBIOSの使用方法につき興味があり、いつかはブート・ディスクなど書き込んでみたいと思っておりましたので、早速 make して dd してみました。フロッピーから立ち上がって Hello world! が表示される画面はとても感動的でした。

ところで私の使っているgccでは、リンカースクリプトの .rodata セクションの入力側を { *( .rodata*) } としないと .rodataセクションとしてコンパイラが出力するオブジェクトに .rodata.1.xxx などがあるためにうまくリンクされない、という現象がありましたので、ご存知とは思いますが、ご参考までにお知らせ致します。

本当にすばらしい記事とWebサイトのご提供ありがとうございます。

貴重な情報をありがとうございました。このメールを頂き、私も初めてこの問題に気付いたのですが、どうもこれは Red Hat が提供している GCC が原因のようです(私はいつも Debian 版の GCC を利用しています)。以下、竹下様がお使いの gcc バナー。

Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/2.96/specs
gcc version 2.96 20000731 (Red Hat Linux 7.1 2.96-98)

このバージョンで Hello, world! プログラムをビルドすると次のようなリンクマップが生成されます(一部省略)。

Memory Configuration
Name             Origin             Length             Attributes
body             0x00000000         0x000001fe
sign             0x000001fe         0x00000002
*default*        0x00000000         0xffffffff
Linker script and memory map.text           0x00000000      0x15c
 *(.text)
 .text          0x00000000       0x20 crt.o
                0x00000000                _start
 .text          0x00000020      0x120 bios_tty.o
                0x000000d8                print_hex16
                0x00000020                printc
                0x000000a4                print_hex8
                0x00000038                prints
                0x00000074                print_hex
                0x0000010c                print_hex32
 .text          0x00000140       0x1c hello.o
                0x00000140                main
.rodata         0x0000015c       0x17
 *(.rodata*)
 .rodata.str1.1
                0x0000015c       0x17 hello.o
.data           0x00000174        0x0
 *(.data)
.bss            0x00000174        0x0
 *(.bss)
.sign           0x000001fe        0x2
 sign.o(.sign)
 .sign          0x000001fe        0x2 sign.o
                0x000001fe                sign

.rodata.str1.1 という名前のセクションが新たに作成されている点に注意してください。Red Hat GCC は、内部で名前拡張した .rodata セクションを利用するようです。このため、リンカースリプトにおける「入力 .rodata」セクションの指定は *(.rodata) ではなく、*(.rodata*) を指定する必要があります(.rodata の後ろにワイルドカードを指定)。Red Hat GCC を使用する場合のリンカースクリプト修正点については、サポートページで追加訂正していますのでご覧ください。 具体的な対処法まで含めご連絡頂いた竹下様に感謝致します。


Bochs VGA-BIOS ソースの所在およびビデオ BIOS 呼び出し番号の誤りについて 2002/7/29 松澤様

松澤と申します。お忙しいところ恐縮です。
インターフェイス7月号をたいへん興味深く拝見し、一部実際にトレースして見ています。 一点、解説されている部分について、不明なところがあり、お教えいただけると幸いです。  なお、bochsにはvideo biosのソースがついてきませんでしたが、他のパッケージにはあるのでしょうか。 <- これは別途自分でも探してみますが。

biosのFunctionリストを現在手元に持っていないため、下記について、どちらが正しいのか不明でおります。P.71 左カラム上から6行目 Write Teletype to Active Pageの機能番号が15ということですね。ところが、リスト3ならびに、p71右カラム上から7行目の解説では、14となっています。左に16ビットシフトするために256倍は分かりますが、なぜ14になっているのでしょうか。それとも、元々14が正しかったのか。
恐れ入りますが、お教えいただけると幸いです。

まず最初のご質問である、Bochs での VGA-BIOS ソースの件ですが、これは残念ながら Bochs パッケージには添付されておりません。パッケージに含まれているのは ROM-BIOS のソースのみです。

2点目ですが、これは完全に私のタイプミスでありソースリスト中で用いられている「機能番号14(16進数で 0x0E)」が正解です。貴重なご指摘ありがとうございました。

なお、昔ですと本屋に行くと BIOS コールの解析書があったものですが、最近はすっかり見かけなくなってしまいました。そこで BIOS 呼び出し規約をお探しの方に次のページをご紹介しておきましょう。個人的に運営されているようですが、大変良くまとまった資料的価値の高いページです。

この他では、Phoenix 社の充実した資料がお勧めです。Phoenix BIOS 4.0 に関する User's manual は是非打ち出して手元に置いておきましょう。ただ、残念なことに内容はリファレンス的であり、この資料だけでは複雑な BIOS 呼び出しをコーディングするのは難しいでしょう。解析本が必要ですが、これについてはお勧めの書で紹介したいと思います。

Your SysOp is Wataru Nishida , M.D., Ph.D.