2016-03-25 3 views
3

セグメンテーション。copy_from_userと私は「<a href="http://linux.die.net/lkmpg/x769.html" rel="nofollow">The Linux Kernel Module Programming Guide</a>」から段落を読んでいたし、私は次の段落に関連する疑問のカップルを持っている

copy_from_user又はGET_USER理由は、Linuxメモリ( Intelアーキテクチャに、それはいくつかの他のプロセッサの下でも異なっていてもよい) がセグメント化されることです。これは、ポインタは、それ自体で、あなたはそれを使用できるようにしているメモリセグメントを知る必要があり メモリ内 ユニークなロケーション、メモリ・セグメントにおける唯一の場所を参照し、しないことを意味します。 カーネルには1つのメモリセグメントがあり、 プロセスには1つのメモリセグメントがあります。

それは、Linuxの代わりに、セグメンテーションのページングを使用し、0xc0000000で、上の仮想アドレスは、カーネルマッピングを持っていることというのが私の理解ですが。

  1. 我々は古いカーネルに対応するためにcopy_from_userを使用していますか?
  2. は、現在のLinuxカーネルは、全くどのような方法でセグメンテーションを使用していますか?もしそうなら、どのように?
  3. (1)真でない場合、copy_from_userを使用する他の利点があるのですか?

答えて

2

うん。私はその説明も気に入らない。詳細は、技術的な意味で、本質的に正しい(もWhy does Linux on x86 use different segments for user processes and the kernel?を参照)が、あなたが言うように、そのカーネルコードが直接アクセスできるよう、Linuxは一般的にメモリをマップするので、私は実際になど、それはなぜcopy_from_userための良い説明だとは思いません存在する。

IMO、copy_from_user/copy_to_user(や友人)を使用するための理由は、物事の数は(危険性はに対して守らなければ)チェックすべきであり、それはこれらのチェックのすべてを置くことは理にかなっていることだけです一つの場所へ。ユーザー空間に出入りするデータをコピーする必要があるすべての場所で、これらすべてのチェックを再実装する必要はありません。特に、詳細がアーキテクチャによって異なる場合があります。

たとえば、そのメモリとの間でコピーする必要があるときにユーザースペースページが実際に存在しない可能性があります。そのため、ページフォールトを受け入れることができるコンテキストから呼び出すことが重要です眠る)。

また、ユーザ空間のデータポインタが実際にユーザ空間を指し、データ領域を指していること、およびコピーの長さが有効領域の終わりを超えて折り返されないことを確認する必要があります、など。

最後に、ユーザ空間が実際にでない場合、はカーネルと同じページマッピングを共有している可能性があります。以前は、32ビットx86用のLinuxパッチがありました。これは、ユーザー空間プロセスで使用できる完全な4Gの仮想アドレス空間を作成しました。その場合、カーネルコードはユーザスペースポインタが直接アクセス可能であると仮定することはできず、それらの関数は個々のユーザスペースページを1つずつマップする必要があるかもしれません。 (4GB/4GB Kernel VM Split参照)

関連する問題