《深入理解Linux内核》笔记4:软中断_tasklet_工作队列葡萄的技术博客百度空间

合集下载

Linux 内核软中断(softirq)执行分析

Linux 内核软中断(softirq)执行分析

Linux 内核软中断(softirq)执行分析Author: sinisterEmail: sinister@Homepage:Date: 2007-01-11本文对 Linux 内核软中断的执行流程进行了分析,并尽可能的结合当前运行环境详细地写出我的理解,但这并不表明我的理解一定正确。

这本是论坛里的一篇帖子,发出来是为了抛砖引玉,如果您在阅读本文时发现了我的错误,还望得到您的指正。

今天无意中看了眼 2.6 内核的软中断实现,发现和以前我看到的大不相同(以前也是走马观花,不大仔细),可以说改动很大。

连 softirq 的调用点都不一样了,以前是三个调用点,今天搜索了一下源代码,发现在多出了ksoftirqd 后,softirq 在系统中的调用点仅是在 ISR 返回时和使用了local_bh_enable() 函数后被调用了。

网卡部分的显示调用,我觉得应该不算是系统中的调用点。

ksoftirqd 返回去调用 do_softirq() 函数应该也只能算是其中的一个分支,因为其本身从源头上来讲也还是在 ISR 返回时irq_exit() 调用的。

这样一来就和前些日子写的那份笔记(Windows/Linux /Solaris 软中断机制)里介绍的 Linux 内核部分的软中断有出处了,看来以后讨论 Linux kernel 代码一定要以内核版本为前题,要不非乱了不可。

得买本 Linux 方面的书了,每次上来直接看相关代码也不是回事,时间也不允许。

//// do_IRQ 函数执行完硬件 ISR 后退出时调用此函数。

//void irq_exit(void){account_system_vtime(current);trace_hardirq_exit();sub_preempt_count(IRQ_EXIT_OFFSET);//// 判断当前是否有硬件中断嵌套,并且是否有软中断在// pending 状态,注意:这里只有两个条件同时满足// 时,才有可能调用 do_softirq() 进入软中断。

linux中断底半部机制对比(任务队列,工作队列,软中断)--由linux RS485引出的血案-ispsubb-ChinaUnix博客

linux中断底半部机制对比(任务队列,工作队列,软中断)--由linux RS485引出的血案-ispsubb-ChinaUnix博客
1 / 7
b l o g . c h i n a u n i x . n e t / u i d 2 0 7 6 8 9 2 8 i d 5 0 7 7 4 0 1 . h t ml
1 5 6 1 6l i n u x
-l i n u x R S 4 8 5
i s p s u b b C h i n a U n i x
lwfbibi
D2002
chunhui_
2 / 7
b l o g . c h i n a u n i x . n e t / u i d 2 0 7 6 8 9 2 8 i d 5 0 7 7 4 0 1 . h t ml
1 5 6 1 6l i n u x
-l i n u x R S 4 8 5
i s p s u b b C h i n a U n i x
考/angle_birds/article/details/8448070
yzj_1988
64492407
紫易幼南
点击(此处)折叠或打开 1 . 2 . 3 . 4 . 5 . 6 . 7 . 8 . 9 . 1 0 . 1 1 . 1 2 . 1 3 . 1 4 . D E C L A R E _ W O R K ( s t r u c tw o r k _ s t r u c t,w o r k _ f u n c _ tf u n c ) ; I N I T _ W O R K ( s t r u c tw o r k _ s t r u c t* w o r k ,w o r k _ f u n c _ tf u n c ) ; I N I T _ D E L A Y E D _ W O R K ( s t r u c td e l a y e d _ w o r k* w o r k ,w o r k _ f u n c _ tf u n c ) ; i n ts c h e d u l e _ w o r k ( s t r u c tw o r k _ s t r u c t* w o r k ) ; i n ts c h e d u l e _ d e l a y e d _ w o r k ( s t r u c td e l a y e d _ w o r k* w o r k ,u n s i g n e dl o n gd e l a y ) ; i n ts c h e d u l e _ d e l a y e d _ w o r k _ o n ( s t r u c td e l a y e d _ w o r k* w o r k ,u n s i g n e dl o n gd e l a y ) ; s t r u c tw o r k q u e u e _ s t r u c t* c r e a t e _ w o r k q u e u e ( c o n s tc h a r* n a m e ) ; i n tq u e u e _ w o r k ( s t r u c tw o r k q u e u e _ s t r u c t* w q ,s t r u c tw o r k _ s t r u c t* w o r k ) ; i n tq u e u e _ d e l a y e d _ w o r k ( s t r u c tw o r k q u e u e _ s t r u c t* w q ,s t r u c td e l a y e d _ w o r k* w o r k , u n s i g n e dl o n gd e l a y ) ; v o i df l u s h _ s c h e d u l e d _ w o r k ( v o i d ) ; v o i df l u s h _ w o r k q u e u e ( s t r u c tw o r k q u e u e _ s t r u c t* w q ) ; i n tc a n c e l _ d e l a y e d _ w o r k ( s t r u c td e l a y e d _ w o r k* w o r k ) ; v o i dd e s t r o y _ w o r k q u e u e ( s t r u c tw o r k q u e u e _ s t r u c t* w q ) ;

