Pemacu Linux |

嵌入式Linux充电站
嵌入式Linux充电站ke hadapan
2023-08-01 15:26:101502semak imbas

Artikel sebelumnya memperkenalkan penciptaan antara muka sysfs dalam pemacu Linux Hari ini kami akan memperkenalkan penciptaan antara muka procfs.

procfs code>: Boleh mencapai sesuatu seperti <code style="font-size: 14px;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background - warna: rgba(27, 31, 35, 0.05);font-family: " operator mono consolas monaco menlo monospace break-all rgb>Operasi kucing /proc/cpuinfoprocfs:可实现类似cat /proc/cpuinfo的操作

procfs接口创建

实现效果:

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

h2>Kesan pencapaian:
Pemacu Linux |Sebagai contoh, dalam Buat nod clk di bawah /proc dan lulus cat /proc/clkKandungan boleh dilihat:

Pelaksanaan kod: System version
Pelaksanaan kod:
System version🎜🎜🎜 🎜🎜Linux🎜🎜4.9.88🎜🎜🎜🎜

Tambah kod berikut dalam pemacu:

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

Penciptaan antara muka procfs terutamanya melaksanakan struct file_operations struktur, dan kemudian lulus proc_create fungsi untuk mendaftar, melalui proc_remove berfungsi untuk log keluar. 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 biasanya digunakan untuk mendapatkan pelbagai maklumat seperti CPU, memori, proses dan lain-lain, seperti cat /proc/cpuinfo, cat /proc/meminfo, jadi kita hanya perlu melaksanakan fungsi ahli .open. Apabila menggunakan cat kod>Paparan arahan<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 break-all rgb>/ proc, akan memanggil .open fungsi pelaksanaan yang sepadan. 🎜🎜Di sini kami menggunakan antara muka seq_file, apa yang perlu diingat ialah procfs biasanya digunakan bersama antara muka seq_file. seq_file ialah antara muka fail jujukan Apabila kandungan data proc yang kami cipta terdiri daripada satu siri jujukan data atau ia adalah sistem fail proc yang agak besar, adalah disyorkan untuk menggunakan antara muka seq_file, seperti cat /proc/meminfo Banyak kandungan akan dipaparkan. 🎜

Antara muka seq_file terutamanya menyelesaikan masalah yang ada dalam pengaturcaraan antara muka proc Adalah disyorkan untuk menggunakan antara muka seq_file apabila memprogramkan antara muka proc Selain itu, fungsi ahli .read, .llseek, dan .release juga boleh digunakan secara langsung seq_read , seq_lseek; > dan seq_release kod>. <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新接口

注意,在较新版本的内核中,procfs

proc antara muka baharu

Perhatikan bahawa dalam versi kernel yang lebih baharu,procfsThe antara muka fungsi telah berubah.
SystemVersi kernelLinux5.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,但本质还是一样的,只是换了名字,更加规范了一些。

Atas ialah kandungan terperinci Pemacu Linux |. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:嵌入式Linux充电站. Jika ada pelanggaran, sila hubungi admin@php.cn Padam