6

ディレクトリ配下にファイルを作成したい/proc/driver。「driver/MODULE_NAME」を明示的に使用するのではなく、マクロproc_root_driver(または提供されているもの) を使用したいと思います。私は使用しますcreate_proc_entry

struct proc_dir_entry *simpleproc_fops_entry;
simpleproc_fops_entry = create_proc_entry(MODULE_NAME, 0400, NULL /* proc_root_dir */);

グーグルで調べたところ、使用する提案が見つかりましproc_root_driverたが、使用するとエラーが発生します

この関数で宣言されていない proc_root_driver

また、proc_root_driverlinux/proc_fs.h では利用できません。

私はこのような構造を宣言しようとしました:

struct proc_dir_entry proc_root;
struct proc_dir_entry *proc_root_driver = &proc_root;

/proc/driverコンパイル エラーはなくなりましたが、ファイルがまたはの下に表示されませんでした/proc。でエントリを作成するにはどうすればよい/procですか?

4

3 に答える 3

4

proc_fs.h を見ると、proc_root_driver は次のように定義されています。

extern struct proc_dir_entry *proc_root_driver;

CONFIG_PROC_FS が有効になっている限り。カーネルを構成するときに CONFIG_PROC_FS を選択した場合は、自分で提案したように使用できるはずです。

#include <linux/proc_fs.h>
struct proc_dir_entry * procfile
procfile = create_proc_entry("myprocfile", 0400, proc_root_driver);

これが機能しない場合は、CONFIG_PROC_FS が設定されていることを確認してください。確認するには、-E オプションを使用してソース ファイルをコンパイルし、create_proc_entry 呼び出しの最後のパラメーターとして NULL 以外のパラメーターが含まれていることを確認します。NULL の場合、または呼び出しがまったく存在しない場合、CONFIG_PROC_FS は有効になっていません。

于 2009-03-02T17:05:49.507 に答える
3
/* proc entries for ayyaz */

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/string.h>
#include <linux/timer.h>
#include <linux/major.h>
#include <linux/fs.h>
#include <linux/err.h>
#include <linux/ioctl.h>
#include <linux/init.h>
#include <linux/proc_fs.h>

#ifdef CONFIG_PROC_FS

/*====================================================================*/
/* Support for /proc/ayyaz */

static struct proc_dir_entry *proc_ayyaz;

DEFINE_MUTEX(ayyaz_table_mutex);


/*====================================================================*/
/* Init code */
static int ayyaz_read_proc (char *page, char **start, off_t off, int count,
                          int *eof, void *data_unused)
{
        int len, l, i;
        off_t   begin = 0;

        mutex_lock(&ayyaz_table_mutex);

        len = sprintf(page, "hello ayyaz here\n");
        mutex_unlock(&ayyaz_table_mutex);
        if (off >= len+begin)
                return 0;
        *start = page + (off-begin);
        return ((count < begin+len-off) ? count : begin+len-off);
}


static int __init init_ayyaz(void)
{
        if ((proc_ayyaz = create_proc_entry( "ayyaz_maps", 0, NULL )))
                proc_ayyaz->read_proc = ayyaz_read_proc;
        return 0;
}

static void __exit cleanup_ayyaz(void)
{
        if (proc_ayyaz)
                remove_proc_entry( "ayyaz", NULL);
}

module_init(init_ayyaz);
module_exit(cleanup_ayyaz);
#else
#error "Please add CONFIG_PROC_FS=y in your .config "
#endif /* CONFIG_PROC_FS */


MODULE_LICENSE("proprietary");
MODULE_AUTHOR("Md.Ayyaz A Mulla  <md.ayyaz@gmail.com>");
MODULE_DESCRIPTION("proc files for ayyaz");

このドライバーをコンパイルします。コンパイルに成功すると、 が表示されます/proc/ayyaz

于 2010-03-12T11:37:48.957 に答える
0
#define PROC_ENTRY_NAME "driver/XX"
static struct proc_dir_entry *proc_XX;

static int XX_read_proc (char *page, char **start, off_t off, int count,
    int *eof, void *data_unused)
{
    return 0;
}
static int XX_write_proc (struct file *file, const char __user *buffer,
    unsigned long count, void *data)
{
    return 0;
}

static int __init XX_add_driver(void)
{
    if ((proc_flash = XX_entry(PROC_ENTRY_NAME, 0, NULL))) {
        proc_XX->read_proc = XX_read_proc;
        proc_XX->write_proc = XX_write_proc;
    }
...
}

static void __exit XX_remove(void)
{
    if (proc_flash)
        remove_proc_entry(PROC_ENTRY_NAME, NULL);

    return;
}

/proc/driver/XX次に、エントリを見つけることができます。

于 2015-10-20T13:00:49.290 に答える