kthread&中断 - 处理程序---是否可能

时间:2012-12-05 13:47:31

标签: linux linux-kernel linux-device-driver

Linux驱动程序是否可以有一个kthread,中断句柄和&系统调用。 linux内核内核是否允许以上所有三种?

中断处理程序将在中断时保存来自通信通道的接收数据 Kthread将从通信渠道传输数据 系统调用可用于配置驱动程序或获取其状态。

如果是中断处理程序& kthread正在使用 - 相同的硬件寄存器 - 那么我们如何保护这个关键部分呢?

2 个答案:

答案 0 :(得分:4)

  

中断处理程序将在中断时保存来自通信通道的接收数据。

设备驱动程序的中断服务程序ISR通常处理接收条件,发送条件和错误的中断。状态事件。有些设备有多个中断线,但现在几乎每个设备只有一个中断线,并且必须询问中断状态寄存器以确定产生中断的条件。

单独使用ISR接收将是不寻常的。

  

Kthread将从通信渠道传输数据。

与设备驱动程序关联的线程更可能是用于"下半部分处理"的任务。这是一种最小化ISR中的处理时间,但是对原始数据执行某些处理的技术,尤其是对接收的分组/帧的处理。

使用kthread传输数据似乎是非正统的,并且可能导致问题(例如可避免的关键区域)。如果线程正在执行轮询编程I / O,因为没有DMA且没有可用的Tx中断,那么这样的方案可能是合理的。

  

系统调用可用于配置驱动程序或获取其状态。

Linux设备驱动程序已经有一组定义的入口点:Linux device driver entry points
用户应用程序通过系统调用间接访问大多数这些入口点 系统调用不太可能专门为驱动程序创建。

  

如果是中断处理程序& kthread正在使用 - 相同的硬件寄存器 - 那么我们如何保护这个关键部分呢?

内核中的关键部分通常使用自旋锁保护 但是,排除锁会增加延迟并降低系统响应能力 良好的系统设计可避免创建(不必要的)关键部分。如果对设备寄存器的访问被分配到中断级别和任务级别,则可能只需要一个备用的自旋锁。

因此,一个kthread,一个中断处理程序和系统调用可以与Linux驱动程序相关联,但不一定是你指定的方式。

附录

  

但在我的情况下,我期待使用mmap系统调用发送&从司机接收数据。

您需要使用mmap澄清您的意思 如果您的意思是要mmap()目标SPI设备上的文件(例如SD卡或闪存),那么文件系统或MTD层将处理"映射",并且设备驱动程序将简单地执行普通读取和放大写操作。

  

当我在interupt处理程序中接收数据包时,我不能直接将其发送到映射区域吗? (你的建议是 - 下半部分的Tasklet可以很好地接收数据)

如果目标SPI设备是接收/发送数据包的通信设备,那么您的程序可能无法mmap()该数据的缓冲区。 mmap()功能是对虚拟内存功能的巧妙重用。而不是交换文本&数据进出后备存储(交换区域),虚拟内存功能用于出现在用户空间内存中的特定文件。虽然所有设备都表示为"文件",但设备文件可能会在stat()期间失败mmap()请求。也许它可以完成(对于有限的转移),但我从未尝试过。

如果你指的是驱动程序的 fops mmap()功能,那就超出了我的意思。事实上,Linux源代码树中超过1200个驱动程序中只有大约200个设备驱动程序似乎实现了特定的 fops

  

根据你的建议,我将使用DMA从SPI端口传输数据,为实现这一点,我们必须为此编写一些功能。告诉DMA的功能地址?

您是否正在为通过SPI或SPI控制器连接的设备实现驱动程序? 如果它是使用SPI的目标设备,那么您可能会通过标准SPI接口使用其中一个SPI drivers。您可能会使用

等功能
spi_message_init()
spi_message_add_tail()
spi_sync()

启动和监控I / O操作。使用该交叉引用网站在其他驱动程序中搜索这些功能名称以获取使用示例。使用DMA将取决于SPI驱动程序 如果要为SPI控制器实现驱动程序,请使用其他SPI驱动程序作为示例。

您似乎对I / O和驱动程序概念有一个平坦的视图,但Linux中的功能是在不同的中实现的。
您似乎也打算避免复制操作。在"计算"中有很多缓冲和复制数据。通常将数据从一个缓冲区复制到另一个缓冲区只是解决棘手问题的最简单的解决方案(例如,受保护的存储器与不受保护的存储器)。

附录2

也许您应该查看现有的high-performance MCP2515 CAN driver and the WCCD framework来替换SocketCAN。作者通过优化ISR并最大限度地减少关键区域的使用来记录显着的性能改进。他们的锁。

答案 1 :(得分:0)

我认为没有理由为什么一个司机不会拥有所有这些。

您的数据应该通过锁保护。如果从中断处理程序获取锁定,请使用spin_lock_irq / spin_unlock_irq获取并释放它(在所有地方,而不仅仅是中断处理程序)。