【问题标题】:vfs_write causes a kernel panicvfs_write 导致内核崩溃
【发布时间】:2017-03-25 08:14:32
【问题描述】:

这是我从内核写入文件的代码。(我知道直接从内核读写不是一个好主意,但这只是一个测试)。

static void write_startup_file(char *startstring)
{
  mm_segment_t oldfs;
  struct file *f;
  loff_t pos=0;

  f = filp_open("/bin/startupcheck",O_WRONLY|O_CREAT, 0644);
  oldfs = get_fs();
  set_fs (KERNEL_DS);
  if(f)
  {
   vfs_write(f,startstring, strlen(startstring), &pos);
   set_fs(oldfs);
   filp_close(f, NULL);
  }
  else
  printk(KERN_CRIT "Unable to open startfile...\n");
 }

我在另一个函数 ourVeryOwnFunction() as 中调用它

if(dbval==NULL) { write_startup_file("FAILED");}

dbval 是正在读取的值。但是当我编译内核并运行它时(我在 vmware 上运行它)。我得到的内核恐慌是here

显然我做错了什么。寻求帮助。谢谢。

【问题讨论】:

  • 如果filp_open 失败,old_fs 会发生什么?

标签: linux kernel ubuntu-14.04 file-writing


【解决方案1】:

首先,初始化您的struct file * 指针。不要依赖对NULL 的返回指针的简单检查。请改用IS_ERR 宏。老实说,总的来说,很难说还有什么问题。阅读类似http://ytliu.info/notes/linux/file_ops_in_kernel.html 的内容或在 SO 上参考这些问题

How to read/write files within a Linux kernel module?

File I/O in a Linux kernel module

也许它会给你一些洞察力或揭示一些事情。而且,当然,不要从内核写入 fs :)

HTH。

【讨论】:

  • 我做了所有这些更改,即 set_fs() 之前的 filp_open ,初始化 struct file* 并在打开文件时我使用 IS_ERR 宏进行检查,但我仍然在 @987654332 得到内核恐慌@.
  • 再一次,很难说是什么导致了你的情况发生恐慌。如果没有完整的源代码和关于特定条件的额外知识,总是很困难。对于内核尤其如此。这是测试内核模式编写器pastebin.com/kPPLqdcd 的小而粗制滥造的小工具,您可以使用这些小便利file_xxx API。插入后,模块创建文件/root/test.txt并从内​​核写入,卸载时从文件中读取6个字节并关闭它。使用 dmesg 观察作者。在 Linux 4.10.5 x86-64 上测试,使用 gcc 6.3 构建。 HTH。
  • 对于无意中删除有关 filp_open()get | set_fs() 的信息,我们深表歉意。我的错。调用命令没有错。但对于vfs_write()vfs_read() 等例程来说,这仍然很重要。
  • 谢谢!生病尝试file_xxx API 并让您知道。
  • 我将内核模式编写器作为一个模块运行,它运行完美,但是当我尝试在启动时执行它时崩溃。我猜它试图取消引用空指针或其他东西。
【解决方案2】:

也许startstring不能来自用户空间,但是作为一个模块,模块驱动可以把它放入内核,而不是用户空间。我觉得你可以在栈中尝试一个简单的字符串,去掉参数startstring,可以验证我的猜测是否正确。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    • 2014-05-25
    • 1970-01-01
    • 2021-12-11
    • 2021-12-15
    • 1970-01-01
    相关资源
    最近更新 更多