Maison  >  Article  >  Opération et maintenance  >  Pilote Linux | Création d'interface procfs

Pilote Linux | Création d'interface procfs

嵌入式Linux充电站
嵌入式Linux充电站avant
2023-08-01 15:26:101458parcourir

L'article précédent présentait la création de l'interface sysfs dans le pilote Linux. Aujourd'hui, nous allons présenter la création de l'interface procfs.

procfs code> : peut obtenir quelque chose comme <code style="font-size : 14px;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background - couleur : rgba (27, 31, 35, 0,05) ; famille de polices : « Operator Mono », Consolas, Monaco, Menlo, monospace ; saut de mot : break-all ; couleur : rgb (239, 112, 96) ; ">Fonctionnement de cat /proc/cpuinfoprocfs:可实现类似cat /proc/cpuinfo的操作

procfs接口创建

实现效果:

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

création d'interface procfs h2>Effet de réussite :
Pilote Linux | Création d'interface procfsPar exemple, dans Créez un nœud clk sous /proc et transmettez cat /proc/clkContenu visible :

Implémentation du code : SystèmeVersion du noyauLinux4.9.88
🎜🎜🎜

Ajoutez le code suivant dans le pilote :

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

La création de l'interface procfs implémente principalement struct file_operations structure, puis transmettez proc_create fonction pour s'enregistrer, via proc_remove fonction pour se déconnecter. 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 est généralement utilisé pour obtenir diverses informations telles que le processeur, la mémoire, le processus, etc., telles que cat /proc/cpuinfo, cat /proc/meminfo, nous n'avons donc besoin que d'implémenter la fonction membre .open. Lors de l'utilisation de cat code>Vue de commande<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);famille de polices : " operator mono consolas monaco menlo monospace de mot break-all rgb>/ proc, appellera .open fonction d'implémentation correspondante. 🎜🎜Ici, nous utilisons seq_file, ce qu'il faut retenir c'est que procfs est généralement utilisé avec l'interface seq_file. seq_file est une interface de fichier de séquence. Lorsque le contenu des données proc que nous créons est composé d'une série de séquences de données ou s'il s'agit d'un système de fichiers proc relativement volumineux, il est recommandé d'utiliser l'interface seq_file, telle que cat /proc/meminfo Beaucoup de contenu sera affiché. 🎜

L'interface seq_file résout principalement les problèmes existant dans la programmation de l'interface proc. Il est recommandé d'utiliser l'interface seq_file lors de la programmation de l'interface proc De plus, les fonctions membres .read, .llseek et .release peuvent également être utilisées directement. seq_read , seq_lseek et seq_release code>. <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 nouvelle interface

Notez que dans les versions plus récentes du noyau,procfsLe L'interface des fonctions a changé.
SystèmeVersion du noyauLinux5.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,但本质还是一样的,只是换了名字,更加规范了一些。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer