首页 > 其他分享 >procfs文件系统

procfs文件系统

时间:2024-03-25 14:45:58浏览次数:29  
标签:struct my 文件系统 entry proc dir procfs

参考资料:https://blog.csdn.net/qq_29023095/article/details/123164953   用户空间和内核空间交互方式有:文件I/O,ioctl、procfs、debugfs、sysfs等   procfs 是 Linux 内核中的一个虚拟文件系统,通常挂载在 /proc 目录下,用于向用户空间提供内核状态信息和运行时数据。通过 procfs,用户可以访问和操作内核的各种参数、统计数据、进程信息等,而无需直接访问内核数据结构或重新编译内核。 以下是 procfs 的一些主要特点和用途:

  1. 提供内核信息:
procfs 提供了访问内核信息的接口,用户可以读取和修改内核运行时的参数、状态信息等。
  1. 进程信息:
在 /proc 目录下,每个数字命名的子目录对应一个正在运行的进程,其中包含该进程的信息,如状态、命令行参数、文件描述符等。
  1. 系统信息:
用户可以通过 procfs 获取系统的各种信息,比如 CPU 信息、内存使用情况、设备信息等。
  1. 动态调试:
procfs 提供了方便的接口,用于动态调试和跟踪内核和进程的状态,例如通过 /proc/sys/kernel 目录可以调整内核参数。
  1. 性能分析:
通过 procfs,用户可以获取系统性能数据,如 CPU 使用率、内存占用情况等,用于性能分析和优化。   proc常用API:
  1. create_proc_entry / proc_create:用于创建一个新的 procfs 文件。原型如下:
  • struct proc_dir_entry *create_proc_entry(const char *name, umode_t mode, struct proc_dir_entry *parent);
  • struct proc_dir_entry *proc_create(const char *name, umode_t mode, struct proc_dir_entry *parent, const struct file_operations *proc_fops);
  1. remove_proc_entry:用于删除一个已存在的 procfs 文件。
  • void remove_proc_entry(const char *name, struct proc_dir_entry *parent_dir);
  1. proc_mkdir:用于创建一个新的 procfs 目录。
  • struct proc_dir_entry *proc_mkdir(const char *name, struct proc_dir_entry *parent);
  1. proc_remove:用于删除一个已存在的 procfs 目录。
  • void proc_remove(struct proc_dir_entry *entry);
  1. PDE_DATA:宏定义,用于获取与 proc_dir_entry 结构关联的私有数据。
  • #define PDE_DATA(inode) PDE(inode)->data
  1. PDE:宏定义,用于获取指定 inode 对应的 proc_dir_entry 结构。
  • #define PDE(inode) (container_of((inode), struct proc_dir_entry, pde_inode))
  demo举例:
#include <linux/module.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/fs.h>

#define PROCFS_FILENAME "my_procfs"

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

static int my_proc_open(struct inode *inode, struct file *file) {
    return single_open(file, my_proc_show, NULL);
}

static ssize_t my_proc_write(struct file *file, const char __user *buffer, size_t count, loff_t *pos) {
    // 在这里实现写入操作的逻辑
    return -EINVAL; // 暂时返回无效参数错误
}

static const struct proc_ops my_proc_ops = {
    .proc_open = my_proc_open,
    .proc_read = seq_read,
    .proc_write = my_proc_write,
    .proc_lseek = seq_lseek,
    .proc_release = single_release,
};

static int __init my_module_init(void) {
    struct proc_dir_entry *entry;

    entry = proc_create(PROCFS_FILENAME, 0, NULL, &my_proc_ops);
    if (!entry) {
        pr_err("Failed to create /proc/%s\n", PROCFS_FILENAME);
        return -ENOMEM;
    }

    return 0;
}

static void __exit my_module_exit(void) {
    remove_proc_entry(PROCFS_FILENAME, NULL);
}

