>  기사  >  운영 및 유지보수  >  Linux 드라이버 | procfs 인터페이스 생성

Linux 드라이버 | procfs 인터페이스 생성

嵌入式Linux充电站
嵌入式Linux充电站앞으로
2023-08-01 15:26:101457검색

이전 기사에서는 Linux 드라이버에서 sysfs 인터페이스 생성을 소개했습니다. 오늘은 procfs 인터페이스 생성을 소개하겠습니다.

procfs code>: <code style="font-size: 14px;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px; background와 같은 것을 얻을 수 있습니다. - 색상: rgba(27, 31, 35, 0.05); 글꼴 계열: " operator mono consolas monaco menlo monospace break-all rgb>cat /proc/cpuinfo 작업procfs:可实现类似cat /proc/cpuinfo的操作

procfs接口创建

实现效果:

例如, 在/proc下创建一个clk节点,通过cat /proc/clk

procfs 인터페이스 생성 h2>성취 효과:
Linux 드라이버 | procfs 인터페이스 생성예를 들어 /proc 아래에 clk 노드를 생성하고 cat /proc/clk볼 수 있는 콘텐츠:

코드 구현: System커널 버전Linux4.9.88
🎜🎜🎜

드라이버에 다음 코드를 추가하세요.

#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)
{
    //cat显示的内容
    seq_printf(m,
          "pll0: %u Mhz\n"
          "pll1: %u Mhz\n"
          "pll2: %u Mhz\n",
          100, 200, 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 함수를 사용하여 로그아웃합니다. struct file_operations结构体,然后通过proc_create函数进行注册,通过proc_remove函数进行注销。

procfs通常是用来获取CPU、内存、进程等各种信息,例如cat /proc/cpuinfocat /proc/meminfo,所以我们只需要实现.open成员函数。当使用cat命令查看/proc下的信息时,会调用到.open对应的实现函数。

这里我们使用了seq_file接口,需要记住的是,procfs通常会和seq_file接口一起使用。seq_file是一个序列文件接口,当我们创建的proc数据内容由一系列数据顺序组合而成或者是比较大的proc文件系统时,都建议使用seq_file接口,例如cat /proc/meminfo

procfs는 일반적으로 cat /proc/cpuinfo, cat /proc/meminfo이므로 .open 멤버 함수만 구현하면 됩니다. cat 코드>명령 보기<code style="font-size: 14px;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px; background-color: rgba(27, 31, 35, 0.05); 글꼴 계열: " operator mono consolas monaco menlo monospace break-all rgb>/ 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_lseekseq_release 코드>. <code style='font-size: 14px;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);'>seq_readseq_lseekseq_release

proc新接口

注意,在较新版本的内核中,procfs

proc 새 인터페이스

최신 버전의 커널에서는procfsThe 기능 인터페이스가 변경되었습니다.
시스템커널 버전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"
    "pll2: %lu Mhz\n",
    100, 200, 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 인터페이스 생성의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 嵌入式Linux充电站에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제