10

我从这个 URL 复制并粘贴代码,用于使用内核模块创建和读取/写入 proc 文件,并得到 proc_root 未声明的错误。这个相同的例子在几个网站上,所以我认为它有效。任何想法为什么我会收到此错误?我的makefile是否需要不同的东西。下面也是我的makefile:

创建基本 proc 文件的示例代码(直接复制和粘贴以完成初始测试): http ://tldp.org/LDP/lkmpg/2.6/html/lkmpg.html#AEN769

我正在使用的Makefile :

obj-m    := counter.o

KDIR    := /MY/LINUX/SRC

PWD    := $(shell pwd)

default:
 $(MAKE) ARCH=um -C $(KDIR) SUBDIRS=$(PWD) modules
4

3 回答 3

17

这个例子已经过时了。在当前内核 API 下,传递NULLprocfs 的根目录。

此外,create_proc_entry您应该使用proc_create()适当的const struct file_operations *.

于 2010-03-28T03:36:02.673 回答
9

在 proc 文件系统中创建条目的界面发生了变化。您可以查看http://pointer-overloading.blogspot.in/2013/09/linux-creating-entry-in-proc-file.html了解详情

这是一个带有新接口的“hello_proc”示例:

#include <linux/module.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>

static int hello_proc_show(struct seq_file *m, void *v) {
  seq_printf(m, "Hello proc!\n");
  return 0;
}

static int hello_proc_open(struct inode *inode, struct  file *file) {
  return single_open(file, hello_proc_show, NULL);
}

static const struct file_operations hello_proc_fops = {
  .owner = THIS_MODULE,
  .open = hello_proc_open,
  .read = seq_read,
  .llseek = seq_lseek,
  .release = single_release,
};

static int __init hello_proc_init(void) {
  proc_create("hello_proc", 0, NULL, &hello_proc_fops);
  return 0;
}

static void __exit hello_proc_exit(void) {
  remove_proc_entry("hello_proc", NULL);
}

MODULE_LICENSE("GPL");
module_init(hello_proc_init);
module_exit(hello_proc_exit);
于 2013-09-25T09:46:51.930 回答
0

更新

上述接受的答案可能对您有用。它不再适用于 GNU/Linux 5.6.y 及更高版本!从 5.6 开始,proc_create()将接受proc_ops作为参数而不是file_operations. 字段前面有,proc_并且没有owner字段proc_ops在此处查看)。

作为旁注,程序员希望有可移植的代码。在这种情况下,相同的代码应该适用于不同版本的 GNU/Linux。LINUX_VERSION_CODE因此,您可能KERNEL_VERSION(5,6,0)还需要使用linux/version.h. 例如,

#include <linux/version.h>

...
...

#if (LINUX_VERSION_CODE < KERNEL_VERSION(5,6,0))
static struct file_operations
#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5,6,0))
static struct proc_ops
#endif
proc_file_ops = {
#if (LINUX_VERSION_CODE < KERNEL_VERSION(5,6,0))
 owner : THIS_MODULE,
 read : proc_file_read,
 write : proc_file_write
#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5,6,0))
 proc_read : proc_file_read,
 proc_write : proc_file_write
#endif
};

...
...

AFAIK 除了这些,我没有注意到任何其他重大变化:)

于 2021-04-19T17:02:17.540 回答