1

私はという名前のカーネルモジュールを持っておりmymodule、その中に私は持っています:

static struct file_operations my_mod_fops = {
        .owner = THIS_MODULE
        .write = my_write,
        .open = my_open,
        .unlocked_ioctl = my_ioctl,
        .read = my_read,

};

前の構造体にマップされたすべての関数がテストされ、問題ありません。charをグローバルに(そして利用可能な場合は静的に)宣言したいkernel_array[128]のですが、これを実行できるユーザースペースアプリケーションを作成したいと思います。

int main(){

char* ptr_to_kernel_arr = get_kernel_array_address();

for (int i=0 ; i<128;++i)
    *(ptr_to_kernel_arr+i) = i;

return 0;
}

私の難しさは次のとおりです。

  1. kernel_array[128]ユーザースペースアプリケーションから値を割り当てることができるように、アドレスを取得するにはどうすればよいですか?

  2. lsmodカーネルは、リストのどのモジュールが保持しているのかをどのように知るのですか?kernel_array

  3. mmapこのすべてのシナリオはどのように関連していますか?

私は第15章とはるかに多くの資料を読みましたが、それを行う方法を理解できませんでした。私がオンラインで見つけたすべての例は、ファイルを宣言し、それをカーネルとユーザースペースと共有します。

4

1 に答える 1

5

mmap関数を実装し、からそれを指す必要がありますfile_operations

これにより、ユーザースペースでデバイスを開きmmap、ファイル記述子を使用して呼び出し、アドレスを取得できるようになります。

mmapはページ解像度で動作することに注意してください。したがって、128バイトをマップすることはできませんが、4Kの倍数のみをマップできます。静的バッファーを含む4Kページをマップすることもできますが、そうすると、ユーザープロセスは、触れてはならないメモリを破壊する可能性があります。これは非常に推奨されません。

于 2012-08-08T09:06:14.873 に答える