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:欢迎使用堆栈溢出:)。我擅自修改了代码格式——代码示例需要缩进(工具栏上有一个按钮可以自动完成缩进)。