2011-06-18 3 views
5

カーネルスペースからログファイルに書きたいと思っています。私は、開くことができます&クローズファイル(/var/log/my_kern_module.log)が、私は何かに書き込もうとすると、私のモジュールクラッシュ...だから私は読み書きカーネルのスペースからファイルが悪いことを知っているが、私は行う必要がありますそれはこのモジュールにあります。私を助ける提案はありますか? thxカーネルの土地からファイルを書き込む

私のカーネルモジュールで書き込みを行うコードを見つけることができます。それはとてもスレッド(kthread)に実行

mutex_lock(&gl_mtx_writelog); 
     printk(KERN_EMERG "Readed : %s\n", buffer); 

     fd = filp_open("/var/log/my_kern_module.log", O_CREAT | O_WRONLY | O_APPEND, S_IRWXU); 
     if (!IS_ERR (fd)) { 
     fs = get_fs(); 
     set_fs(KERNEL_DS); 

     do_sync_write(fd, buffer, readed, 0); 

     set_fs(fs); 
     filp_close(fd, NULL); 
     } 
     mutex_unlock(&gl_mtx_writelog); 

をコーディングし、私もFD-> f_op->書き込み(...)が、モジュールのクラッシュを使用することを試みました。

BUG: unable to handle kernel NULL pointer dereference at (null) 
IP: [<c10df83a>] do_sync_write+0x6a/0xe0 
*pde = 00000000 
Oops: 0000 [#1] SMP 
last sysfs file: /sys/module/snd_mixer_oss/initstate 
Modules linked in: trigger_server snd_seq_dummy snd_seq_oss snd_seq_midi_event s       nd_seq snd_seq_device snd_pcm_oss snd_mixer_oss ipv6 pcmcia pcmcia_core agpgart       lp fuse ppdev snd_intel8x0 snd_ac97_codec ac97_bus thermal i2c_piix4 snd_pcm the       rmal_sys i2c_core snd_timer e1000 parport_pc parport snd rtc_cmos rtc_core rtc_l       ib joydev psmouse soundcore snd_page_alloc evdev usbhid serio_raw hid hwmon ac b       utton sg [last unloaded: pcmcia_core] 

Pid: 2468, comm: kthread_cli Not tainted 2.6.33.4-smp #1 /VirtualBox 
EIP: 0060:[<c10df83a>] EFLAGS: 00010287 CPU: 0 
EIP is at do_sync_write+0x6a/0xe0 
EAX: f6434000 EBX: 00000000 ECX: 00000200 EDX: f5c26400 
ESI: f653ca80 EDI: f5cf1f14 EBP: f5cf1f98 ESP: f5cf1f0c 
DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068 
Process kthread_cli (pid: 2468, ti=f5cf0000 task=f6434000 task.ti=f5cf0000) 
Stack: 
c103de14 00000441 00000000 00000442 00000000 00000001 ffffffff f653ca80 
<0> 00000000 00000000 00000000 00000000 f6434000 00000000 00000000 c10384a6 
<0> 0000052b 00000000 0000052b ffffffff f5c26400 00000400 f5cf1f98 00000442 
Call Trace: 
[<c103de14>] ? vprintk+0x184/0x3d0 
[<c10384a6>] ? try_to_wake_up+0x226/0x350 
[<f887b226>] ? thread_client+0x106/0x130 [trigger_server] 
[<f887b120>] ? thread_client+0x0/0x130 [trigger_server] 
[<c1058cf4>] ? kthread+0x74/0x80 
[<c1058c80>] ? kthread+0x0/0x80 
[<c10035be>] ? kernel_thread_helper+0x6/0x10 
Code: 94 00 00 00 00 c7 45 98 00 00 00 00 c7 45 9c 00 00 00 00 c7 45 a0 00 00 00       00 89 45 a4 c7 45 a8 00 00 00 00 c7 45 ac 00 00 00 00 <8b> 03 8b 53 04 89 4d c8       89 45 b0 89 55 b4 eb 13 8d b6 00 00 00 
EIP: [<c10df83a>] do_sync_write+0x6a/0xe0 SS:ESP 0068:f5cf1f0c 
CR2: 0000000000000000 
---[ end trace 32d03f08f128f335 ]--- 
+0

タイトルに[Linux]を入れないでください。タグを使用してください。編集されました。 – orlp

+0

これはC++タグを持つべきではありません。 – Dipstick

+0

@ 0xBAADF00Dこのモジュールの目的を知っているかもしれませんか? –

答えて

4

1つの明白な問題は、()オフセットファイルが保存されている場所へのポインタである第四パラメータがdo_sync_writeするということである(それを更新することができます)。 NULLポインターの問題を説明する0を渡しています。試みることができる:これはLKML上のすべての時間を来て、答えは「それをしない」常に

loff_t ppos = 0; 
do_sync_write(fd, buffer, readed, &ppos); 
+1

もちろん、はい、ありがとうございます。 'do_sync_write(fd、buffer、readed、&fd-> f_pos);で動作する新しい変数を作成する必要はありません。だからあなたがハンドル要求に準拠したければ(つまり、私のモジュールが書き込むときにtailコマンドで書かれたファイルを見ている) - > 'vfs_write(fd、buffer、strlen(buffer)、&fd-> f_pos);' – 0xBAADF00D

0

。常に良い方法があります。

3

必要な処理を行う同等の方法がここにリストされています。

Why writing files from the kernel is bad ?

+0

カーネルスペースからいつ書き込むことができるのか理解してもらえますか?私はここでこの質問をしましたhttp://stackoverflow.com/questions/41410168/accessing-device-files-from-kernelspacecode –

関連する問題