module_init(my_module_init);
module_exit(my_module_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("lethe1203");
MODULE_DESCRIPTION("procfs demo");

 

 

标签:struct,my,文件系统,entry,proc,dir,procfs
From: https://www.cnblogs.com/lethe1203/p/18094340

相关文章

  • 鲁班猫4-扩容文件系统
    上一篇讲了在板子上用Systemtap生成火焰图和如何用systemtap调试内核崩溃。之前讲的过程板子里缺的内容都是通过PC拷贝到板子上的。今天补充讲一下如何重新制作文件系统和整个升级包。你会说野火文档里有啊,你说了这句话,那就说明你还不知道“你所不知道的那些细节”。基本......
  • web前端之node读取文件夹名称及html文件的标题、文件系统、路径处理、模块、正则、isD
    MENU代码解析代码constfs=require('fs');constpath=require('path');//文件夹路径//C:\mssj\web\web-case\case\nodeJs\index.js//C:\mssj\web\web-case\case\nodeJs\index.html//C:\mssj\web\web-case\case\ajaxProgressMoni......
  • 根文件系统简介与BusyBox构建根文件系统
    参考资料:https://www.bilibili.com/video/BV12E411h71h?p=43&vd_source=432ba293ecfc949a4174ab91ccc526d6 根文件系统简介:根文件系统也成为rootfs,fatfs这类的文件系统属于Linux内核的一部分,属于软件代码如果没根文件系统,内核会出现kernelpanic。根文件系统就是一堆文件,比......
  • Linux内核有什么之块设备驱动有什么第六回 —— 邂逅的三个文件系统之二:实际文件系统(3
    接前一篇文章:Linux内核有什么之块设备驱动有什么第五回——邂逅的三个文件系统之二:实际文件系统(2)本文内容参考:34|块设备(上):如何建立代理商销售模式?-趣谈Linux操作系统-极客时间特此致谢!上回书以F2FS文件系统为例,开始分析块设备邂逅的第二个文件系统:实际文件系统。本回......
  • Linux mke2fs命令教程:创建和管理你的ext2/ext3/ext4文件系统(附案例详解和注意事项)
    Linuxmke2fs命令介绍mke2fs(makeext2filesystem)命令是用来创建ext2/ext3/ext4文件系统的。它通常在磁盘分区上创建文件系统,设备是对应设备的特殊文件(例如/dev/hdXX)。如果省略了块数,mke2fs会自动计算文件系统的大小。Linuxmke2fs命令适用的Linux版本mke2fs命令在所有......
  • parted划分大于2T文件系统
    场景:在CentOS系统中,添加了一块大于2T的数据盘     使用fdisk/dev/xxx的方式划分该盘时提示:Thesizeofthisdiskis2TiB(2199023255552bytes).DOSpartitiontableformatcannotbeusedondrivesforvolumeslargerthan2199023255040b......
  • fsutil,您可以执行多种文件系统操作,包括查询和设置文件系统特性,refsutil 是用于管理和
    fsutil/?fsutil:fsutil是一个用于执行各种文件系统相关操作的Windows命令行实用程序。通过fsutil,您可以执行多种文件系统操作,包括查询和设置文件系统特性。----支持的命令----8dot3name   8.3文件名管理behavior    控制文件系统行为dax    ......
  • ext4fs文件系统镜像制作
    参考博客:https://blog.csdn.net/RonnyJiang/article/details/54616714https://blog.csdn.net/Neutionwei/article/details/108437857 从零创建ext4fs镜像:创建文件系统镜像挂载目录sudomkdirfs创建初始大小的镜像文件,比如100M=bs*countddif=/dev/zeroof......
  • Linux 常用命令汇总(六):磁盘与文件系统命令
    一、磁盘与文件系统命令1.1 mount1.1.1介绍mount 是Linux和其他类Unix系统中的一个命令,用于挂载文件系统到指定的挂载点(目录)1.1.2使用方法mount[-ttype][-ooptions]device_namemount_point1.1.3参数详解device_name:要挂载的设备或文件系统的名称。mount_......
  • 在Linux中,在分布式环境中如何实现文件系统冗余和同步?(例如DRBD、GlusterFS)
    在Linux中,实现分布式环境下的文件系统冗余和同步可以通过使用专门的分布式文件系统技术和块级复制技术来完成。这里重点介绍两种方案:DRBD(DistributedReplicatedBlockDevice)和GlusterFS。1.DRBD(DistributedReplicatedBlockDevice)DRBD是一种块设备级别的存储复制......