システムのエラー検出および訂正機能をテストするために、データを任意の物理メモリ アドレスに書き込みたいと考えています。既存のカーネル モジュール内の 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_MEMEINJADDRMAT
i5100 メモリ コントローラ内のレジスタのレジスタ アドレスです。基本的に、メモリアドレスはそのレジスタで取得されます。ページの取得から始まり、ビットごとの操作を実行する残りのコードがわかりません。
私が理解している限り、pfn_to_page
引数としてページ フレーム番号を渡すことにより、特定の物理アドレスを含むページを取得するために使用されます。そのaddr >> PAGE_SHIFT
部分は、特定のアドレスから対応するページ フレーム番号に変換することです。PAGE_SHIFT
でも、正しい使い方がわからない?で使用する正しいデータ型は何PAGE_SHIFT
ですか?
kmap()
適切な仮想ページ アドレスを返し、オフセットを追加して、仮想メモリ アドレスへの正しいポインタを取得します。実際には何をし(addr & (~PAGE_MASK))
ますか?
私の仕事は、エラー注入を物理アドレスに書き込むことですか? しかし、上記のコードは仮想アドレスに書き込むようです。他に方法はありますか?