|
次のコードをドライバーに追加します。 #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/cpuinfo、 cat /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 関数インターフェースが変更されました。
#システム | カーネルバージョン |
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 ,但本质还是一样的,只是换了名字,更加规范了一些。
|