1

カーネルからいくつかの情報を読み取るためにprocファイルを追加しようとしています。しかしcat、procファイルから情報を取得しようとすると、「不正なアドレス」エラーが発生します。

int proc_read(char *buffer, char **starter, off_t off, int count, 
              int *eof, void *data)
{

    if (off > 0)
    {
        *eof = 1;
        return 0;
    }

    if (copy_to_user(buffer, info_str, info_str_size))
    {
        return -EFAULT;
    }

    return info_str_size;
} 

の後insmodに、を使用catしてprocファイルを読み取りますが、不正なアドレスエラーが発生します。info_strグローバルchar配列です。

4

1 に答える 1

3

あなたの問題への答えは驚くほど簡単です。proc_read関数では、使用する必要はありません。バッファはカーネルメモリに存在するためcopy_to_user、単純なもので十分です。memcpyただし、関数を作成する場合はproc_write、を使用する必要がありますcopy_from_user。この場合、バッファはユーザーメモリに存在するためです。

EOF1つのヒントは、おそらく成功の合図もする必要があるということです。これにより、関数を2回呼び出す必要がなくなります。

以下で十分です。

int proc_read(char *buffer, char **starter, off_t off, int count,
              int *eof, void *data)
{
    if (off > 0)
    {
        *eof = 1;
        return 0;
    }

    memcpy(buffer, info_str, info_str_size);
    *eof = 1;
    return info_str_size;
}

また、ファイルエントリを書き込むこの方法はかなり古いため、おそらく避ける必要があることに注意してください。seq_fileインターフェースはエラーが発生しにくくなっています(そして、ますます少なくなるようなポケットベルで動作します)。興味のある方はhttp://lwn.net/Articles/22355/をご覧ください。

于 2012-09-10T08:04:08.367 に答える