我已经为USB设备编写了Linux内核模块。 USB驱动程序提供2个只读字符设备,这些设备只能通过一个进程专门打开:
/dev/cdev_a
/dev/cdev_b
USB设备一次只能处理一个请求。
测试设置如下:
dd if=/dev/cdev_a of=/tmp/a bs=X
读取数据dd if=/dev/cdev_b of=/tmp/b bs=X
对于X
的某些值,两个文件之间的大小差异很大,这是我所不希望的。
对驱动程序的读取调用将执行以下操作:
mutex_lock_interruptible(iolock)
usb_bulk_msg(dev, pipe, buf, X, timeout)
mutex_unlock(iolock)
copy_to_user(buf)
我期望的是以下内容:
mutex_lock_interruptible(iolock)
usb_bulk_msg(dev, pipe, buf, X, timeout)
mutex_lock_interruptible(iolock)
->块mutex_unlock(iolock)
copy_to_user(buf)
mutex_lock_interruptible(iolock)
->块usb_bulk_msg(dev, pipe, buf, X, timeout)
但是我在ftrace中看到的是,在步骤8中,进程A仍在继续。似乎对于某些X值,关键区域内的时间是时间片的倍数,因此,当关键区域被阻塞时,进程B总是获得时间片。什么是最佳实践解决方案?我正在考虑在复制到用户空间或使用不错的值或使用wait_queues之后每次调用schedule()
吗?