Linux · 1 min read · Dec 06, 2025
Linuxカーネル空間からファイルを読み取る (モジュール/ドライバ) (Fedora 14)
Linuxカーネル空間からファイルを読み取る (モジュール/ドライバ) (Fedora 14)
ユーザースペースと通信する操作は本当に推奨されていないようです。そして、私はそれに反論しているわけではありません。しかし、それが不可能であるという意味ではありません。ドライバは、HDDにのみ保存できる設定を読み込みます。MS Windows XPが起動すると、Bluetoothをオフにしたことを記憶し、電源が入っていない状態になりますが、最新のLinux(執筆時点でのFedora 14)では、そのような機能が多くのドライバに実装されていません。開発者がprocfsやキャラクタデバイスを使用する場合、実際にファイルから特定のデバイスに情報を送信している別のソフトウェアやスクリプトがブートシーケンスに必要です。
インターネットを見ているうちに、ファイルを読み取るモジュールを書くことができました。それは以下の通りです:
#include // すべてのモジュールに必要
#include // KERN_INFOに必要
#include // filpに必要
#include // セグメントディスクリプタに必要
int init_module(void)
{
// 変数を作成
struct file *f;
char buf[128];
mm_segment_t fs;
int i;
// バッファを0で初期化
for(i=0;i<128;i++)
buf[i] = 0;
// モジュールが動作していることを/var/log/messagesで確認
printk(KERN_INFO "My module is loaded\n");
// Fedoraを使用しており、テストのために次のファイルを選択しました
// 明らかに128バイトよりもはるかに小さいですが、気にしないでください =)
f = filp_open("/etc/fedora-release", O_RDONLY, 0);
if(f == NULL)
printk(KERN_ALERT "filp_open error!!.\n");
else{
// 現在のセグメントディスクリプタを取得
fs = get_fs();
// カーネル空間に関連付けられたセグメントディスクリプタを設定
set_fs(get_ds());
// ファイルを読み取る
f->f_op->read(f, buf, 128, &f->f_pos);
// セグメントディスクリプタを復元
set_fs(fs);
// ファイルから読み取った内容を確認
printk(KERN_INFO "buf:%s\n",buf);
}
filp_close(f,NULL);
return 0;
}
void cleanup_module(void)
{
printk(KERN_INFO "My module is unloaded\n");
} これが/etc/fedora-releaseファイルを読み取るために必要なすべてです。念のため、ソースがmodule.cとして保存されている場合、Makefileには以下が必要です:
obj-m += module.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean次のコマンドを実行します:
$ make
$ su
# insmod module.ko
その後、/var/log/messagesの最後に次のように表示されます:
Dec 11 13:06:11 thinkpad kernel: [ 2410.431974] My module is loaded
Dec 11 13:06:11 thinkpad kernel: [ 2410.431993] buf:Fedora release 14 (Laughlin)
Dec 11 13:06:11 thinkpad kernel: [ 2410.431995]
追加の改行はファイルからのものかもしれません。しかし、実際にそのファイルにあるものです!!!
書き込み関数も存在するようなので、カーネル空間からファイルに何かを書き込みたい場合は、その機能が存在します。
新しい投稿を受信箱で受け取る
スパムはありません。いつでも購読を解除できます。