システムのエラー検出および訂正機能をテストするために、データを任意の物理メモリ アドレスに書き込みたいと考えています。既存のカーネル モジュール内の 1 つのコード セグメントは、次のように記述されます。
 u32 addr;
 struct page *page;
 void *mem;
 pci_read_config_dword(priv->mc, I5100_MEMEINJADDRMAT, &addr);
 /* Inject error by writing to address */
 page = pfn_to_page(addr >> PAGE_SHIFT);
 mem = kmap(page) + (addr & (~PAGE_MASK));
 *((volatile u32*) (mem)) = 0x01010101;
 kunmap(page);
I5100_MEMEINJADDRMATi5100 メモリ コントローラ内のレジスタのレジスタ アドレスです。基本的に、メモリアドレスはそのレジスタで取得されます。ページの取得から始まり、ビットごとの操作を実行する残りのコードがわかりません。
私が理解している限り、pfn_to_page引数としてページ フレーム番号を渡すことにより、特定の物理アドレスを含むページを取得するために使用されます。そのaddr >> PAGE_SHIFT部分は、特定のアドレスから対応するページ フレーム番号に変換することです。PAGE_SHIFTでも、正しい使い方がわからない?で使用する正しいデータ型は何PAGE_SHIFTですか?
kmap()適切な仮想ページ アドレスを返し、オフセットを追加して、仮想メモリ アドレスへの正しいポインタを取得します。実際には何をし(addr & (~PAGE_MASK))ますか?
私の仕事は、エラー注入を物理アドレスに書き込むことですか? しかし、上記のコードは仮想アドレスに書き込むようです。他に方法はありますか?