問題タブ [ioremap]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - PCI物理アドレスの640k-1MBの領域にしか直接アクセスできないのはなぜですか?
http://www.mjmwired.net/kernel/Documentation/IO-mapping.txt
これが成り立つ理由を説明できますWe can directly access only the 640k-1MB area
か?
dictionary - ioremap_cache を使用しないのに PCD ビットが設定されるのはなぜですか?
x86 システムで ubuntu 12.10 32 ビットを使用しています。Linux/OSが使用できないように、デバイスとしてACPIテーブルを介して列挙および予約されている物理メモリ(約32MB、場合によってはそれ以上)があります。このメモリ デバイス用の Linux ドライバがあります。ドライバーは mmap() を実装しているため、プロセスが mmap() を呼び出すと、ドライバーはこの予約済みの物理メモリをユーザー空間にマップできます。また、VMA をセットアップし、vma->vmops を vm_operations_struct に向けて open close および fault 関数を実装する以外は、mmap で何もしないこともあります。アプリケーションが mmap されたメモリにアクセスすると、ページ フォールトが発生し、.fault 関数が呼び出されます。ここでは、vm_insert_pfn を使用して、仮想アドレスを必要な 32MB 内の任意の物理アドレスにマップします。
私が抱えている問題は次のとおりです。ドライバで、初期化中に ioremap_cache() を呼び出すと、このメモリ内のデータにアクセスするときに、アプリケーションから良好なキャッシュ パフォーマンスが得られます。ただし、ioremap_cache() を呼び出さないと、これらの物理ページにアクセスするとキャッシュ ミスが発生し、パフォーマンスが低下することがわかります。PTE を調べたところ、これらの仮想アドレス -> 物理変換の PCD ビットが設定されていることがわかりました。これは、これらの物理ページでのキャッシュが無効になっていることを意味します。vma_page_prot フィールドに _PAGE_CACHE_WB を設定しようとしましたが、新しい vma_page_prot で remap_pfn_range を使用しましたが、PCD ビットは PTE に設定されたままです。
このメモリに対してキャッシュが有効になっていることを確認する方法について、誰か知っている人はいますか? 32 MB に対して ioremap_cache() を使用したくない理由は、32 ビット システムではカーネル仮想アドレスが制限されており、それらを保持したくないためです。
linux - ioremap() メモリからは 0 しか読み取れません
SPI 経由でデバイスと通信する Linux 用の単純なドライバーを開発しています。request_mem_region と ioremap を使用した後、値を書き込んだ後でも、返されたアドレスから読み取ることができるのはすべて 0 です。オフセット 0 のアドレスは、SPI コントローラー (Xilinx Zynq SoC) の制御レジスターである必要があります。コントロール レジスタは、ブート プロセス中に初期値が設定されます。
コード:
モジュールを挿入したときの出力は次のとおりです
。Driver init complete. アドレス 0xE08C2000 にマッピング
0
助けてくれてありがとう。
linux - MMUレスシステムで必要なカーネルドライバ、ioremap?
そのため、私はカーネル ドライバーに関してまったくの初心者であり、ioremap 関数について質問があります。
ARM Cortex-M3 と FPGA ファブリックを搭載した SoC 上のカスタム VHDL モジュールで定義されたいくつかのレジスタにアクセスするためのドライバーを作成しています。例を見て、ioremap を使用する必要があると考えましたが、Cortex-M3 には MMU がないため、次の例のようにポイントがわかりません。
ドライバーを insmod すると、これが返されます。
これによると、代わりに物理アドレスを読み取ったほうがよいでしょう。それとも、それは悪い考えであり、より良い方法でレジスタをいじる必要がありますか?
linux-kernel - ioremap に割り当てられた領域のアライメントがこれほど大きいのはなぜですか?
ioremap()
4M リージョンの呼び出しに失敗するコードがあります。理由をデバッグしようとすると、それを呼び出すioremap
と、(割り当てたい領域のサイズに応じて) 非常に大きなアライメントで連続したアドレスを割り当てようとすることがわかりました。この配置を計算するコードは__get_vm_area_node()
関数 ( mm/vmalloc.c
) にあり、次のようになります。
ARM では、IOREMAP_MAX_ORDER
として定義されてい23
ます。これは、私の場合、ioremap
4M の継続的なアドレス指定がvmalloc
エリア内で必要になるだけでなく、4M に揃える必要があることを意味します。
この配置が必要な理由に関する情報を見つけることができませんでした。この変更を導入するコミットを確認するために git Blame を使用してみましたが、コードが git history よりも古いようで、何も見つかりませんでした。