spinlock的TAS、TTAS、ticket实现详见https://blog.csdn.net/david_henry/article/details/5405093/
queued spinlock详见https://blog.csdn.net/y33988979/article/details/102676849

下面详细介绍一下ticket的汇编实现。
内嵌汇编基础知识:https://blog.csdn.net/qq_41961459/article/details/104518801

ticket

static __always_inline void __ticket_spin_lock(raw_spinlock_t *lock)
{short inc = 0x0100;   // next为1,owner为0asm volatile (LOCK_PREFIX "xaddw %w0, %1/n"   // xaddw指%w0 = %1和%1 += %w0同时进行。LOCK_PREFIX让xaddw是原子的。%w0表示第0个input (inc)的低16位。%1表示第1个input (lock->slock)。总的意思就是inc = lock->slock和++lock->slock.next同时进行。"1:/t"    // 标号"cmpb %h0, %b0/n/t"  // 比较inc的高8位(next)和低8位(owner)"je 2f/n/t"  // 如果相等则跳转到下面的标号2,其中f代表forward。"rep ; nop/n/t" // 相当于pause。详见http://blog.sina.com.cn/s/blog_4bbf98c00100ysdq.html"movb %1, %b0/n/t"  // inc.owner = lock->slock.owner/* don't need lfence here, because loads are in-order */"jmp 1b/n"   // 跳到上面的标号1。其中b代表backward。"2:": "+Q" (inc), "+m" (lock->slock)   // 两个input。+表示读写,Q在x86中表示寄存器a、b、c或者d。:: "memory", "cc");    // memory表示内存屏障(可是这里为什么要内存屏障呢?)。cc表示修改了标志寄存器。
}

xaddw文档:https://www.felixcloutier.com/x86/xadd
Q在x86中表示寄存器a、b、c或者d:https://www.cnblogs.com/cposture/p/9029043.html

linux kernel spinlock ticket汇编实现解读相关推荐

  1. linux kernel中的virt_to_phys代码解读

    假设VA_BITS = 48 (虚拟地址有效位), 那么kernel space的虚拟地址是:0xffff_0000_0000_0000 - 0xffff_ffff_ffff_ffff, usersp ...

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

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

  3. Linux Kernel 5.14 arm64异常向量表解读-中断处理解读

    ★★★ 个人博客导读首页-点击此处 ★★★ . 说明: 在默认情况下,本文讲述的都是ARMV8-aarch64架构,linux kernel 5.14 文章目录 1.armv8-aarch64的异常向 ...

  4. linux kernel中local_irq_disable()、local_irq_enable()代码解读

    在armv8-arch64架构下,控制cpu是否响应IRQ,FIQ,SERROR,DEBUG中断,是由PSTATUS(daif寄存器)控制的. 在armv8-arch32或armv7架构下,控制cpu ...

  5. linux kernel的spin_lock的详细介绍(以arm64为例)

    1.spin_lock的调用流程: static __always_inline void spin_lock(spinlock_t *lock) {raw_spin_lock(&lock-& ...

  6. Linux kernel log与调试

    一.内核日志基本框架 1.内核日志通过printk函数实现的,它与用户空间对应的函数printf具有同样的作用, 内核会创建一个__log_buf环形缓冲区保存日志信息,定义在[kernel/prin ...

  7. 【linux kernel】基于ARM64分析linux内核的链接脚本vmlinux.lds.S

    文章目录 一.导读 二.链接器是什么 三.链接脚本 四.linux内核的链接脚本 4-1 头文件包含描述 4-2 参数设置和宏定义描述 4-3 SECTIONS内容分析 五.linux内核的" ...

  8. 【Linux kernel】自旋锁和互斥锁

    内核当发生访问资源冲突的时候,可以有两种锁的解决方案选择: 一个是原地等待 一个是挂起当前进程,调度其他进程执行(睡眠) Linux内核提供了自旋锁和互斥锁的机制,两者都能保证在同一时刻只有一个执行单 ...

  9. linux kernel的中断子系统之(三):IRQ number和中断描述符【转】

    转自:http://www.wowotech.net/linux_kenrel/interrupt_descriptor.html 一.前言 本文主要围绕IRQ number和中断描述符(interr ...

最新文章

  1. 用Spotlight on windows 实时监控Windows服务器性能
  2. 开发日记-20190430 关键词 apt,aspectj,javassist
  3. ubuntu14.04无法连接有线连接问题
  4. 直播 | AAAI 2021:如何缓解GNN预训练和微调之间的优化误差?
  5. Codeforces Round #233 (Div. 2)D. Painting The Wall 概率DP
  6. 清华大学《操作系统》(六):非连续内存分配 段式、页式、段页式存储管理
  7. 阿里云神龙团队拿下TPCx-BB排名第一的背后技术
  8. [转载]在ASP.NET MVC中,使用Bundle来打包压缩js和css
  9. POJ2083-Fractal
  10. Golang sha256 加密,PHP hash_hmac(‘sha256‘, $string, $key)加密,Js CryptoJS.HmacSHA256(string, key) 加密
  11. java.lang.String中的replace方法到底替换了一个还是全部替换了
  12. 阿里云服务器搭建fastdfs
  13. coreldraw x5 选择工具快捷键_coreldraw x5快捷键大全 coreldraw快捷键分享
  14. 通达信【波段底部机会】副图指标公式 操盘行情线 重心买入 源码
  15. 叉积 微分 恒等式_一个斜三角中的恒等式
  16. 力扣:647. 回文子串
  17. 基于Android Tiny4412平台---敦泰I2C接口FT5X06电容屏驱动原理及软件架构分析
  18. python定时导出已发送文件_Python链接数据库查询导出查询结果到Excel并定时发送邮件到指定邮箱,实现巡检功能(亲测可用!!!)...
  19. React 中使用 render props
  20. 嵌入式工程师“中年危机”应对策略上

热门文章

  1. 运维成本降低 50%,丽迅物流是如何应对大规模容器镜像管理挑战的
  2. OSChina 周四乱弹 —— 史上最强作死
  3. 8.介绍和weapp的搭建
  4. 小程序使用vant/weapp
  5. 数字图像处理,若干图像质量评价指标的实现
  6. JS教程之 JavaScript 框架之战已经结束,而且只有一个赢家
  7. ELK集群+Kafka集群+FileBeat——命运多舛的安装采坑之路
  8. Amazon Simple Storage Service介绍
  9. github 绑定阿里云购买的域名,步骤梗概
  10. 计算机不能启动 如何排除故障,电脑开机屏幕界面无法启动的故障排除