一. 问题引入
linux5.10生成在/proc目录下的文件时,利用cat读取文件,提示:
operation not permitted
该报错是错误码:EPERM,不允许操作
二. 问题原因
发现是在移植内核代码时,未对proc接口进行适配。
linux-5.6引入结构体struct proc_ops,用以替代struct file_operations在/proc下进行文件操作。
proc_create中的proc_ops结构体类型定义改变,导致不匹配
//struct proc_dir_entry *proc_create(const char *name, umode_t mode, struct proc_dir_entry *parent, const struct file_operations *proc_fops);
struct proc_dir_entry *proc_create(const char *name, umode_t mode, struct proc_dir_entry *parent, const struct proc_ops *proc_ops);
struct proc_ops定义:
//proc_fs.h
struct proc_ops {
int (*proc_open)(struct inode *, struct file *);
ssize_t (*proc_read)(struct file *, char __user *, size_t, loff_t *);
ssize_t (*proc_write)(struct file *, const char __user *, size_t, loff_t *);
loff_t (*proc_lseek)(struct file *, loff_t, int);
int (*proc_release)(struct inode *, struct file *);
__poll_t (*proc_poll)(struct file *, struct poll_table_struct *);
long (*proc_ioctl)(struct file *, unsigned int, unsigned long);
#ifdef CONFIG_COMPAT
long (*proc_compat_ioctl)(struct file *, unsigned int, unsigned long);
#endif
int (*proc_mmap)(struct file *, struct vm_area_struct *);
unsigned long (*proc_get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
};
引入原因,见提交:proc: decouple proc from VFS with “struct proc_ops”
贴一下提交的翻译,有兴趣的可以自己了解:
目前核心 /proc 代码使用“结构file_operations”作为自定义钩子,但是,VFS 不直接调用它们。 每次 VFS 扩展file_operations钩子集时,/proc 代码都会无缘无故地膨胀。
引入“struct proc_ops”,它只包含 /proc 允许调用的那些钩子(打开、释放、读取、写入、ioctl、mmap、poll)。 它也不包含模块指针。
三. 解决方法
将需要生成在/proc下的文件的结构体用struct proc_ops代替struct file_operations,例如:文章来源:https://www.toymoban.com/news/detail-716910.html
//static const struct file_operations alignment_proc_fops = {
// .open = alignment_proc_open,
// .read = seq_read,
// .llseek = seq_lseek,
// .release = single_release,
// .write = alignment_proc_write,
//};
static const struct proc_ops alignment_proc_ops = {
.proc_open = alignment_proc_open,
.proc_read = seq_read,
.proc_lseek = seq_lseek,
.proc_release = single_release,
.proc_write = alignment_proc_write,
};
参考:【Linux】Ubuntu20.04 内核5.11.8 用proc_create和seq_file创建proc文件文章来源地址https://www.toymoban.com/news/detail-716910.html
到了这里,关于【Linux】linux5.6引入struct proc_ops,用以替代struct file_operations在/proc下进行文件操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!