Linux内核源码分析(七)--start_kernel之local_irq_disable



local_irq_disable的定义有两处,和跟踪调试有关,由CONFIG_TRACE_IRQFLAGS_SUPPORT宏开关加以区分,当关闭这个宏的时候我怀疑2.6的内核定义是颠倒的,翻看最新的4.14.15的内核发现果然是定义颠倒了。不过我们主要关注的是宏开关打开后的定义。

local_irq_disable宏定义在include/linux/irqflags.h文件中。

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

而raw_local_irq_disable宏定义在include/asm-arm/irqflags.h文件中,跟arm版本有关,由__LINUX_ARM_ARCH__加以区分。

#if __LINUX_ARM_ARCH__ >= 6

#define raw_local_irq_disable() __asm__("cpsid i        @ __cli" : : : "memory", "cc")

#else

#define raw_local_irq_disable()                                 \
        ({                                                      \
                unsigned long temp;                             \
        __asm__ __volatile__(                                   \
        "mrs    %0, cpsr                @ local_irq_disable\n"  \
"       orr     %0, %0, #128\n"                                 \
"       msr     cpsr_c, %0"                                     \
        : "=r" (temp)                                           \
        :                                                       \
        : "memory", "cc");                                      \
        }

#endif

看来使用的指令不一样,不过都是操作cpsr寄存器的I标志位。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值