tasklet和工作队列

tasklet和工作队列

tasklet和工作队列tasklet和工作队列分类:LINUX设备驱动程序第三版2013-01-22 16:00 418人阅读评论(0) 收藏举报tasklet和定时器相关的另一个内核设施是taskled(小任务)机制。

中断管理中大量使用了这种机制。

task在很多方面类似内核定时器:它们始终在中断期间运行,始终会在调度它们的同一CPU上运行,而且都接收一个unsigned long参数,tasklet也会在“软件中断”上下文以原子模式执行。

和内核同时器不同的是,我们不能要求tasklet在某个给定时间执行。

软件中断是指打硬件中断的同时执行某些异步任务的一种内核机制。

tasklet的数据结构如下,使用前必须初始化,调用特定的函数或使用特定的宏来声明该结构,可以完成tasklet的初始化:#includestruct tasklet_struct{/*.....*/void (*func)(unsigned long);unsigned long data;};void tasklet_init(struct tasklet_struct *t),void (*func)(unsigned long), unsigned long data);DECLARE_TASKLET(name, func, data);DECLARE_TASKLET_DISABLED(name, func, data);tasklet为我们提供了许多有意思的特性:一个tasklet可以稍后被禁止或者重新启用;只有启用的次数和禁止的次数相同时,tasklet才会被执行和定时器类似,tasklet可以注册自身tasklet可被调度以在通常的优先级或者高优先级执行。

高优先级的tasklet总会首先执行。

如果系统负荷不重,则tasklet会立即得到执行,但始终不会晚于下一个定时器滴答。

一个tasklet可以和其他tasklet并发,但对自身来讲是严格串行处理的,也就是说,同一tasklet永远不会在多个处理器上同时运行。

Linux中的中断概念以及处理方式--中断上下半部等

Linux中的中断概念以及处理方式--中断上下半部等

Linux中的中断概念以及处理方式--中断上下半部等与Linux设备驱动中中断处理相关的首先是申请与释放IRQ的API request_irq()和free_irq(),request_irq()的原型为:int request_irq(unsigned int irq,void (*handler)(int irq, void *dev_id, struct pt_regs *regs),unsigned long irqflags,const char * devname,void *dev_id);irq是要申请的硬件中断号;handler是向系统登记的中断处理函数,是一个回调函数,中断发生时,系统调用这个函数,dev_id参数将被传递;irqflags是中断处理的属性,若设置SA_INTERRUPT,标明中断处理程序是快速处理程序,快速处理程序被调用时屏蔽所有中断,慢速处理程序不屏蔽;若设置SA_SHIRQ,则多个设备共享中断,dev_id在中断共享时会用到,一般设置为这个设备的device结构本身或者NULL。

free_irq()的原型为:void free_irq(unsigned int irq,void *dev_id);另外,与Linux中断息息相关的一个重要概念是Linux中断分为两个半部:上半部(tophalf)和下半部(bottom half)。

上半部的功能是"登记中断",当一个中断发生时,它进行相应地硬件读写后就把中断例程的下半部挂到该设备的下半部执行队列中去。

因此,上半部执行的速度就会很快,可以服务更多的中断请求。

但是,仅有"登记中断"是远远不够的,因为中断的事件可能很复杂。

因此,Linux引入了一个下半部,来完成中断事件的绝大多数使命。

