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

Linux-Treiber |. procfs-Schnittstelle erstellen

Freigeben: 2023-08-01 15:26:10
nach vorne
1507 Leute haben es durchsucht

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");
Nach dem Login kopieren

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</code > und <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_release</ Code>. </strong><h2 data-tool="mdnice editor" style="margin-top: 30px;margin-bottom: 15px;font-weight: fett;border-bottom: 1px solid rgb(239, 112, 96);font- size : 1.3em;"><span style="display: none;"></span><span style="display: inline-block;background: rgb(239, 112, 96);color: rgb(255, 255 , 255);padding: 2px 10px 1px;border-top-right-radius: 3px;border-top-left-radius: 3px;margin-right: 3px;">proc new interface</span><span style= " display: inline-block;vertical-align: bottom;border-bottom: 36px solid #efebe9;border-right: 20px solid transparent;"> </span></h2><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新接口

注意,在较新版本的内核中,procfsBeachten Sie, dass in neueren Versionen des Kernels ,< Codestil = „Schriftgröße: 14 Pixel; Überlaufumbruch: Break-Wort; Polsterung: 2 Pixel, 4 Pixel; Randradius: 4 Pixel; rechter Rand: 2 Pixel; linker Rand: 2 Pixel; Hintergrundfarbe: RGBA (27, 31 , 35, 0,05);font-family: „Operator Mono“, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);“>procfsThe Funktionsschnittstelle hat sich geändert.

SystemKernel-Version
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");
Nach dem Login kopieren

新的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!

Verwandte Etiketten:
Quelle:嵌入式Linux充电站
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage