Heim  >  Artikel  >  Betrieb und Instandhaltung  >  Linux-Treiber |. procfs-Schnittstelle erstellen

Linux-Treiber |. procfs-Schnittstelle erstellen

嵌入式Linux充电站
嵌入式Linux充电站nach vorne
2023-08-01 15:26:101221Durchsuche

Im vorherigen Artikel wurde die Erstellung der sysfs-Schnittstelle im Linux-Treiber vorgestellt. Heute stellen wir die Erstellung der procfs-Schnittstelle vor.

procfs:可实现类似cat /proc/cpuinfo的操作

procfs接口创建

实现效果:

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

procfs-Schnittstellenerstellung h2>Erfolgseffekt:
Linux-Treiber |. procfs-Schnittstelle erstellenZum Beispiel in Erstellen Sie einen clk-Knoten unter /proc und übergeben Sie cat /proc/clkSichtbarer Inhalt:

Code-Implementierung: SystemKernel-VersionLinux4.9.88
🎜🎜🎜

Fügen Sie den folgenden Code im Treiber hinzu:

#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");

Die Erstellung der procfs-Schnittstelle implementiert hauptsächlich struct file_operations Struktur und übergeben Sie dann proc_create Funktion zum Registrieren über proc_remove Funktion zum Abmelden. 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 wird normalerweise verwendet, um verschiedene Informationen wie CPU, Speicher, Prozess usw. abzurufen, z. B. cat /proc/cpuinfo, cat /proc/meminfo, daher müssen wir nur die .open-Mitgliedsfunktion implementieren. Bei Verwendung von .open entsprechende Implementierungsfunktion. 🎜🎜Hier verwenden wir cat /proc/meminfo Es werden viele Inhalte angezeigt. 🎜

Die seq_file-Schnittstelle löst hauptsächlich die bei der Proc-Schnittstellenprogrammierung bestehenden Probleme. Es wird empfohlen, die seq_file-Schnittstelle bei der Programmierung der Proc-Schnittstelle zu verwenden. Darüber hinaus können die Memberfunktionen .read, .llseek und .release auch direkt verwendet werden seq_lseek und seq_lseekseq_release

proc新接口

注意,在较新版本的内核中,procfsBeachten Sie, dass in neueren Versionen des Kernels ,procfsThe Funktionsschnittstelle hat sich geändert.

System Kernel-Version
Linux 5.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,但本质还是一样的,只是换了名字,更加规范了一些。

Das obige ist der detaillierte Inhalt vonLinux-Treiber |. procfs-Schnittstelle erstellen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:嵌入式Linux充电站. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen