Linux ドライバー | procfs インターフェイスの作成

リリース: 2023-08-01 15:26:10
転載
1439 人が閲覧しました

前回の記事では Linux ドライバーでの sysfs インターフェイスの作成について紹介しましたが、今回は procfs インターフェイスの作成について紹介します。

procfs: cat /proc/cpuinfo

procfs インターフェイスの作成## と同様の操作を実装できます。

#達成効果:

たとえば、

/proc に clk ノードを作成し、cat /proc/clk## を渡します。 #表示可能なコンテンツ:

# コード実装: Linux ドライバー | procfs インターフェイスの作成

##システムカーネル バージョン Linux4.9.88

次のコードをドライバーに追加します。

#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# が実行されます。 ## function proc_remove 関数を使用して登録および登録解除します。

procfs は通常、

cat /proc/cpuinfocat /proc/meminfo のように、CPU、メモリ、プロセスなどのさまざまな情報を取得するために使用されます。したがって、実装する必要があるのは .open メンバー関数だけです。 cat コマンドを使用して /proc の下の情報を表示すると、対応する .open の実装関数が呼び出されます。

ここでは

seq_file インターフェイスを使用しますが、覚えておく必要があるのは、procfs は通常、seq_file インターフェイスと一緒に 使用されるということです。 seq_file はシーケンス ファイル インターフェイスです。 作成する proc データ コンテンツが一連のデータ シーケンスで構成されている場合、または比較的大きな proc ファイル システムである場合は、# などの seq_file インターフェイス を使用することをお勧めします。 ##cat / proc/meminfo は多くのコンテンツを表示します。 <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;"> seq_file インターフェイスは、主に proc インターフェイスのプログラミングに存在する問題を解決します。 <strong> proc インターフェイスをプログラミングするときは、seq_file インターフェイスを使用することをお勧めします。 </strong> さらに、.read、.llseek、および .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 を直接使用することもできます。

proc 新しいインターフェイス

カーネルの新しいバージョンでは、procfs関数インターフェースが変更されました。

#システムカーネルバージョンLinux5.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 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:嵌入式Linux充电站
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!