|
Softirq
|
Tasklet
|
Work Queue
|
执行上下文
|
延后的工作,运行于中断上下文
|
延后的工作,运行于中断上下文
|
延后的工作,运行于进程上下文
|
可重用
|
可以在不同的
CPU
上同时运行
|
不能在不同的
CPU
上同时运行,但是不同的
CPU
可以运行不同的
tasklet
|
可以在不同的
CPU
上同时运行
|
睡眠
|
不能睡眠
|
不能睡眠
|
可以睡眠
|
抢占
|
不能抢占
/
调度
|
不能抢占
/
调度
|
可以抢占
/
调度
|
易用性
|
不容易使用
|
容易使用
|
容易使用
|
何时使用
|
如果延后的工作不会睡眠,而且有严格的可扩展性或速度要求
|
如果延后的工作不会睡眠
|
如果延后的工作会睡眠
|
数据结构
|
位置
|
描述
|
tasklet_struct
|
include/linux/interrupt.h
|
管理tasklet,实现底半部的一种方法
|
kobject
|
include/linux/kobject.h
|
封装一个内核对象的公共属性
|
kset
|
include/linux/kobject.h
|
kobject
所属于的对象集
|
kobj_type
|
include/linux/kobject.h
|
描述一个kobject的对象类型
|
class
|
include/linux/device.h
|
对驱动属于某泛类的理念的抽象
|
bus
device
device_driver
|
include/linux/device.h
|
构建Linux设备模型支柱的结构体
|
内核接口
|
位置
|
描述
|
request_irq()
|
kernel/irq/manage.c
|
请求一个
IRQ
,并为其分配一个中断处理函数
|
free_irq()
|
kernel/irq/manage.c
|
释放一个
IRQ
|
disable_irq()
|
kernel/irq/manage.c
|
禁止与某
IRQ
关联的中断
|
disable_irq_nosync()
|
kernel/irq/manage.c
|
禁止与某
IRQ
关联的中断,并且不等待目前的中断处理实例返回
|
enable_irq()
|
kernel/irq/manage.c
|
重新使能已经被
disable_irq()
或
disable_irq_nosync()
禁止的中断
|
open_softirq()
|
kernel/softirq.c
|
打开一个软中断
|
raise_softirq()
|
kernel/softirq.c
|
标识软中断需要被执行
|
tasklet_init()
|
kernel/softirq.c
|
动态地初始化一个
tasklet
|
tasklet_schedule()
|
include/linux/interrupt.hkernel/softirq.c
|
标识
tasklet
需要被执行
|
tasklet_enable()
|
include/linux/interrupt.h
|
使能一个
tasklet
|
tasklet_disable()
|
include/linux/interrupt.h
|
禁止一个
tasklet
|
tasklet_disable_nosync()
|
include/linux/interrupt.h
|
禁止一个
tasklet
,并且不等待其运行的实例完成
|
class_device_register()
|
drivers/base/class.c
|
Linux
设备模型中的一系列函数:创建
/
破坏类、设备类以及关联的
kobject
和
sysfs
文件
|
kobject_add()
|
lib/kobject.c
|
|
sysfs_create_dir()
|
lib/kobject_uevent.c
|
|
class_device_create()
|
fs/sysfs/dir.c
|
|
class_device_destroy() class_create() class_destroy() class_device_create_file() sysfs_create_file() class_device_add_attrs() kobject_uevent() |
fs/sysfs/file.c
|