下半部和上半部最大的不同是下半部是可中断的,而上半部是不可中断的,下半部几乎做了中断处理程序所有的事情,而且可以被新的中断打断!下半部则相对来说并不是非常紧急的,通常还是比较耗时的,因此由系统自行安排运行时机,不在中断服务上下文中执行。

第13讲 Linux中断实验_笔记

第13讲 Linux中断实验_笔记

一、Linux内核中断处理简介1.1、裸机中断1.2 linux中断1、先知道你要使用的中断对应的中断号。

2、先申请request_irq,此函数会激活中断。

3、如果不用中断了,那就释放掉,使用free_irq。

4、中断处理函数irqreturn_t (*irq_handler_t) (int, void *)。

5、使能和禁止中断,1.3 上半部和下半部中断一定要处理的越快越好,1、软中断static struct softirq_action softirq_vec[NR_SOFTIRQS] 10个要使用软中断,要先注册,使用函数open_softir。

注册以后使用raise_softirq触发。

软中断我们不要去用!!软中断我们不要去用!!2、tasklet也需要用到上半部,只是上半部的中断处理函数重点是调用tasklet_schedule。

1、定义一个tasklet函数。

2、初始化、重点是设置对应的处理函数3、工作队列1.4 设备树中断节点信息1、#interrupt-cells指定interrupt的cells数量,也就是属性interrupts。

