我编写了一个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遍,有时甚至更多。
写函数句柄仍然有效。如果一个写入命令失败,则后续所有写入命令也将失败。 如果我再次关闭并打开设备(在应用程序内),写入将被暂时修复。
读取命令上也存在相同的行为。
有什么想法吗?
最佳答案
在驱动程序函数 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/