• 在armv7中:spin_lock调用了wfe指令,让cpu进入低功耗状态;在spin_unlock中调用了sev指令,让cpu退出低功耗模式;
  • 在armv8中,spin_lock调用了wfe指令,让cpu进入低功耗状态; 在spin_unlock中确删除了sev指令,为什么这样呢?

我们在armv8的文档中找到答案:

stlrh是带有释放语义的存储指令,会改变global monitor的状态,等效于sevl指令

附上armv7和armv8的spin_lock和spin_unlock的底层代码:
(armv7)

(linux/arch/arm/asm/spinlock.h)
static inline void arch_spin_lock(arch_spinlock_t *lock)
{unsigned long tmp;u32 newval;arch_spinlock_t lockval;prefetchw(&lock->slock);__asm__ __volatile__(
"1:    ldrex   %0, [%3]\n"
"  add %1, %0, %4\n"
"  strex   %2, %1, [%3]\n"
"  teq %2, #0\n"
"  bne 1b": "=&r" (lockval), "=&r" (newval), "=&r" (tmp): "r" (&lock->slock), "I" (1 << TICKET_SHIFT): "cc");while (lockval.tickets.next != lockval.tickets.owner) {wfe();lockval.tickets.owner = ACCESS_ONCE(lock->tickets.owner);}smp_mb();
}
static inline void arch_spin_unlock(arch_spinlock_t *lock)
{smp_mb();lock->tickets.owner++;dsb_sev();
}

(armv8)

(linux/arch/arm64/asm/spinlock.h)
static inline void arch_spin_lock(arch_spinlock_t *lock)
{unsigned int tmp;arch_spinlock_t lockval, newval;asm volatile(/* Atomically increment the next ticket. */ARM64_LSE_ATOMIC_INSN(/* LL/SC */
"  prfm    pstl1strm, %3\n"
"1:    ldaxr   %w0, %3\n"
"  add %w1, %w0, %w5\n"
"  stxr    %w2, %w1, %3\n"
"  cbnz    %w2, 1b\n",/* LSE atomics */
"  mov %w2, %w5\n"
"  ldadda  %w2, %w0, %3\n"
"  nop\n"
"  nop\n"
"  nop\n")/* Did we get the lock? */
"  eor %w1, %w0, %w0, ror #16\n"
"  cbz %w1, 3f\n"/** No: spin on the owner. Send a local event to avoid missing an* unlock before the exclusive load.*/
"  sevl\n"
"2:    wfe\n"
"  ldaxrh  %w2, %4\n"
"  eor %w1, %w2, %w0, lsr #16\n"
"  cbnz    %w1, 2b\n"/* We got the lock. Critical section starts here. */
"3:": "=&r" (lockval), "=&r" (newval), "=&r" (tmp), "+Q" (*lock): "Q" (lock->owner), "I" (1 << TICKET_SHIFT): "memory");
}static inline void arch_spin_unlock(arch_spinlock_t *lock)
{unsigned long tmp;asm volatile(ARM64_LSE_ATOMIC_INSN(/* LL/SC */" ldrh    %w1, %0\n""   add %w1, %w1, #1\n""  stlrh   %w1, %0",/* LSE atomics */"   mov %w1, #1\n""   nop\n""   staddlh %w1, %0"): "=Q" (lock->owner), "=&r" (tmp):: "memory");
}

