linux kernel的spinlock在armv7和armv8中的不同
- 在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中的不同相关推荐
- linux kernel的spinlock代码导读和分析
文章目录 一.代码阅读分析 0.spin lock调用流程图 1.再kernel中调用spi_lock()或spin_unlock函数 2.调用raw_spin_lock()和raw_spin_unl ...
- ARMv7和ARMv8中关于内存访问的汇编指令总结对比
ARMv7和ARMv8中关于内存访问的汇编指令总结对比 文章目录 ARMv7和ARMv8中关于内存访问的汇编指令总结对比 前言 ARMv7下的内存访问指令 寻址模式 多加载/存储 ARMv8下的内存访 ...
- 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 ...
- linux kernel基本构成的内容有下列哪些项_Linux_GUI加速(2)_Linux中的DRM-KMS分析
在上一小节<Linux GUI加速(1)_GUI系统概述>中,我们从应用层到kernel层大致分析了linux中的图形界面的构成,并在最后给出了kernel中DRM+KMS的软件显示框架以 ...
- Android和Linux kernel发展史
Android和Linux kernel发展史(BY 夕つ云 整理) 英文名 中文名 Android系统版本 发布时间 Linux kernel内核版本 备注 Astro 铁臂阿童木 Android ...
- Linux Kernel 5.8 发布,华为内核代码贡献全球持续领先
近日, Linux Kernel 5.8 版本正式发布,Linus 表示 Linux Kernel 5.8 是"有史以来最大的发行版之一".Linux Kernel 5.8 在 A ...
- ?Android和Linux kernel发展史(BY 夕つ云 整理)
http://www.eetop.cn/blog/html/52/51552-44700.html Android和Linux kernel发展史(BY 夕つ云 整理) 英文名 中文名 Android ...
- Linux kernel分支管理与维护
mainline分支维护 Linux kernel的主线分支只有一个master分支,该分支由Linus Torvalds维护,对于不同的版本的内核是采用打tag的方式进行发布的,一般在发布一个正式版 ...
- [architecture]-ARMV7架构下Linux Kernel的Userspace进程切换时保存和恢复哪些寄存器
★★★ 个人博客导读首页-点击此处 ★★★ . 文章目录 1.armv7的通用寄存器简介 2.寄存器的保存和恢复 3.Linux Kernel参考代码 1.armv7的通用寄存器简介 ARMV7处理器 ...
最新文章
- C# CreateParams的使用(解决闪屏问题)
- 热点的ap频段哪个快_WLAN中无线AP信道的划分
- 战斗系统的伪原创工具
- 周志华团队 | TensorFlow开源决策森林库TF-DF
- PySpark任务在YARN集群上运行python 算法
- FragmentPagerAdapter.notifyDataSetChanged()不能更新问题?
- AI 人工智能学习之微积分
- property java_java-必须为元素类型“ property”声明属性“...
- 苹果开发者账号开启双重认证步骤
- java实现正态分布累积分布_标准正态分布变量的累积概率分布函数
- 上市公司关于年报、半年报、季报及其公布时间的一些知识
- JEOL:发布新的扫描电子显微镜JSM-IT700HR
- Vue3的reactive函数
- 怎样学好编程(个人编程感受)!
- 远程服务器返回urlto龙,,一个简单的Get请求 老是出现【远程服务器返回异常:501】错误...
- UE4_C++中声明代理传入数组参数
- 微信(WeChat web page)
- 禁止乐播投屏PC2.1版升级
- 一、实现欢迎界面和游戏背景图的滚动(雷霆战机)
- 电玩世界——青龙羊毛
热门文章
- 未来数据中心运营将靠人工智能和机器学习
- mysql sqlserver分页_SQLServer常用分页方式
- 成功解决将python的列表格式输出数值(如pandas.read_excel().describe()),批量转到表格内daiding
- CNN之性能指标:卷积神经网络中常用的性能指标(IOU/AP/mAP、混淆矩阵)简介、使用方法之详细攻略
- 成功解决Visual Studio 2015安装时,点击vs_community.exe 没有反应
- Algorithm:C++语言实现之概率算法相关问题(计算机中的概率事件、C语言中的随机事件、产生二维随机数、圆内均匀取点)
- Py之dominate:python的dominate库的简介、安装、使用方法之详细攻略
- 371. 两整数之和
- Django 【补充】ORM多对多正向查询
- 开源物联网通讯框架ServerSuperIO,成功移植到Windows10 IOT,在物联网和集成系统建设中降低成本。附:“物联网”交流大纲...