9

私は現在boot.s、最初のLinuxカーネルのソースにあるファイルを読んでいます(0.01が実際に最初のパブリックリリースであると仮定しています)。

私はCとASMを知っていますが、後者は前者よりかなり少ないです。それでも、ソースファイルのコードを理解し、本質的に把握できるようです。

しかし、このファイルは私を混乱させました。これは、プロテクトモードではなくリアルモードであるためです。言うまでもなく、リアルモードで記述されたASMコードはこれまで見たことがありません。プロテクトモードは、私が生まれる前にx86 OSが実行されていた事実上のモードだったので、当然のことです。

これが私がよりよく理解したいルーチンです:

/*
 * This procedure turns off the floppy drive motor, so
 * that we enter the kernel in a known state, and
 * don't have to worry about it later.
 */
kill_motor:
    push dx
    mov dx,#0x3f2
    mov al,#0
    outb
    pop dx
    ret

調べてみるoutbと、コンピュータのポートにバイトを渡すために使用されていることがわかりました。このシナリオでは、最初の引数として「モーターの停止」バイトを渡し、2番目の引数としてフロッピードライブのポート番号を渡すというCのドキュメントに基づく推測を危険にさらします。

このインターフェイスはBIOSによって提供されていますか?またはフロッピードライブで直接?BIOSには、すべての基本的なデバイスの非常に基本的な操作のための質素な「ドライバー」があると思います。

これが私が困惑しているところです:のような数字#0x3f2が薄い空気から引き出されているようです。それらは明らかにハードウェアのポート番号か何かです。このファイルにはそのような番号が散りばめられており、それらが何を指しているのか説明はありません。リアルモードから受信できるすべてのハードウェアポートと制御番号を示す包括的なリファレンスはどこにありますか?また、ファイルは、ハードコードされたメモリアドレスを使用して、起動プロセス全体でカーネルをメモリ内で移動させるようです。リアルモード中に上書きできるメモリアドレス範囲のガイドはどこにありますか?

また、BIOSと内部ハードウェア割り込みの衝突を回避するための割り込みの再プログラミングに関するLinusのコメントも読みました。私はうそをつくつもりはありません、それは私の頭の真上に行きました。

ヘルプは素晴らしいでしょう。あなたが疑問に思っている場合に備えて、Googleはこのトピックについてまばらに見えます。

4

2 に答える 2

7

これらのアドレスは、IBMが最初のIBMPCをリリースした30年前に石に投げ込まれました。0x3f0は、プライマリフロッピーディスクコントローラレジスタの最初のアドレスです。アドレスのリストはこちらから入手できます

IBMの設計チームによる特徴のない動きの1つは、標準の既製の部品からマシンを組み立てることでした。ほとんどのチップはIntel製で、フロッピーディスクコントローラはNECの設計でした。意図せずに、全員がクローンを作成できるようにします。これらのクローンは、ソフトウェアの互換性を確保するために同じアドレスを使用し、IBMの選択をハードコーディング可能な業界標準に変えました。

于 2012-01-17T12:22:09.140 に答える
6

まず、リアルモードアセンブラの世界へようこそ!実際のアセンブラはリアルモードとプロテクトモードでほぼ同じであることにすでに気付いていると思います。主な違いは、オペランドのサイズとメモリのレイアウト/管理です。

インターネット上にはリアルモード用のリソースがいくつかあります-あなたはそれらを追い詰める必要があります!非常に重要なリソースの1つは、ラルフブラウンの割り込みリスト(RBILとして知られています)です。これは、リアルモードプログラミングで使用されるさまざまな割り込みに関する多くの情報を提供します。もう1つは、BIOSがさまざまなメモリ位置に保存する(または保存する必要がある)情報を説明するBiosCentralのCMOSメモリマップです。

投稿したLinuxコードに関するいくつかの質問に答えるに outbは、次のようにします。バイトalをポートに書き込む命令dxです。0x3f2はフロッピーコントローラのポートです。ウィキペディアalはx86ポート番号の基本的なリストを手伝うことができますが、ビットの実際の形式に関する詳細情報を探す必要があります。

リアルモード中に上書きできるメモリアドレス範囲はどれですか?

INT 15h、AX = E820hについて調査する必要があります。これは、使用できるメモリ領域と予約されているメモリ領域を説明するメモリマップを返します。ただし、注意してください。古いBIOSは割り込みをサポートしていない可能性があるため、割り込みを確認するときは、割り込みがどれほど「新しい」かを確認することが重要です。

...BIOSと内部ハードウェア割り込み間の衝突を回避するための割り込みの再プログラミング

多くのハードウェアデバイスには、プログラム可能な割り込みがあります(注意が必要なときにハードウェアにサービスを提供するために使用されます)。通常、BIOSは起動ルーチン中に初期割り当てを分類しますが、OSが独自の目的でハードウェア割り込みを再調整したり、既知の非互換性を防止したりすることも珍しくありません。

最後の注意:it seems that numbers like #0x3f2 are being pulled out of thin air。答えはイエスです。Linuxのブートソースの多くは恐ろしいものであり(そう、それは私の意見です)、意味のある説明なしに、一見ランダムなアドレス、ポート番号、その他のビットを散りばめているように見えます。それに固執し、他のリアルモードリソースを調べれば、最終的には意味があります。ああ、そして包括的なリファレンスに出くわした場合は、全員に伝えてください(現在は存在しないため)。

于 2012-01-17T12:42:05.293 に答える