知っているのは、copy_to_user
/copy_from_user
、get_user
/put_user
の機能です。Linuxカーネルからユーザー空間のメモリにアクセスするには?
私の質問は、ユーザー空間のアドレス/ポインタが与えられていると、一般的にカーネルのアドレスが指すデータにどのようにアクセスできますか?
私が最初に私が含まれているページが物理メモリ(代わりのディスクで)であるべきことを確認する必要があることを想像することができます。
次のステップは何ですか? *p
を使用することができます。p
は、データを参照するために、いくつかのユーザー空間データを指すポインターですか?
または、最初にkmap
を呼び出して、含まれている物理ページフレームをカーネルの仮想アドレス空間にマップする必要がありますか?どうして?
...私はユーザ空間のアドレスが実際に有効であり、上記の条件のいずれも適用されない場合は何が起こるかを知って自分自身が好奇心、と述べました良い点とコードのロジックがいいです。しかし、仮想アドレスを指定すると、物理ページをすばやく見つけるのに役立つハッシュテーブルや同様のデータ構造があると思います。欠陥があります:kaddr = __va(paddr);この行は、paddrが低メモリに常駐する場合にのみ有効です。 – Infinite
paddrは物理アドレスを意味するので、常にメモリに存在します。 kaddrはカーネルアドレスを意味します。 Linuxのカーネル定義では '#define __va(x)((void *)((unsigned long)(x)+ PAGE_OFFSET))'が定義されています。カーネルアドレスのメモリマッピングは複雑ではなく、ちょうどPAGE_OFFSETです。 (x86モードで0xC0000000である必要があります)。 アドレスを取得する他の方法があります。ユーザー空間アプリケーションは、カーネルアドレスに/ proc//pagemapでアクセスしてページ情報を取得できます。 PFNを取得できる場合は、カーネルアドレスも取得できます。 –
richliu