linux tasklet 2
http://hi.baidu.com/j_fo/blog/item/7412bb018deab109728da572.html
Linux内核 irq/soft irq/tasklet/同步
2009-10-08 21:22
1.中断处理程序结束之前,不允许产生相同的中断事件;(禁用PIC上该中断,但可以产生其他中断)
2.中断处理程序、软中断、tasklet既不可被抢占也不能被阻塞,最多发生中断嵌套;
3.执行中断处理的内核路径不能被执行延迟函数或系统调用服务例程的内核控制路径中断。
于是有如下结论:
a.中断处理程序和tasklet不必是可重入的;
b.仅被软中断和tasklet访问的每CPU变量不需要同步;
c.仅被一种tasklet访问的数据不需要同步。
软中断(即便是同一种类型的软中断)可以并发地运行在多个CPU上。
同类型的tasklet总是被串行化执行,不会在两个CPU上同时运行相同类型的tasklet。
一个tasklet可以被调度多次,但实际只会运行一次。
static inline void tasklet_schedule(struct tasklet_struct *t)
{
if (!test_and_set_bit
(TASKLET_STATE_SCHED, &t->state))
__tasklet_schedule(t);
}
另外参见do_softirq > _do_softirq > tasklet_action
一个中断处理程序既可以抢占其他的中断处理程序,也可以抢占异常处理程序;
异常处理程序从不抢占中断处理程序;
中断处理程序从不执行可导致缺页的操作(意味着进程切换);
中断处理程序必须永不阻塞,即不发生进程切换!
如果一个数据结构仅被中断程序“上半部分”访问,访问数据结构就无需任何同步,因为每个中断处理程序都相对于自己串行的执行。
如果多个中断处理程序访问一个数据结构,在单处理器上,必须在中断处理程序的所有临界区上禁止中断来避免竞争;在多处理器上,必须禁止本地中断,并获取保护数据结构的自旋锁或读写锁。
软中断是可重入函数,必须明确使用自旋锁保护结构数据(因为可能在多个CPU上同时执行);
如果某个中断程序“上半部分”也会访问该数据结构,则必须在拥有自旋锁的时候禁止中断,以免死锁!
仅由一种tasklet访问的数据结构不需要保护,因为同种tasklet不能并发运行。
关于tasklet的一点说明:
1.前述的一种或一个tasklet,都是指一个,以tasklet结构体的内存地址区分,不同地址的tasklet即为不同的tasklet,即使两个
tasklet结构体的func指针指向同一个中断设备的同一个延迟处理函数,甚至内容完全相等,都算作不同(种类)的tasklet,就需要处理同时执
行时的同步操作问题;(包括《
相关文档:
我正在学习写linux device driver for embedded system.
我有一个linux嵌入式设备,也有这个设备的linux源代码。也有cross compiler tool chain.
第一步,就是写一个简单的hello模块,然后装到设备中。以验证我这个开发环境。
在网上搜索了一下, how to cross compile linux device driver
发现在linux代码根目录的Mak ......
ip 是个命令, ip 命令的功能很多!基本上它整合了 ifconfig 与 route 这两个命令,不过ip 的功能更强大! 如果您有兴趣的话,请自行 vi /sbin/ifup 就知道整个 ifup 就是利用 ip 这个命令来实现的。下面介绍一下使用方法
[root@linux ~]# ip [option] [动作] [命令]
参数:
option :设定的参数,主要有:
  ......
打开 /etc/sysconfig/i18n
输入
LANG="zh_CN.GB2312"
LANGUAGE="zh_CN.GB18030:zh_CN.GB2312:zh_CN"
SUPPORTED="zh_CN.GB18030:zh_CN:zh:en_US.UTF-8:en_US:en"
SYSFONT="lat0-sun16"
好了 ......
在VFS的支持下,用户态进程读写任何类型的文件系统都可以使用read和write着两个系统调用,但是在linux内核中没有这样的系统调用我们如何操作文件呢?我们知道read和write在进入内核态之后,实际执行的是sys_read和sys_write,但是查看内核源代码,发现这些操作文件的函数都没有导出(使用EXPORT_SYMBOL导出),也就是说在内核 ......