c - 访问内核模块

标签 c module reference linux-kernel driver

我编写了一个linux内核模块char设备(SuSE 13.2 Kernel 3.16.6),以及一个使用该设备的应用程序。

原则上,驱动程序、应用程序和通信都可以工作。应用程序可以打开、读取、写入和关闭字符设备。

但是存在一个偶发问题,即应用程序有时“丢失”了对模块写入函数的引用。从应用程序向模块发出 3 到 4 个(有时更多)写入命令后,模块的写入功能不会执行。

我减少了模块内部的写入功能:

static ssize_t fWrite(struct file *file, const char  *buffer, size_t length, loff_t *offset)
{
  printk(KERN_ERR "INSIDE\n");
  return 0;
}

我还减少了应用程序:

int main (int argc, char **argv)
{
  unsigned short buffer=0xffff;
  fd = open ("/dev/MYPCI" , O_SYNC | O_RDWR );
  OUTPW (0, buffer ,fd );
  OUTPW (2, buffer,fd );
  OUTPW (4, buffer,fd ); 
  OUTPW (196, buffer,fd );
  OUTPW (70000, buffer,fd );   
  OUTPW (400, buffer,fd );

  printf("DEV-Handle: %d\n", fd);  
  close (fd );
}

int OUTPW (unsigned short ByteAddr, unsigned short value, int fd)
{
  int x;  
  int size = (ByteAddr/2) <<16; 
  size +=2;            

  printf ("\nByteAddr:0x%08hX value:0x%08hX size:0x%08hX WRITE-Handle: 0x%04hX\n" , ByteAddr,value,size, &write);

  x= write(fd, &value, size) ;

  return x;
}

输出看起来像这样。有时我可以读3遍,有时我可以读4遍,有时甚至更多。 screenshoot of outputs

写函数句柄仍然有效。如果一个写入命令失败,则后续所有写入命令也将失败。 如果我再次关闭并打开设备(在应用程序内),写入将被暂时修复。

读取命令上也存在相同的行为。

有什么想法吗?

最佳答案

在驱动程序函数 fWrite() 中返回长度而不是 0。

static ssize_t fWrite(struct file *file, const char  *buffer, size_t length, loff_t *offset)
{
printk(KERN_ERR "INSIDE\n");
return length;
}

关于c - 访问内核模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47671573/

相关文章:

c - Visual Studio 2015 与 2012 对比

c# - 将 C++ 指针结构转换为 C#

python - 在没有 pip 的情况下安装 matplotlib 和 numpy

Python:如果静态类变量获得不同的函数引用指针,如何修复?

python 值与引用

javascript - 使用变量作为对象引用

Python C API 检查 int64 是否无符号

将基于 gnulib 的项目交叉编译到 MinGW

python - 搜索包含非 ASCII 字符的 python 模块

Ruby - 包括单模块多次和祖先层次结构