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
的操作
实现效果:
例如, 在/proc
下创建一个clk节点,通过cat /proc/clk
System | |
---|---|
Linux |
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/cpuinfo
、cat /proc/meminfo
,所以我们只需要实现.open成员函数。当使用cat
命令查看/proc
下的信息时,会调用到.open
对应的实现函数。
这里我们使用了seq_file
接口,需要记住的是,procfs通常会和seq_file接口一起使用。seq_file是一个序列文件接口,当我们创建的proc数据内容由一系列数据顺序组合而成或者是比较大的proc文件系统时,都建议使用seq_file接口,例如cat /proc/meminfo
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_read
、seq_lseek
和seq_release
。
注意,在较新版本的内核中,procfs
Beachten 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.
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!