Linux驱动程序可用的内核辅助工具(二)
我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。
Linux 内核辅助工具函数概述
Linux 内核是一个独立的软件,它没有使用任何 C 语言库,而是自己实现了很多工具和辅助工具。这些工具函数对编写驱动程序非常有用,可以方便地实现目标功能。
工作延迟机制
Linux 内核提供了一种延迟机制,支持函数的延迟调用和执行。这包括了软件中断(Softirq)和 Tasklet。Softirq 仅用于快速处理,通常用在网络和块设备子系统。Tasklet 是 Softirq 的实例,用于处理需要使用 Softirq 的情况。Ksoftirqd 是内核线程,负责处理未服务的软件中断。
Tasklet
Tasklet 是基于 Softirq 下半部机制的,通过结构体 tasklet_struct
表示。Tasklet 的声明可以是动态的或静态的。创建后,Tasklet 可以通过调度函数使其参与调度,有普通优先级和高优先级之分。Tasklet 的特点包括不可重入性、可重新调度自己并且高优先级 Tasklet 先于普通优先级执行。
工作队列
工作队列是内核线程上的延迟机制,可运行在抢占上下文中。工作队列可以是共享的,由内核线程 events/n 执行,并且可以指定提交到共享队列的工作。专用工作队列通过 workqueue_struct
和 work_struct
声明,并通过工作处理函数和初始化工作队列嵌入到工作队列中。
中断服务程序
中断由设备中止内核的一种方式,通知内核发生了重要的事情。注册中断处理程序通过 request_irq
函数实现,并且要提供中断处理程序。中断服务程序不能在中断上下文中使用自旋锁以外的锁,并且要使用 spin_lock_irqsave
防止重入。
中断下半部
中断下半部是一种分割中断处理程序的机制,包括上半部(硬IRQ)和下半部。下半部使用了工作延迟机制,可以运行在中断上下文或进程上下文中。
线程化中断
线程化中断旨在减少中断禁用的时间,使用 request_threaded_irq
来注册中断处理函数,提供一个上半部处理函数和一个下半部线程函数。
本系列文章将继续深入介绍 Linux 内核辅助工具函数的细节。
想要了解更多内容?