从内核态写入文件

2023-12-21

我想从内核空间写入日志文件。我可以创建、打开和关闭文件(/var/log/my_kern_module.log),但如果我尝试写入某些内容,我的模块就会崩溃......所以我知道从内核空间读/写文件是不好的,但我必须这样做它在这个模块中。您有什么建议可以帮助我吗?谢谢

在这里您可以找到在我的内核模块上执行写入的代码。它的代码运行到一个线程(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 ]---

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

 loff_t ppos = 0;
 do_sync_write(fd, buffer, readed, &ppos);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从内核态写入文件 的相关文章

随机推荐

  • 修改 NSDate 以表示从今天起 1 个月

    我正在向我正在开发的 Cocoa 应用程序添加重复事件 我每天和每周都会重复 因为我可以用数学方式定义这些 3600 24 7 1 周 我使用以下代码来修改日期 NSDate dateWithTimeIntervalSinceNow 360
  • 如何为现有项目生成asgi.py?

    我在 2 2 中有一个现有的 django 项目 但现在我想开始使用通道 所以我必须更改为 3 0 和 asgi 而不是 wsgi 如何生成运行应用程序所需的 asgi py Django 有一个模板文件here https github
  • 在 Blazor 视图之外访问经过身份验证的用户

    在我的服务器端 Blazor 应用程序中 身份验证以非常规的方式处理 本质上 当用户访问该页面时 他们将使用其 Windows 凭据进行身份验证 此时 将创建一个自定义策略来在外部数据库 Informix 中查找该用户名 在该数据库中可以找
  • 如何在 Android 中滑动视图时禁用 onclick 侦听器?

    我有一个可以滑动到另一个页面的视图 它有一个 onClick 侦听器 用于显示一个对话框 问题是 滑动会触发这两个操作 即显示下一页和对话框 如何在滑动时禁用 onClick 侦听器 听起来你想使用 GestureDetector as w
  • DiffableDataSource:快照不会重新加载页眉和页脚

    我在用UICollectionViewDiffableDataSource for UICollectionView以多个部分显示内容 我正在使用 Collection View Compositional Layout 和 Diffabl
  • 如何通过堆栈跟踪访问本地变量? (模仿动态范围)

    背景 尽管可以在运行时编译 C 代码 但不可能在当前作用域中包含并运行生成的代码 相反 所有变量都必须作为显式参数传递 与 Python 这样的动态编程语言相比 我们永远无法真正复制eval 如本例所示 x 42 print eval x
  • 显示 node.js child_process.exec 的进度?

    我最近提出 接受了我之前提出的问题的答案 如何使用 Node js 复制 wget 的功能 https stackoverflow com questions 9541177 how can i replicate the function
  • 如何在 C++ 中访问数字的符号位?

    我希望能够访问 C 中数字的符号位 我当前的代码看起来像这样 int sign bit number gt gt 31 这似乎有效 给了我0对于正数和 1对于负数 但是 我不明白我是如何得到的 1对于负数 如果 12 是 0000 0000
  • 向 y 轴添加标签以显示 matplotlib 中水平线的 y 值

    如何将字符串标签添加到下图中显示的水平红线 我想将 k 305 之类的内容添加到该行旁边的 y 轴标签中 蓝点只是一些其他数据 其值并不重要 为了重现这个问题 您可以绘制任何类型的数据 我的问题是关于红线的 plt plot 0 502 3
  • iPhone - SKProductsRequest 和“消息发送到已解除分配的实例”

    我在实施 InAppPurchase 时遇到了麻烦 我的购买实现是在模态视图控制器 AppUpgradeViewController 中实现的 我从另一个模态视图中呈现它 我这样做 AppUpgradeViewController appU
  • Android 禁用列表视图项目

    所以基本上我需要一些帮助或一些关于我遇到的问题的建议 我正在从数据库填充列表视图 并且需要在创建列表视图时检查该项目的 id 是否已打开position与我数据库中另一个表的 id 相同 如果是 您可以单击该项目 如果不是 我希望它禁用它
  • 当鼠标在 JFrame 内移动时,Swing Timer 停止调用 actionPerformed()

    如果我将鼠标移入javax swing JFrame the javax swing Timer停止呼叫actionPerformed 方法 直到鼠标停止移动 仅当我使用 Rocket Kone XTD 鼠标移动光标时才会出现这种情况 当我
  • 重启CF服务器会导致所有人退出吗?

    如果CF服务器重新启动 所有现有的Session和Client变量是否都会丢失 客户端变量通常存在于数据库或注册表中 因此它们在服务器重新启动后仍然存在 请参阅here http help adobe com en US ColdFusio
  • 所有单元测试都用 Moq 抛出 BadImageFormatException 吗?

    我目前正在增加我们软件产品的代码覆盖率 但遇到了一个问题 我的所有单元测试 当使用 任何 CPU 编译时 都因抛出 BadImageFormatException 而失败 可以通过使用 x86 而不是 任何 CPU 构建解决方案来规避此异常
  • Xcode - 使用#pragma 标记

    我很确定这不是重复的 你使用 pragma 标记吗 我看了很多方法 哪个是正确的 pragma mark pragma mark Actions pragma mark pragma mark pragma mark Actions pra
  • : 在 vi​​m 中用全颜色方案硬拷贝一个文件

    我想使用全彩打印我在 MacVIM 中编辑的一些文件 包括深色背景 当然我不会将其发送到打印机 我只想将其保存为PDF hardcopy 删除背景并应用丑陋的方案 是否可以 而是使用 TOhtml 这是一个通常包含在默认 Vim 运行时中的
  • boost::bind 的返回类型是什么?

    我想将函数的 绑定器 保存到变量中 以便通过利用其运算符重载功能在以下代码中重复使用它 这是实际执行我想要的操作的代码 include
  • statsmodels“LinAlgError:奇异矩阵”中的逻辑回归

    不知道为什么 但在拟合逻辑回归模型时出现 numpy linalg linalg LinAlgError 奇异矩阵 错误 from sklearn datasets import load breast cancer from sklear
  • 具有流源的查询必须使用 writeStream.start();; 执行

    我正在尝试使用 Spark 结构化流从 Kafka 读取数据并预测传入数据 我正在使用使用 Spark ML 训练过的模型 val spark SparkSession builder appName Spark SQL basic exa
  • 从内核态写入文件

    我想从内核空间写入日志文件 我可以创建 打开和关闭文件 var log my kern module log 但如果我尝试写入某些内容 我的模块就会崩溃 所以我知道从内核空间读 写文件是不好的 但我必须这样做它在这个模块中 您有什么建议可以