intc: interrupt-controller@00a01000 {compatible = "arm,cortex-a7-gic";#interrupt-cells = <3>;interrupt-controller;reg = <0x00a01000 0x1000>,<0x00a02000 0x100>;};gpio5: gpio@020ac000 {compatible = "fsl,imx6ul-gpio", "fsl,imx35-gpio";reg = <0x020ac000 0x4000>;interrupts = <GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>,<GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>;gpio-controller;#gpio-cells = <2>;interrupt-controller;#interrupt-cells = <2>;};fxls8471@1e {compatible = "fsl,fxls8471";reg = <0x1e>;position = <0>;interrupt-parent = <&gpio5>;interrupts = <0 8>;};interrupt-parent指定父中断。

Softirq_Tasklet_Workqueue区别联系

Softirq_Tasklet_Workqueue区别联系

Softirq_Tasklet_Workqueue区别联系
软中断(softirq)是内核使用的一种推后执行任务的一种机制,由于一些中断处理必须要在短期内完成,所以内核不得不把一些相对不重要的工作推后执行,软中断就是专门用来执行这种后退的工作。

它在某种程度上有点像硬件中断,来得“随时随地”,而且不在进程上下文之中。

千万不要把它和“软件中断(software interrupts)”这个概念混了,后者是因为在编程中使用了中断指令(比如:int 0×80)而产生一个硬件上实际存在的中断信号,而前者更本就不和硬件扯关系。

小任务(tasklet)是在软中断的基础上实现的一种后推执行方式。

软中断是在编译时就已经确定好的,而小任务则可以在运行时分配和初始化;软中断可以在不同的CPU上同时执行,而同一类型的tasklet 只能在调度它们的同一CPU上运行,因此软中断函数必须是可重入的,而小任务的函数则没有这个必要。

工作队列(work queue)是另一种后推方式,但它和小任务有着很大的区别,小任务是在中断上下文中执行的,而工作队列是在进程上下文中执行的,所以工作队列是可以休眠的,也就不一定是原子的。

执行工作队列的线程是ksoftirqd/n(n是cpu的编号,在UP是ksoftirqd/0),这是一个内核线程,因此也不能访问用户内存。

下半部(bottom half)是后推执行任务的一个统称,它主要是完成上半部未完成的一些工作。

一般来说,在处理中断时,在中断处理例程(上半部)中做的工作越少越好,其余一些相对不那么迫切的工作可以后推给下半部来完成,当然了,下半部可以是小任务,也可以是工作队列。

Linux26内核中下半部分分析解析

Linux26内核中下半部分分析解析

目录
• 简介 • 历史&发展 • 实现机制
• • • 软中断 Tasklet 工作队列(new)
• 总结
bottom half(BH)
BH接口非常简单,它提供一个静态创建、 由32个bottom half组成的链表。上半部分 通过一个32位整数中的一位来识出哪个 bottom half可以执行。每个BH都在全局范 围内进行同步。即使分属于不同的处理器, 也不允许两个bottom half同时执行。 使用不灵活,大大降低多处理器的性能。
work quque
从2.5开始,BH接口最终被弃置,任务队列被 工作队列(work queue)接口取代。工作 队列可以把工作推后,交由一个内核线程 去执行—这个下半部分总会在进程上下文 执行。工作队列允许重新调度甚至睡眠。
2.6版本中,内核提供了三种不同形式的下 半部分实现机制:软中断、tasklet和工作队 列。
目录
• 简介 • 历史&发展 • 实现机制
• • • 软中断 Tasklet 工作队列(new)
q_action结构表示,定义在 <include/linux/interrupt.h>中。
Kernel/softirq.c中定义了一个包含有32个 softirq_action数组。每个被注册的软中断都 占据该数组中的一项,最多可有32个软中 断,2.6.24.1内核中可使用其中的8个。
线程的数据结构
• 结构中有一个cpu_workqueue_struct结构 组成的数组,每一项对应一个处理器。由 于每个处理器对应一个工作者线程,所以 对单台计算机来说,每个工作者线程对应 一个这样的cpu_workqueue_struct结构体。
所有的工作者线程都是用普通的内核线程 实现的,它们都要执行worker_tread().在它 初始化完以后,这个函数执行一个列循环 并开始休眠。当有操作被插入到队列里的 时候,线程就会被唤醒,以便执行这些操 作。当没有剩余的操作时,它又会继续休 眠。

linux内核分析笔记----linux内核简介

linux内核分析笔记----linux内核简介

linux内核分析笔记----linux内核简介操作系统的概念我就不细说了。

对于提供保护机制的现代操作来说,内核独立于普通应用程序,它一般处于系统态,拥有受保护的内存空间和访问硬件设备的所有权限,这种系统态和被保护起来的内存空间,统称为内核空间。

相对的,应用程序在用户空间执行,它们只能看到允许它们使用的部分系统资源,并且不能使用某些特定的系统功能,不能直接访问硬件,还有其他一些使用限制。

当内核运行的时候,系统才进入内核空间。

应用程序通过系统调用和内核通信来运行。

应用程序通常调用库函数----比如C库函数-----再由库函数通过系统调用界面让内核代其完成各种不同任务。

在这种情况下,应用程序被称为通过系统调用在内核空间运行,而内核被称为运行于进程上下文中。

内核还要负责管理系统的硬件设备。

当硬件设备想要和系统通信的时候,它首先要发出一个异步的中断信号去打断内核正在执行的工作,中断通常对应着一个中断号,内核通过这个中断号查讯相应的中断服务程序,并调用这个程序响应和处理中断。

为了保证同步,内核可以停用中止---既可以停止所有的中断也可以有选择的停止某个中断号对应的中断。

许多操作系统的中断服务程序都不在进程上下文中执行,它们在一个与所有进程都无关的,专门的中断上下文中运行。

Linux内核和Unix内核的比较这里就不说了,网上一大把,是不。

Linux内核版本(如2.6.32),第一个数字是主版本号;第二个数字是从版本号,偶数代表着稳定版,奇数代表着开发版;第三个是修订版本号;头两个数字在一起描述了内核系列。

内核源代码通常安装在/usr/src/linux子目录中,最好别直接用这里的代码进行开发,因为你的C库通常是根据这个子目录下代码对应的版本进行链接的。

相对于用户空间内应用程序的开发,内核开发有很多不同于用户空间开发的特点。

如下:1.内核编程时不能访问C库.2.内核编程时必须使用GUN C.3.内核编程时缺乏像用户空间那样的内存保护机制.4.内核编程时浮点数很难使用.5.内核只有一个很小的定长堆栈.和并发。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

open_softirq(TASKLET_SOFTIRQ, tasklet_action, NULL); open_softirq(HI_SOFTIRQ, tasklet_hi_action, NULL);
因此,这两个软中断是要被区别对待的。tasklet_action 和tasklet_hi_action 内部实现就是为什么软中断和tasklet 有不同的特性的原因(当然也因为二者的描述符不 同,tasklet 的描述符要比软中断的复杂,也就是说内核设计者自己多做了一部分限制的工作而减少了驱动程序开发者的工作)。 (5 )为什么要使用工作队列work queue ?(work queue 和软中断的区别) 上面我们介绍的可延迟函数运行在中断上下文中(软中断的一个检查点就是do_IRQ 退出的时候),于是导致了一些问题:软中断不能睡眠、不能阻塞。由于中断上 下文出于内核态,没有进程切换,所以如果软中断一旦睡眠或者阻塞,将无法退出这种状态,导致内核会整个僵死。但可阻塞函数不能用在中断上下文中实现,必须 要运行在进程上下文中,例如访问磁盘数据块的函数。因此,可阻塞函数不能用软中断来实现。但是它们往往又具有可延迟的特性。 因此在2.6 版的内核中出现了在内核态运行的工作队列(替代了2.4 内核中的任务队列)。它也具有一些可延迟函数的特点(需要被激活和延后执行),但是能够能够 在不同的进程间切换,以完成不同的工作。
软中断、tasklet 和工作队列并不是Linux 内核中一直存在的机制,而是由更早版本的内核中的“下半部”(bottom half )演变而来。下半部的机制实际上包括五种, 但2.6 版本的内核中,下半部和任务队列的函数都消失了,只剩下了前三者。本文重点在于介绍这三者之间的关系。(函数细节将不会在本文中出现,可以参考文 献,点这里) (1 )上半部和下半部的区别 上半部指的是中断处理程序,下半部则指的是一些虽然与中断有相关性但是可以延后执行的任务。举个例子:在网络传输中,网卡接收到数据包这个事件不一定需要 马上被处理,适合用下半部去实现;但是用户敲击键盘这样的事件就必须马上被响应,应该用中断实现。 两者的主要区别在于:中断不能被相同类型的中断打断,而下半部依然可以被中断打断;中断对于时间非常敏感,而下半部基本上都是一些可以延迟的工作。由于二 者的这种区别,所以对于一个工作是放在上半部还是放在下半部去执行,可以参考下面四条: a )如果一个任务对时间非常敏感,将其放在中断处理程序中执行。 b )如果一个任务和硬件相关,将其放在中断处理程序中执行。 c)如果一个任务要保证不被其他中断(特别是相同的中断)打断,将其放在中断处理程序中执行。 d )其他所有任务,考虑放在下半部去执行。 (2 )为什么要使用软中断? 软中断作为下半部机制的代表,是随着SMP (share memory processor )的出现应运而生的,它也是tasklet 实现的基础(tasklet 实际上只是在软中断的基础上添 加了一定的机制)。软中断一般是“可延迟函数”的总称,有时候也包括了tasklet (请读者在遇到的时候根据上下文推断是否包含tasklet )。它的出现就是因为要满足 上面所提出的上半部和下半部的区别,使得对时间不敏感的任务延后执行,而且可以在多个CPU 上并行执行,使得总的系统效率可以更高。它的特性包括: a )产生后并不是马上可以执行,必须要等待内核的调度才能执行。软中断不能被自己打断,只能被硬件中断打断(上半部)。 b )可以并发运行在多个CPU 上(即使同一类型的也可以)。所以软中断必须设计为可重入的函数(允许多个CPU 同时操作),因此也需要使用自旋锁来保护其数据 结构。 (3 )为什么要使用tasklet?(tasklet和软中断的区别) 由于软中断必须使用可重入函数,这就导致设计上的复杂度变高,作为设备驱动程序的开发者来说,增加了负担。而如果某种应用并不需要在多个CPU 上并行执行, 那么软中断其实是没有必要的。因此诞生了弥补以上两个要求的tasklet 。它具有以下特性: a )一种特定类型的tasklet 只能运行在一个CPU 上,不能并行,只能串行执行。 b )多个不同类型的tasklet 可以并行在多个CPU 上。 c)软中断是静态分配的,在内核编译好之后,就不能改变。但tasklet 就灵活许多,可以在运行时改变(比如添加模块时)。 tasklet 是在两种软中断类型的基础上实现的,但是由于其特殊的实现机制(将在4.3 节详细介绍),所以具有了这样不同于软中断的特性。而由于这种特性,所以降 低了设备驱动程序开发者的负担,因此如果不需要软中断的并行特性,tasklet 就是最好的选择。 (4 )可延迟函数(软中断及tasklet)的使用 一般而言,在可延迟函数上可以执行四种操作:初始化/ 激活/ 执行/ 屏蔽。屏蔽我们这里不再叙述,前三个则比较重要。下面将软中断和tasklet 的三个步骤分别进行对 比介绍。 (4.1 )初始化 初始化是指在可延迟函数准备就绪之前所做的所有工作。一般包括两个大步骤:首先是向内核声明这个可延迟函数,以备内核在需要的时候调用;然后就是调用相应 /microgrape/blog/item/6c851ddcad954e3c5882dde6.html[2011/4/19 10:51:48]
tasklet_schedule( & my_tasklet)
(4.3 )执行 执行就是内核运行可延迟函数的过程,但是执行只发生在某些特定的时刻(叫做检查点,具体有哪些检查点?详见《深入》p.177 )。 每个CPU 上都有一个32 位的掩码__softirq_pending ,表明此CPU 上有哪些挂起(已被激活)的软中断。此掩码可以用local_softirq_pending() 宏获得。所有的挂 起的软中断需要用do_softirq() 函数的一个循环来处理。 而对于tasklet ,由于软中断初始化时,就已经通过下面的语句初始化了当遇到TASKLET_SOFTIRQ/HI_SOFTIRQ 这两个软中断所需要执行的函数:
在\kernel\softirq.c 文件中包括了32 个描述符的数组static struct softirq_action softirq_vec[32] ;但实际上只有前6 个已经被内核注册使用(包括tasklet 使用 的HI_SOFTIRQ/TASKLET_SOFTIRQ 和网络协议栈使用的NET_TX_SOFTIRQ/NET_RX_SOFTIRQ ,还有SCSI 存储和系统计时器使用的两个),剩下的可以由 内核开发者使用。需要使用函数: void open_softirq(int nr, void (*action)(struct softirq_action*), void *data) 初始化数组中索引为nr 的那个元素。需要的参数当然就是action 函数指针以及data 。例如网络子系统就通过以下两个函数初始化软中断 (net_tx_action/net_rx_action 是两个函数):
《深入理解Linux内核》笔记4:软中断/tt 登录
注册
葡萄的技术博客
主要是C++/兼有其他技术。。。
主页
博客
相册
|
个人档案
|
好友
|
i贴吧
查看文章
《深入理解Linux内核》笔记4:软中断/tasklet/工作队列
2009年06月02日 星期二 10:48
其参数分别为描述符,需要调用的函数和此函数的参数—必须是unsigned long 类型。也需要用户自己写一个类似net_tx_action 的函数指针func 。初始化最终生成的 结果就是一个实际的描述符,假设为my_tasklet (将在下面用到)。 (4.2 )激活 激活标记一个可延迟函数为挂起(pending )状态,表示内核可以调用这个可延迟函数(即使在中断过程中也可以激活可延迟函数,只不过函数不会被马上执行); 这种情况可以类比处于TASK_RUNNING 状态的进程,处在这个状态的进程只是准备好了被CPU 调度,但并不一定马上就会被调度。 软中断使用raise_softirq() 函数激活,接收的参数就是上面初始化时用到的数组索引nr 。 tasklet 使用tasklet_schedule() 激活,该函数接受tasklet 的描述符作为参数,例如上面生成的my_tasklet :
open_softirq(NET_TX_SOFTIRQ,net_tx_action); open_softirq(NET_RX_SOFTIRQ,net_rx_action);
这样初始化完成后实际上就完成了一个一一对应的关系:当内核中产生到NET_TX_SOFTIRQ 软中断之后,就会调用net_tx_action 这个函数。 tasklet 则可以在运行时定义,例如加载模块时。定义方式有两种: 静态声明
/microgrape/blog/item/6c851ddcad954e3c5882dde6.html[2011/4/19 10:51:48]
《深入理解Linux内核》笔记4:软中断/t| 分享到i贴吧 | 浏览(2131) | 评论 (1) 下一篇:Linux Cross Reference Linux内...
上一篇:《深入理解Linux内核》笔记3:中...
已有3人分享了这篇文章:
gjzhangjian Ta的分享
zkj3e Ta的分享
neversaynot Ta的分享
网友评论:
1 2010年11月24日 星期三 14:13 | 回复 很好 emmix
发表评论:
内 容:发表评论?2011 ຫໍສະໝຸດ
/microgrape/blog/item/6c851ddcad954e3c5882dde6.html[2011/4/19 10:51:48]
DECLARE_TASKET(name, func, data) DECLARE_TASKLET_DISABLED(name, func, data)
动态声明
void tasklet_init(struct tasklet_struct * t, void ( * func)(unsigned long ), unsigned long data)
相关文档
最新文档