0

導入演習として、新しいシステム コールを実装しました。バッファを取り込み、そのバッファを printk するだけです。後で、copy_from_user を使用するのが正しい方法であることを知りました。

これはアドレスを検証するための単なる予防措置ですか、それともシステム コールがエラー (ページ フォールト?) を引き起こしているのでしょうか?

それが単なる予防措置である場合、それは何から保護していますか?

ありがとう!

4

1 に答える 1

7

いくつかの理由があります。

  1. 一部のアーキテクチャでは、セグメント化されたメモリが採用されており、ユーザー メモリ用に別のセグメントがあります。その場合、copy_from_user実際に正しいメモリアドレスを取得することが不可欠です。
  2. カーネルは、(ほぼ定義上) 多くの特権情報を含むすべてにアクセスできます。使用しcopy_from_userないと、ユーザーがカーネル アドレスを渡した場合に情報漏えいが発生する可能性があります。さらに悪いことに、ユーザー提供のバッファーに を使用せずに書き込みを行うcopy_to_userと、ユーザーがカーネル メモリを上書きする可能性があります。
  3. ユーザーが不正なポインターを渡すだけでカーネル モジュールをクラッシュさせないようにしたいと考えています。たとえば、システム コール ハンドラが不正なユーザ ポインタに応答してcopy_from_user戻ることができるように、フォルトから保護します。EFAULT
于 2012-09-17T03:58:04.513 に答える