我正在尝试编写一个 Linux 字符驱动程序,它实现写入特殊硬件链接的“标记 MUX”功能。
write()
向驱动程序发出请求,将数据馈送到 kfifo
中,并且单独的内核线程根据需要从 FIFO 中提取数据。如果 FIFO 已满,则用户空间写入文件描述符的操作应阻塞,直到 FIFO 空间可用为止。
如何在字符设备驱动程序中实现此类阻塞?
我在我的字符驱动程序的“写入”处理程序中尝试了这个。当 FIFO 已满时,用户空间进程确实会阻塞,但无法中断或终止。必须重新启动机器。
ssize_t
fifoWrite(struct file *pFile, const char __user *pUserData, size_t nBytes, loff_t *pOffset)
{
unsigned char *pktData = 0;
pktData = memdup_user(pUserData, nBytes); // copy n bytes from user to kernel
if (IS_ERR(pktData))
return PTR_ERR(pktData);
TDataPacket pkt;
memcpy(pkt.buf, pktData, nBytes);
while (kfifo_put(&pktFifo, pkt) == 0)
{
printk(KERN_ERR MODULE_NAME": write - FIFO full\n");
msleep(1000);
}
int fifoLen = kfifo_len(&clientInfo->pktFifo);
printk(KERN_INFO MODULE_NAME": WRITE - %zu bytes. LEN %d\n", , nBytes, fifoLen);
kfree(pktData);
return nBytes;
}
经过长时间的搜索,这些资源被证明非常有帮助: