【Linux】linux5.6引入struct proc_ops,用以替代struct file_operations在/proc下进行文件操作

这篇具有很好参考价值的文章主要介绍了【Linux】linux5.6引入struct proc_ops,用以替代struct file_operations在/proc下进行文件操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一. 问题引入

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,例如:

//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模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux5.10 NoSQL 之 Redis配置与优化及数据类型

    第四章 LINUX NOSQL 之 Redis配置与优化及数据类型 一、关系数据库与非关系型数据库 1.关系型数据库 关系型数据库是一个结构化的数据库,创建在关系模型(二维表格模型)基础上,一般面向于记录。 SQL 语句(标准数据查询语言)就是一种基于关系型数据库的语言,用于执行

    2024年02月11日
    浏览(37)
  • 【Linux】proc文件系统

    【Linux】proc文件系统 前言  一、proc文件系统简介 1.1 proc文件系统是什么? 1.2 proc文件系统的作用和特点 1.3 proc文件系统提供的信息 二、proc文件系统常用节点详述 2.1 /proc/cpuinfo  2.2 /proc/meminfo 2.3 /proc/kallsyms 2.4 /proc/interrupts 2.5 /proc/loadavg 三、总结 重要的环节:带着问题不断前

    2024年02月06日
    浏览(31)
  • linux proc系统

    Linux的/proc文件系统是一个特殊的文件系统,它提供了访问内核和进程信息的接口。它不是一个存储在硬盘上的文件系统,而是一个虚拟的文件系统,存在于内存中,用于向用户和进程展示有关系统状态和进程信息的数据。 /proc目录下的文件和子目录提供了对系统状态和进程信

    2024年02月12日
    浏览(28)
  • Linux /proc和/sys

    在 Linux 系统中,/proc和/sys都是特殊的文件系统,数据内容是存放在内存中,这两个目录文件中的内容由内核动态生成,查看这个文件中的内容,实际上就是查询内核的某些状态或信息。 可以将这两个目录文件理解为虚拟的目录,即在硬盘上不存在。 proc 是process(进程)的缩

    2024年02月08日
    浏览(32)
  • 一文搞懂linux的proc文件

      目录 proc文件夹是干嘛用? proc下都有什么系统信息?  /proc/bus /proc/buddyinfo /proc/cgroups        /proc/cmdline /proc/consoles /proc/cpuinfo /proc/crypto /proc/devices /proc/diskstats /proc/execdomains /proc/fb /proc/filesystems        /proc/fs /proc/inerrupts /proc/iomem /proc/ioports /proc/irq /proc/kallsyms /proc/keys /pr

    2024年02月03日
    浏览(72)
  • Intel(R) Ethernet Controller I225-V linux5.4支持

    我们新板卡使用了Intel(R) Ethernet Controller I225-V网卡,使用的内核版本是linux-5.4.0,但是加载igc驱动后,报错 igc: probe of 0000:01:00.0 failed with error -2 分析igc驱动源码后,发现读出来的phy id是0x67C9DCC0,驱动源码中igc_init_phy_params_base函数发现,并不支持这个PHY ID,代码如下: 经过修改

    2024年02月02日
    浏览(29)
  • Linux查看进程运行输出(/proc/<pid>/fd)

    输入ps或ps -ef root@TinaLinux:/proc/631/fd# ps PID   USER     TIME   COMMAND     1 root       0:03 /sbin/procd ...........   631 root       0:06 ./rt_agent   694 root       0:00 [kworker/2:2]   771 root       0:23 /home/upg/fupg 要查看的进程id为631。 切换到/proc/pid/fd下,如 root@TinaLinux:~# cd /proc/631/fd root@TinaLin

    2024年02月11日
    浏览(42)
  • linux下sys目录与proc目录的作用

    在Linux系统中,/sys目录是一个特殊的虚拟文件系统(sysfs),用于提供对内核和设备的运行时信息的访问。它是在内核中运行的驱动程序和子系统的接口,可以用于获取和配置系统的硬件和内核信息。 以下是/sys目录的一些主要作用: 设备和驱动程序信息:/sys目录提供了与设

    2024年02月04日
    浏览(49)
  • RK3399驱动开发 | 15 - RTC实时时钟芯片HYM8563S调试(基于linux5.4.32内核)

    Linux内核中使用RTC设备来提供硬件时间,为了兼容各种各样的RTC硬件,Linux内核提供了R

    2024年02月09日
    浏览(34)
  • 在嵌入式Linux中使用C++读取 /proc/meminfo 文件来获取系统内存大小

    在嵌入式Linux中,可以使用C++编程语言通过读取  /proc/meminfo  文件来获取系统内存大小。以下是一个示例代码片段: 上述代码打开  /proc/meminfo  文件并逐行读取其中的内容。当找到以 \\\"MemTotal:\\\" 开头的行时,提取出内存大小信息并去除空格和单位(KB),然后将其转换为无符

    2024年02月10日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包