0

linux-kernel で提供されている mamp() 機能を使用しようとしています。ユーザー空間で mmap() を呼び出すと、ユーザー空間プロセスの仮想メモリ領域をカーネル空間のメモリにマップしようとします。

カーネル内の mamp() の定義は、カーネル モジュールで行われ、ページにメモリを割り当てようとし、mmap システム コール中にマップします。このカーネル空間メモリのメモリ コンテンツは、このモジュールによって満たされる可能性があります。

私が聞きたい質問は、メモリ マッピングの後、ユーザー空間プロセスは追加のカーネル オーバーロードなしでマップされたメモリに直接アクセスできるため、read() のようなシステム コールはありませんが、メモリ (カーネル内に割り当てられている場合)スペースおよびカーネル空間にマップされている) には、カーネル空間内に割り当てられた他のメモリ (マップされていない) へのポインターが含まれているため、ユーザー空間プロセスは、ポインターであるマップされたメモリのコンテンツの助けを借りて、このマップされていないメモリにアクセスできます。このマップされていないメモリに。

4

3 に答える 3

1

いいえ、ユーザー空間は、マップされていないカーネル メモリを指すマップされたメモリ内のポインターを追跡できません。

于 2013-01-24T07:51:44.353 に答える
0

ユーザースペースプロセスは、マップされていないメモリにアクセスできません。カーネルは、そのメモリにアクセスすることを許可しません。mmapを介してマップされたメモリのその部分にのみアクセスできます。使用すると、remap_pfn_range関数を明示的に使用して、領域を再マッピングできると思います。

Linuxmmapのmanページから

ファイルの追加または削除された領域に対応するページで、マッピングの基になるファイルのサイズを変更した場合の影響は指定されていません。

于 2013-01-24T11:04:55.463 に答える
0

いいえ、できません。

ただし、目的がその場で mmaped 領域を変更することである場合は、いくつかのオプションがあります。

A. ユーザー空間では、既存のメモリ マッピングを拡張 (または縮小) する mremap を使用できます。

B. カーネル空間では、ドライバーに nopage() メソッドまたは remap_pfn_range を実装する必要がありますが、remap_pfn_range には制限があり、Linux は予約ページのみを提供し、get_free_page() によって割り当てられたアドレスなどの通常のアドレスを再マップすることさえできません。

于 2015-05-04T22:04:39.443 に答える