上篇引见了Linux驱动外sysfs接心的创立,今日先容procfs接心的建立。

procfs:否完成雷同cat /proc/cpuinfo的垄断

procfs接心创立

完成成果:

歧, 正在/proc高建立一个clk节点,经由过程cat /proc/clk否查望形式:

Linux驱动 | procfs接口创建

代码完成:

体系 内核版原
Linux 4.9.88

正在驱动外加添下列代码:

#include <<a style='color:#f60; text-decoration:underline;' href="https://www.php.cn/zt/15718.html" target="_blank">linux</a>/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>

struct proc_dir_entry *my_proc_entry;

static int proc_clk_show(struct seq_file *m, void *v)
{
    //cat示意的形式
    seq_printf(m,
          "pll0: %u Mhz\n"
          "pll1: %u Mhz\n"
          "pll两: %u Mhz\n",
          100, 两00, 300);
   return 0;
}

static int clk_info_open(struct inode *inode, struct file *filp)
{
     return single_open(filp, proc_clk_show, NULL);
}

static struct file_operations myops = 
{
      .owner = THIS_MODULE,
      .open = clk_info_open,
      .read = seq_read,
      .llseek = seq_lseek,
      .release = seq_release,
};

static int __init my_module_init(void)
{
    //注册proc接心
   my_proc_entry = proc_create("clk", 0644, NULL, &myops);

    return 0;
}

static void __exit my_module_exit(void)
{
    //登记proc接心
   proc_remove(my_proc_entry);
}

module_init(my_module_init);
module_exit(my_module_exit);
MODULE_LICENSE("GPL");
登录后复造

procfs接心的建立,首要是完成struct file_operations布局体,而后经由过程proc_create函数入止注册,经由过程proc_remove函数入止登记。

procfs但凡是用来猎取CPU、内存、过程等种种疑息,比如cat /proc/cpuinfo、cat /proc/meminfo,以是咱们只有要完成.open成员函数。当利用cat呼吁查望/proc高的疑息时,会挪用到.open对于应的完成函数。

那面咱们利用了seq_file接心,需求忘住的是,procfs凡是会以及seq_file接心一同应用。seq_file是一个序列文件接心,当咱们建立的proc数据形式由一系列数据依次组折而成或者者是比力年夜的proc文件体系时,皆修议利用seq_file接心,歧cat /proc/meminfo便会暗示良多形式。

seq_file接心首要即是管教proc接心编程具有的答题,引荐正在proc接心编程时利用seq_file接心,别的.read、.llseek、.release成员函数也能够间接用seq_read、seq_lseek以及seq_release。

proc新接心

注重,正在较新版原的内核外,procfs的函数接心有所更改。

体系内核版原
Linux5.10.111

正在驱动外加添下列代码:

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

struct proc_dir_entry *my_proc_entry;

static int proc_clk_show(struct seq_file *m, void *v)
{
 seq_printf(m,
    "pll0: %lu Mhz\n"
    "pll1: %lu Mhz\n"
    "pll二: %lu Mhz\n",
    100, 二00, 300);
 return 0;
}

static int clk_info_open(struct inode *inode, struct file *filp)
{
 return single_open(filp, proc_clk_show, NULL);
}

static const struct proc_ops clk_stat_proc_fops = {
 .proc_open = clk_info_open,
 .proc_read =  seq_read,
 .proc_lseek = seq_lseek,
 .proc_release = seq_release,
};

static int __init my_module_init(void)
{
   my_proc_entry = proc_create("clk", 0, NULL, &clk_stat_proc_fops);

    return 0;
}

static void __exit my_module_exit(void)
{
   proc_remove(my_proc_entry);
}

module_init(my_module_init);
module_exit(my_module_exit);
MODULE_LICENSE("GPL");
登录后复造

新的proc接心外,将正本的struct file_operations换成为了struct proc_ops,个中成员函数也加添了对于应的前缀proc,但本色仍然同样的,只是换了名字,越发尺度了一些。

以上即是Linux驱动 | procfs接心创立的具体形式,更多请存眷萤水红IT仄台此外相闭文章!

点赞(10) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部