linux kernel的spinlock在armv7和armv8中的不同相关推荐

  1. linux kernel的spinlock代码导读和分析

    文章目录 一.代码阅读分析 0.spin lock调用流程图 1.再kernel中调用spi_lock()或spin_unlock函数 2.调用raw_spin_lock()和raw_spin_unl ...

  2. ARMv7和ARMv8中关于内存访问的汇编指令总结对比

    ARMv7和ARMv8中关于内存访问的汇编指令总结对比 文章目录 ARMv7和ARMv8中关于内存访问的汇编指令总结对比 前言 ARMv7下的内存访问指令 寻址模式 多加载/存储 ARMv8下的内存访 ...

  3. linux kernel 4.4,在Ubuntu 16.04中使用Linux Kernel 4.4内核的用户请注意修复漏洞

    如果你在 Ubuntu 16.04 LTS 操作系统中使用 Linux Kernel 4.4 内核,请注意更新系统,以安装修复安全漏洞,它适合 Ubuntu 16.04 LTS 及其 Ubuntu 1 ...

  4. linux kernel基本构成的内容有下列哪些项_Linux_GUI加速(2)_Linux中的DRM-KMS分析

    在上一小节<Linux GUI加速(1)_GUI系统概述>中,我们从应用层到kernel层大致分析了linux中的图形界面的构成,并在最后给出了kernel中DRM+KMS的软件显示框架以 ...

  5. Android和Linux kernel发展史

    Android和Linux kernel发展史(BY 夕つ云 整理) 英文名 中文名 Android系统版本 发布时间 Linux kernel内核版本 备注 Astro 铁臂阿童木 Android  ...

  6. Linux Kernel 5.8 发布,华为内核代码贡献全球持续领先

    近日, Linux Kernel 5.8 版本正式发布,Linus 表示 Linux Kernel 5.8 是"有史以来最大的发行版之一".Linux Kernel 5.8 在 A ...

  7. ?Android和Linux kernel发展史(BY 夕つ云 整理)

    http://www.eetop.cn/blog/html/52/51552-44700.html Android和Linux kernel发展史(BY 夕つ云 整理) 英文名 中文名 Android ...

  8. Linux kernel分支管理与维护

    mainline分支维护 Linux kernel的主线分支只有一个master分支,该分支由Linus Torvalds维护,对于不同的版本的内核是采用打tag的方式进行发布的,一般在发布一个正式版 ...

  9. [architecture]-ARMV7架构下Linux Kernel的Userspace进程切换时保存和恢复哪些寄存器

    ★★★ 个人博客导读首页-点击此处 ★★★ . 文章目录 1.armv7的通用寄存器简介 2.寄存器的保存和恢复 3.Linux Kernel参考代码 1.armv7的通用寄存器简介 ARMV7处理器 ...

最新文章

  1. C# CreateParams的使用(解决闪屏问题)
  2. 热点的ap频段哪个快_WLAN中无线AP信道的划分
  3. 战斗系统的伪原创工具
  4. 周志华团队 | TensorFlow开源决策森林库TF-DF
  5. PySpark任务在YARN集群上运行python 算法
  6. FragmentPagerAdapter.notifyDataSetChanged()不能更新问题?
  7. AI 人工智能学习之微积分
  8. property java_java-必须为元素类型“ property”声明属性“...
  9. 苹果开发者账号开启双重认证步骤
  10. java实现正态分布累积分布_标准正态分布变量的累积概率分布函数
  11. 上市公司关于年报、半年报、季报及其公布时间的一些知识
  12. JEOL:发布新的扫描电子显微镜JSM-IT700HR
  13. Vue3的reactive函数
  14. 怎样学好编程(个人编程感受)!
  15. 远程服务器返回urlto龙,,一个简单的Get请求 老是出现【远程服务器返回异常:501】错误...
  16. UE4_C++中声明代理传入数组参数
  17. 微信(WeChat web page)
  18. 禁止乐播投屏PC2.1版升级
  19. 一、实现欢迎界面和游戏背景图的滚动(雷霆战机)
  20. 电玩世界——青龙羊毛

热门文章

  1. 未来数据中心运营将靠人工智能和机器学习
  2. mysql sqlserver分页_SQLServer常用分页方式
  3. 成功解决将python的列表格式输出数值(如pandas.read_excel().describe()),批量转到表格内daiding
  4. CNN之性能指标:卷积神经网络中常用的性能指标(IOU/AP/mAP、混淆矩阵)简介、使用方法之详细攻略
  5. 成功解决Visual Studio 2015安装时,点击vs_community.exe 没有反应
  6. Algorithm:C++语言实现之概率算法相关问题(计算机中的概率事件、C语言中的随机事件、产生二维随机数、圆内均匀取点)
  7. Py之dominate:python的dominate库的简介、安装、使用方法之详细攻略
  8. 371. 两整数之和
  9. Django 【补充】ORM多对多正向查询
  10. 开源物联网通讯框架ServerSuperIO,成功移植到Windows10 IOT,在物联网和集成系统建设中降低成本。附:“物联网”交流大纲...