Linux设备驱动程序,内核线程无法打开文件?

Posted

技术标签:

【中文标题】Linux设备驱动程序,内核线程无法打开文件?【英文标题】:Linux Device Driver, kernel thread can't open file? 【发布时间】:2020-05-08 20:28:31 【问题描述】:

我正在使用 Linux 内核模块编写 Linux 驱动程序,当用户可以写入并且当用户调用 close 时,驱动程序必须将内容刷新到另一个目录中与设备文件同名的文件中。

我有这个问题:当一个进程调用close时,驱动程序可以打开一个文件并正确刷新它的所有内容;当进程被终止时(例如,从带有kill 的终端),设备驱动程序无法执行filp_open,因为fs->CURRENT 设置为NULL。所以,我试图启动一个内核线程来完成这项工作。

当我尝试打开同一目录中的文件时,例如filp_open("myfile"...),它可以正常工作。但是如果我必须在另一个目录中打开一个文件,那么filp_open("dirA/myfile")filp_open 返回-2。但是当我从主线程调用filp_open 时,这不会发生。

这是我的代码:

static int thread_fn(void *unused)
  struct thread_data* td = (struct thread_data *) unused;
  if(td == NULL)
     printk(KERN_INFO "td is null\n");
  struct file* filp=filp_open("/dirA/myfile",O_RDWR,0666);
  if(filp == NULL || (IS_ERR(filp)))
    printk(KERN_INFO "filp is null!\n");
  else
    printk(KERN_INFO "filp is not null!\n");

  size_t filp_size = filp->f_inode->i_size;
  printk(KERN_INFO "size on release: %ld\n",filp_size);
  if(filp_size > td->size)
    printk(KERN_INFO "truncating file\n");
    truncate_setsize(filp->f_inode, td->size);
  


  inode_lock(filp->f_inode); 
  //file_write(filp,/*file->f_pos*/0,td->data,td->size);
  inode_unlock(filp->f_inode);

  printk(KERN_INFO "Thread Stopping\n");
  do_exit(0);
  return 0;

这是我的device_release 函数:

static int device_release(struct inode *inode, struct file *file)

   if(my_data->buffer == NULL)
      return -ENOMEM;

  struct thread_data* td=alloc_mem(sizeof(struct thread_data));
  td->filename=my_data->filename;
  td->data=my_data->buffer;
  td->size=my_data->size;

  thread_st = kthread_run(thread_fn, (void *)td,"Thread!");
  if (thread_st)
    printk(KERN_INFO "Thread Created successfully\n");
  else
    printk(KERN_ERR "Thread creation failed\n");

  return 0;

有什么问题?看不懂,可能是操作系统的问题?我也试过set_fs/get_fs,但没有用。

【问题讨论】:

【参考方案1】:

我有一个更新:如果我设置标志 O_CREAT,filp_open 不会返回错误,但不会创建文件;那么,内核线程不能对文件进行操作?

【讨论】:

这没有回答问题。要为问题添加更多信息,请单击问题下方的“编辑”按钮。

以上是关于Linux设备驱动程序,内核线程无法打开文件?的主要内容,如果未能解决你的问题,请参考以下文章

Win 10 无法打开内核设备“\.Globalvmx86”

无法打开内核设备“\\.\VMCIDev\VMX”: 重叠 I/O 操作在进行中。您在安装 VMware Workstation

查看内核中字符设备和块设备信息用啥命令

虚拟机打开电源出现“无法打开内核设备“\\.\Global\vmx86”: 系统找不到指定的文件。你想要在安装 VMware

嵌入式linux设备驱动,无法打开设备文件

Linux内核设备驱动程序中的filp_open