2

http://www.mjmwired.net/kernel/Documentation/IO-mapping.txt

153  - remapping and writing:
154     /*
155      * remap framebuffer PCI memory area at 0xFC000000,
156      * size 1MB, so that we can access it: We can directly
157      * access only the 640k-1MB area, so anything else
158      * has to be remapped.
159      */
160     void __iomem *baseptr = ioremap(0xFC000000, 1024*1024);
161 
162     /* write a 'A' to the offset 10 of the area */
163     writeb('A',baseptr+10);
164 
165     /* unmap when we unload the driver */
166     iounmap(baseptr);
167 

これが成り立つ理由を説明できますWe can directly access only the 640k-1MB areaか?

4

2 に答える 2

7

簡単な答え:Linusがそうすることに決めたからです。

長い答え:実際には、ドライバーがサインアップしなくてもそのエリアにアクセスできるのは間違っていると思います。しかし、それを気にしないでください。

昔は、1990年代のある時期にPCIは存在せず、グラフィックカードやネットワークカードなどはISAバスと呼ばれるものを使用していました。カードに情報を要求したり、ハードウェアアドレスがどこにあるべきかに関してカードに設定したりできるような優れた機能はありませんでした。すべてのISAメモリはA0000(640K)とFFFFF(1MB-1)の間にあります。したがって、Linuxの初期には、これはグラフィックスなどが存在する場所であり、カーネルはこれらのものがどこにあるかを実際に知ることができませんでした。いずれにせよ、より良いハードウェアの進化のおかげで、最近はこの種のハードウェアはありません。いい厄介払い!

互換性の理由から、このメモリスペースは起動時に引き続き使用されます。これは、ドライバをロードしてPCIハードウェアをセットアップするまで、「レガシーモード」で動作するため、マシン上で非常に古いDOSやその他の古いソフトウェアを実行しなくても実行できるためです。それは奇妙な振る舞いをします。

ただし、たとえばグラフィックカードを構成すると、バスアドレス空間(物理アドレス)のどこにあるかを世界に知らせるために、BAR(バスアドレス範囲)が設定されます。ioremapは、物理アドレスをカーネルで使用できる仮想アドレス(この例ではbaseptr)にマップします。[最近、ioremapから派生したコードに取り組んでいるので、ioremapについてさらに詳しく説明することができます]。

他の答えが言うように、BARが何であるか(PCI構成スペースの一部)をデバイスに尋ねてから、そのメモリを仮想アドレスにマップする必要があります。どこで使用されているかを確認できますlspci -v|grep Memory(もちろん、使用するlspci -vと、どのデバイスにどのメモリがあるかなど、より多くの情報が得られます)。これらのアドレスは物理アドレスです。

于 2012-12-25T12:32:13.230 に答える
1

私の知る限り、あなたが見ているコメントは間違っており、「0x000A0000から0x000BFFFF」(または「640KiBから768KiB」)である必要があります。

これは、80x86 PCシステム(2つの小さな64 KiBウィンドウとバンク切り替えのいずれかを介して潜在的に大量のビデオディスプレイメモリにアクセスする必要がある)のレガシーVGAディスプレイメモリ領域に対応し、「リニアフレームバッファ」技術に取って代わられました。これにより、ビデオディスプレイメモリ全体に直接アクセスできるようになりました。

コメントが間違っていることに加えて、コードが誤ってガイドされており、パラメータ0xFC000000(「メモリのバスアドレス」)は誰かが作成した単なる乱数であると思います。

基本的に、ここで私が言っているのは、この例はIOマッピングの使用例であるということです。また、どの(物理、仮想、またはバス)アドレスが、どのような状況でも、どのデバイスの特定のアーキテクチャでも有効であるかを判断するために使用することを意図したものではありません。

于 2012-12-25T12:19:03.563 に答える