이전 기사에서는 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
的操作
实现效果:
例如, 在/proc
下创建一个clk节点,通过cat /proc/clk
System | |
---|---|
Linux |
드라이버에 다음 코드를 추가하세요.
#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/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
이므로 .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_lseek
및 seq_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_read
、seq_lseek
和seq_release
。
注意,在较新版本的内核中,procfs
시스템 | 커널 버전 |
---|---|
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
,但本质还是一样的,只是换了名字,更加规范了一些。
위 내용은 Linux 드라이버 | procfs 인터페이스 생성의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!