访问内核模块

时间:2017-12-06 10:05:04

标签: c module reference linux-kernel driver

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

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

但是有一个零星的问题,即应用程序somtime'丢失'对模块写入函数的引用。在从应用程序到模块的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

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

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

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

在驱动程序函数中,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;
}