Chinaunix首页 | 论坛 | 博客
  • 博客访问: 25171
  • 博文数量: 4
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 55
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-24 10:45
文章分类
文章存档

2008年(4)

我的朋友
最近访客

分类: LINUX

2008-07-31 20:30:12

local_irq_disable()用来禁止本地cpu的中断;

local_irq_disable()  

函数主要干了两件事情:

#define local_irq_disable() \
        do { raw_local_irq_disable(); trace_hardirqs_off(); } while (0)

 


static void (void)

{

        unsigned long = ();

        (( & ~) | );

}

保存cpu flags的值;当中断处理程序返回是再恢复到寄存器中;
2) trace_hardirqs_off();

 

void (void)
{
        struct  *curr = current;
        if ((! || current->lockdep_recursion))
                return;
        if ((!()))
                return;
        if (curr->) {
                /*
                 * We have done an ON -> OFF transition:
                 */
                curr-> = 0;
                curr-> = ;
                curr-> = ++curr->;
                (&);
        } else
                (&);
}

可以看到经过系列的判断,最终的操作还是集中在 if (curr->):
如果硬件断是打开的,则对
struct *curr = current;执行后面的一系列操作:
  = 0;,硬件中断关标志,
  = 此项记录的应该是引起中断的进程;
= ++curr->;
则是记录的引起中断发生的事件;
以上操作将硬件中断关掉.
 

一些关于原子操作的....

 * @v: pointer of type atomic_t
 * 
 * Atomically adds @i to @v.
 */
static  void (int ,  *)
{
         (
                 "addl %1,%0"
                :"+m" (->)
                :"ir" ());
}
 

其中lock是一个指令前缀,Intel的手册上对其的解释是:

Causes the processor's LOCK# signal to be asserted during execution of the accompanying instruction (turns the instruction into an atomic instruction). In a multiprocessor environment, the LOCK# signal insures that the processor has exclusive use of any shared memory while the signal is asserted.

也就是说lock会使紧跟在其后面的指令变成 atomic instruction。在执行该指令是暂时的锁一下总线,
指令执行完了,总线就解锁了! 相同的如
static void (int , *)等对
整型原子数的操作都是通过 lock 前缀来实现的;

 

 

阅读(3263) | 评论(1) | 转发(2) |
0

上一篇:7.30

下一篇:等待队列分析

给主人留下些什么吧!~~

chenjifeng2008-08-02 08:48:09

受益匪浅