19

remap_pfn_range関数 (mmapドライバーの呼び出しで使用) を使用して、カーネル メモリをユーザー空間にマップできます。それはどのように行われますか?誰かが正確な手順を説明できますか? カーネル モードは特権モード (PM) ですが、ユーザー空間は非特権モード (NPM) です。PM では CPU はすべてのメモリにアクセスできますが、NPM では一部のメモリが制限されており、CPU からはアクセスできません。がremap_pfn_range呼び出されると、PM のみに制限されていたメモリの範囲がユーザー空間にアクセスできるようになったのはなぜですか?

remap_pfn_rangeコードを見るとpgprot_t struct. これはプロテクション マッピング関連の構造体です。プロテクション マッピングとは 上記の質問に対する答えですか?

4

2 に答える 2

18

本当に簡単です。カーネルメモリには(通常)、「このページテーブルエントリは、CPUがカーネルモードにある間のみ有効です」というアーキテクチャ固有のビットを持つページテーブルエントリがあります。

remap_pfn_range が行うことは、そのビットが設定されていない同じ物理メモリ ページへの異なる仮想アドレスを持つ、別のページ テーブル エントリを作成することです。

通常、それは悪い考えです:-)

于 2012-01-09T12:41:25.437 に答える
10

メカニズムのコアは、ページ テーブル MMU です。

関連画像1 http://windowsitpro.com/content/content/3686/figure_01.gif

またはこれ:

関連画像

上の図はどちらも x86 ハードウェア メモリ MMU の特性であり、Linux カーネルとは関係ありません。

VMA がプロセスの task_struct にどのようにリンクされているかを以下に説明します。

関連画像 http://image9.360doc.com/DownloadImg/2010/05/0320/3083800_2.gif

関連画像
(出典:slideplayer.com

ここで関数自体を調べます。

http://lxr.free-electrons.com/source/mm/memory.c#L1756

以下に示すように、物理メモリ内のデータは、カーネルの PTE を介してカーネルからアクセスできます。

ページ保護フラグ Linux カーネルの画像結果
(出典: tldp.org )

ただし、remap_pfn_range() を呼び出した後、PTE (既存のカーネル メモリ用であるが、それにアクセスするためにユーザー空間で使用される) が派生します (異なるページ保護フラグを使用)。プロセスの VMA メモリは、この PTE を使用して同じメモリにアクセスするように更新されるため、コピーによるメモリの浪費が最小限に抑えられます。ただし、カーネルとユーザー空間の PTE には異なる属性があります。これは物理メモリへのアクセスを制御するために使用され、VMA はプロセス レベルでも属性を指定します。

vma->vm_flags |= VM_IO | VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP;

于 2012-01-31T07:23:25.350 に答える