Linux kernel 如何在/proc/driver下创建proc条目?

Linux kernel 如何在/proc/driver下创建proc条目?,linux-kernel,kernel-module,procfs,Linux Kernel,Kernel Module,Procfs,我想在/proc/driver目录下创建一个文件。我想使用一个宏,比如proc\u root\u driver(或其他提供的东西),而不是显式地使用“driver/MODULE\u NAME”。我使用创建过程条目: struct proc_dir_entry *simpleproc_fops_entry; simpleproc_fops_entry = create_proc_entry(MODULE_NAME, 0400, NULL /* proc_root_dir */); 在谷歌搜索之后

我想在
/proc/driver
目录下创建一个文件。我想使用一个宏,比如
proc\u root\u driver
(或其他提供的东西),而不是显式地使用“driver/MODULE\u NAME”。我使用
创建过程条目

struct proc_dir_entry *simpleproc_fops_entry;
simpleproc_fops_entry = create_proc_entry(MODULE_NAME, 0400, NULL /* proc_root_dir */);
在谷歌搜索之后,我发现了使用
proc\u root\u驱动程序的建议,但当我使用它时,我发现了错误

此函数中未声明的proc\u root\u驱动程序

而且,
proc\u root\u驱动程序
在linux/proc\u fs.h中不可用

我尝试过这样声明结构:

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

编译错误消失了,但文件没有出现在
/proc/driver
/proc
下。如何在
/proc
中创建条目?

查看proc\u fs.h,proc\u root\u驱动程序定义为:

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);
#包括
结构proc\u dir\u条目*procfile
procfile=create_proc_条目(“myprocfile”,0400,proc_root_驱动程序);
如果这不起作用,请检查是否设置了CONFIG\u PROC\u FS。为了确保这一点,您可以使用-E选项编译源文件,并检查create\u proc\u entry调用是否包含非NULL参数作为最后一个参数。如果为空,或者根本不存在调用,则不会启用CONFIG_PROC_FS。

/*ayyaz的PROC条目*/
/* 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");
#包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #ifdef配置程序 /*====================================================================*/ /*支持/proc/ayyaz*/ 静态结构proc_dir_条目*proc_ayyaz; 定义_互斥体(ayyaz_表_互斥体); /*====================================================================*/ /*初始化代码*/ 静态int-ayyaz_-read_-proc(字符*页,字符**开始,关闭,整数计数, int*eof,void*data_未使用) { 内伦,我,我; off\u t begin=0; 互斥锁(&ayyaz_表互斥锁); len=sprintf(第页,“你好,这里是ayyaz\n”); 互斥锁解锁(&ayyaz_表互斥锁); 如果(关闭>=镜头+开始) 返回0; *开始=页面+(关闭开始); 返回((计数<开始+镜头关闭)?计数:开始+镜头关闭); } 静态int_uuuinit_uayyaz(void) { if((proc_ayyaz=create_proc_条目(“ayyaz映射”,0,NULL))) proc_ayyaz->read_proc=ayyaz_read_proc; 返回0; } 静态无效\uuuu退出清理\uuAyyaz(无效) { 如果(proc_ayyaz) 删除进程条目(“ayyaz”,NULL); } 模块_init(init_ayyaz); 模块_出口(清理_ayyaz); #否则 #错误“请在.CONFIG中添加CONFIG\u PROC\u FS=y” #endif/*配置程序*/ 模块许可证(“专有”); 模块作者(“Md.Ayyaz A Mulla”); 模块描述(“ayyaz程序文件”);
编译这个驱动程序。如果编译成功,您将看到
/proc/ayyaz

#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
条目。

@Md.Ayyaz:欢迎使用堆栈溢出:)。我擅自修改了代码格式——代码示例需要缩进(工具栏上有一个按钮可以自动完成缩进)。