Heim >Betrieb und Instandhaltung >Betrieb und Wartung von Linux >Linux-Treiber |. procfs-Schnittstelle erstellen
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
und 和seq_release
。
注意,在较新版本的内核中,procfs
Beachten 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!