从内核态写入文件

发布于 2024-11-16 02:09:44 字数 2855 浏览 1 评论 0原文

我想从内核空间写入日志文件。我可以创建、打开和创建关闭文件(/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->write(...),但模块也崩溃了。

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 ]---

I would like to write into a log file from the kernel space. I can create, open & close file (/var/log/my_kern_module.log) but if I try to write something into, my module crash... So I know read/write file from kernel space is bad, but I must do it in this module. Do you have any suggestion to help me ? thx

Here you can find the code who perform write on my kernel module. It code run into a thread (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);

so, i've tried to use fd->f_op->write(...), but module crash too.

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 ]---

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

醉殇 2024-11-23 02:09:44

一个明显的问题是 do_sync_write() 的第四个参数是一个指向文件偏移量存储位置的指针(因此可以更新它)。您传递的 0 可能可以解释 NULL 指针问题。可以尝试:

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

One obvious problem is that the 4th parameter to do_sync_write() is a pointer to where the file offset is stored (so it can be updated). You are passing 0 which might explain the NULL pointer problem. Could try:

 loff_t ppos = 0;
 do_sync_write(fd, buffer, readed, &ppos);
江湖彼岸 2024-11-23 02:09:44

此处列出了满足您需要的等效方法。

为什么从内核写入文件不好?

Equivalent methods to do what you need are listed here.

Why writing files from the kernel is bad ?

椒妓 2024-11-23 02:09:44

LKML 上经常出现这种情况,答案总是“不要这样做”。总有更好的方法。

This comes up all the time on LKML, and the answer is always "don't do it". There is always a better way.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文