vfs_write导致内核崩溃

时间:2017-03-25 08:14:32

标签: linux kernel ubuntu-14.04 file-writing

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

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()中将其称为

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

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

显然我做错了。寻求一些帮助。感谢。

2 个答案:

答案 0 :(得分:2)

首先,初始化master指针。不要依赖于对mybranch返回指针的简单检查。请改用struct file *宏。老实说,总的来说,很难说其他什么可能是错的。阅读类似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。

答案 1 :(得分:1)

也许 startstring 不能来自用户空间,但是作为模块,模块驱动程序可以将其放入内核,而不是用户空间。我认为您可以在堆栈中尝试一个简单的字符串并删除参数 startstring ,这可以验证我的猜测是否正确。

相关问题