2012-02-10 8 views
8

誰かが理解するのに十分な文句があることを願っています。I/Oアドレス空間はデバイスにどのようにマッピングされていますか?

メインメモリ(RAM)とポートI/O駆動I/Oについては、IN、OUTなどの命令が使用する独自のアドレス空間を持っていることを理解しています。

リアルモードアセンブラプログラムを作成する場合、マザーボード上の特定のスロットがどのアドレス範囲にあるかを示す必要な文書を開発者が持っているでしょうか? PCIeスロットがアドレスX、プリンタYであるとします。

バスの種類によってはアドレスが標準のアドレス範囲ですか?

これをよりよく理解するにはどうすればよいですか?誰かが助けることを願っています。ありがとう。

〜編集

PCシステムを参照してください。

+0

あなたは心の中で任意の特定のプラットフォームを持っていますかDOSのリストがあること(又はAl)と

を斧をロードしますか? –

+1

答えは、ソフトウェアが固定構成のみをサポートしなければならない組み込みPCに対するアンサーと比較して、ソフトウェアが多数の異なる構成で動作することが期待される商品PCにとっては全く異なるものです。あなたはあなたの質問を絞り込む必要があります。 –

+0

申し訳ありません。私はPCを指している。 –

答えて

13

x86 PCでは、BIOSは通常、フラット/物理アドレス空間の割り当てを管理し、すべてがその領域内のいくつかの場所を使用します。したがって、BIOSは、各pcieスロットに出て誰かがいるかどうかを調べることによって、pcieデバイスを「列挙」します。 pcieデバイスには、どのくらいのアドレス空間とどのような種類(I/Oベースまたはメモリマップされているか)を示す必要がある標準構成レジスタがあります。ビオスは誰もが幸せになり、彼らが望むものを与えようとします。 WindowsやLinuxはこれらのデバイスやアドレスを再マップしません。彼らはBIOSによって与えられたものを受け取ります。すべてのpcieシステムがそのように動作するわけではありませんが、残念ながらこれはPCの動作です。だから、

あなたはナットやボルトに取得したい場合は、「PCIシステムアーキテクチャを」Googleの場合、私はそれのためのダウンロードリンクがあると思いこの本 http://www.mindshare.com/shop/?c=b&section=0A6B150A を取得

Linuxを実行した場合、その後見つけますlspciのソースには、いくつかのライブラリとサンプルがあります。これらのライブラリとサンプルは、あなたのシステムに含まれるデバイスとそのベースアドレスとメモリ範囲が何であるかを調べるために独自に作成して作成することができます。ほとんどの場合、ほかのオペレーティングシステムが何をしているのか、pcieホストコントローラを読んでどこに割り当てられているのかを見て、その情報をそのシステム上で実行されているソフトウェアに提供したいと思うでしょう。一度起動すると、プリンタはアドレス0xE0000000と次回の0xDB000000を取得し、環境にこれらのアドレスを与える仕組みを提供するか、環境アドレス空間内の固定アドレスにそれらを抽象化し、コードが物理的な/デバイスの実アドレス。

私は、あなたがx86システムのいくつかの味について話している、実モードという用語を使用することを前提としています。これは多分、味のあるPCでしょう。多分Mac。正確にはどのようにMacがそれを行うかわからない、彼らの列挙について十分に知っていない。ハードウェアはおそらく、南北橋とそれに続くいくつかのpcieブリッジや他のインテルのpcieチップが続くIntelプロセッサであり、最終的にはボード上にはんだ付けされたいくつかのpcieデバイス(ビデオチップなど)またはpcieスロットプラグインカード用。 linuxを実行してlspciを使用してベンダーと部品番号を調べると、intels(ベンダーID 8086)デバイスのマニュアル/データシートのほとんどがintelsのWebサイトにあり、lspciとその兄弟プログラムを使ってコントロールを調べることができますこれらのpcieコントローラのステータスレジスタを参照してください。これについて詳しく知りたい場合は、本当の興味がわかりません。

アドレスは標準でも固定でもなく、各BIOSはそのマザーボードモデルに対して半カスタムですが、pcieスペースのアドレス範囲はプロセッサ空間全体の1ギガバイト以下ですが、そのウィンドウは64ビットへの移行とより多くのスペースの必要性(遅い動き)。そのpcieウィンドウの場所はハードウェアに依存します(私がこれらのさまざまなIntelデバイスについて言及したデータシートを参照するか、またはnvidiaまたはamdシステムの場合は誰でも)BIOSが32ビットモードで実行するように設定されている場合、すべてのpcieデバイスが2ギガから4ギガマークの間のどこかにあるかもしれませんが、それはそれらのシステムのすべてが3ギガマークを使用しているわけではありません。 64ビットの場合、彼らはトップに近い傾向があると思いますが、マザーボードからマザーボードに変わります。それから、それはマザーボード特有のものと個々のコンピュータ特有のものであり、いくつかのデバイスはマザーボードにボルト止め/はんだ付けされ、毎回同じ順序で列挙されますが、スロットに差し込むカードは最初に答えた人に基づいて列挙されることがあります。20回起動して同じレイアウトを見て、もう一度起動し、列挙された順序が変更されたために2枚のカードが場所を入れ替える可能性があります。したがって、ビデオカードが常に同じ場所にあるように見えても、どこでもその番号をハードコードしてはいけません。常にpcieバスやテーブルをスキャンしたり、ライブラリ呼び出しを行って何がどこにあるかを調べます。再起動してから再試行するまで何かを見つけたら移動しないかもしれませんので、アクセスするたびに何かを見つけるために再スキャンを続ける必要はありません。

はい、あなたのBIOSをアップグレードまたはダウングレードすると、BIOSは単なるソフトウェアに過ぎず、BIOSの変更がpcie列挙と関係することがあります(一般的なビデオカードはマザーボード上で動作しませんリセットを変更したり、そのカードに働く機会を増やすためにBIOSを変更することができます)、システム全体の列挙が変更される可能性があります。

+0

ありがとう!それは多くのdwelchに役立ちます。 –

+0

この回答は良いですが、1つの重要な詳細は含まれていません:BIOSがI/OポートマッピングをCPUとどのくらい正確に通信していますか? –

0

1は、リアルモードのアセンブラプログラムを記述した場合

ISRのは、あなたが (割り込みサービスルーチン)の後にあるかもしれないものです。
;

これは、メモリの最初のセグメントに格納されている割り込みハンドラのアドレスのリストです。 (セグメント0000)。各割り込み番号は、割り込みが呼び出されたときにプログラムが分岐する4バイトのハンドラアドレス、セグメントとオフセットを に持っています。

アドレスは、ハンドラのアドレスが格納されているオフセットである割り込み番号に4を掛けて求めることができます。

ISRの位置は、0000:ax * 4と定義できます。DOS割り込みには、汎用番号21hがあります。だから、ここで中断...それは適度に大規模だ...

http://www.ctyme.com/intr/int-21.htm

関連する問題