同步机制

  • 1、spin-lock
  • 2、mutex
  • 3、condvar
  • 4、optee的disable irq/enable irq操作

★★★ 友情链接 : 个人博客导读首页—点击此处 ★★★

optee的同步方法有三种:spin-lock, mutex, and condvar

1、spin-lock

在使用cpu_spin_lock之前,需先关闭foreign interrupt,如果不关闭则会assert

static inline void cpu_spin_lock(unsigned int *lock)
{cpu_spin_lock_no_dldetect(lock);
}static inline void cpu_spin_lock_no_dldetect(unsigned int *lock)
{assert(thread_foreign_intr_disabled());__cpu_spin_lock(lock);spinlock_count_incr();
}

aarch32

(core/arch/arm/kernel/spin_lock_a32.S)
/* void __cpu_spin_lock(unsigned int *lock) */
FUNC __cpu_spin_lock , :
UNWIND( .fnstart)mov r2, #SPINLOCK_LOCK
1:ldrex r1, [r0]cmp r1, #SPINLOCK_UNLOCKwfenestrexeq r1, r2, [r0]cmpeq r1, #0bne 1bdmbbx lr
UNWIND( .fnend)
END_FUNC __cpu_spin_lock/* void __cpu_spin_unlock(unsigned int *lock) */
FUNC __cpu_spin_unlock , :
UNWIND( .fnstart)dmbmov r1, #SPINLOCK_UNLOCKstr r1, [r0]dsbsevbx lr
UNWIND( .fnend)
END_FUNC __cpu_spin_unlock

aarch64

(core/arch/arm/kernel/spin_lock_a64.S)
/* void __cpu_spin_lock(unsigned int *lock); */
FUNC __cpu_spin_lock , :mov w2, #SPINLOCK_LOCKsevl
l1: wfe
l2: ldaxr   w1, [x0]cbnz    w1, l1stxr  w1, w2, [x0]cbnz    w1, l2ret
END_FUNC __cpu_spin_lock/* void __cpu_spin_unlock(unsigned int *lock); */
FUNC __cpu_spin_unlock , :stlr  wzr, [x0]ret
END_FUNC __cpu_spin_unlock

2、mutex

void mutex_unlock(struct mutex *m)
{__mutex_unlock(m, NULL, -1);
}void mutex_lock(struct mutex *m)
{__mutex_lock(m, NULL, -1);
}static void __mutex_lock(struct mutex *m, const char *fname, int lineno)
{assert_have_no_spinlock();assert(thread_get_id_may_fail() != -1);assert(thread_is_in_normal_mode());while (true) {uint32_t old_itr_status;bool can_lock;struct wait_queue_elem wqe;int owner = MUTEX_OWNER_ID_NONE;/** If the mutex is locked we need to initialize the wqe* before releasing the spinlock to guarantee that we don't* miss the wakeup from mutex_unlock().** If the mutex is unlocked we don't need to use the wqe at* all.*/old_itr_status = cpu_spin_lock_xsave(&m->spin_lock);can_lock = !m->state;if (!can_lock) {wq_wait_init(&m->wq, &wqe, false /* wait_read */);owner = m->owner_id;assert(owner != thread_get_id_may_fail());} else {m->state = -1; /* write locked */thread_add_mutex(m);}cpu_spin_unlock_xrestore(&m->spin_lock, old_itr_status);if (!can_lock) {/** Someone else is holding the lock, wait in normal* world for the lock to become available.*/wq_wait_final(&m->wq, &wqe, m, owner, fname, lineno);} elsereturn;}
}static void __mutex_unlock(struct mutex *m, const char *fname, int lineno)
{uint32_t old_itr_status;assert_have_no_spinlock();assert(thread_get_id_may_fail() != -1);old_itr_status = cpu_spin_lock_xsave(&m->spin_lock);if (!m->state)panic();thread_rem_mutex(m);m->state = 0;cpu_spin_unlock_xrestore(&m->spin_lock, old_itr_status);wq_wake_next(&m->wq, m, fname, lineno);
}

3、condvar

condvar_wait()
condvar_signal()
condvar_broadcast()

4、optee的disable irq/enable irq操作

thread_mask_exceptions()
thread_unmask_exceptions()

(1)、先看一个示例

void core_mmu_set_user_map(struct core_mmu_user_map *map)
{uint32_t exceptions = thread_mask_exceptions(THREAD_EXCP_ALL);  //相当于linux的local_irq_disable()/** Update the reserved Context ID and TTBR0*/dsb();  /* ARM erratum 754322 */write_contextidr(0);isb();if (map) {write_ttbr0(map->ttbr0);isb();write_contextidr(map->ctxid);isb();} else {write_ttbr0(read_ttbr1());isb();}tlbi_all();/* Restore interrupts */thread_unmask_exceptions(exceptions);  //相当于linux的local_irq_enable()
}
```c

[私]-optee的同步方法相关推荐

  1. OP-TEE基本的从芯片设计到给客户的安全问题浅析

    0  preface 基本概念缩写 TEE   Trusted Execution Environment   可信执行环境,通常用来进行数字版权管理(DRM : Digital Rights Man ...

  2. 程序员接私活经验谈[转]

    此为转帖,编辑手下留情,我认为很不错,值得分享! 关键字:程序员 私活 经验 外包 作者:  row@csdn 标题:个人外包项目全记 - Best Partner 地址:http://www.cnb ...

  3. OPTEE:TA和TA加载(一)

    前言 最近老师给了个作业,让做一下TA的镜像校验,而我是什么都不知道?甚至以前都没听过这个.于是将这个任务拆分成了三个部分,最后也就是学习的三篇笔记. TA动态加载流程是什么? TA验签流程是什么? ...

  4. 在Chrome中打开网页时出现以下问题 您的连接不是私密连接 攻击者可能会试图从 x.x.x.x 窃取您的信息(例如:密码、通讯内容或信用卡信息)

    现象:在Chrome中打开网页时出现以下问题 您的连接不是私密连接 攻击者可能会试图从 x.x.x.x 窃取您的信息(例如:密码.通讯内容或信用卡信息). 当点开"了解详情"后显示 ...

  5. @echo off是什么意思_参加CHANEL私享派对是什么体验?Lanvin头一次在中国办大秀??「每周时报」...

    参加CHANEL私享派对是什么体验? 一场与CHANEL的秋日约会 这周,芭姐受邀参加了CHANEL举办的超治愈ME-TIME"私享时间"主题活动,在专属于自己的时间里,用一种更具 ...

  6. Swing 实现聊天系统 私发与群发

    该系统使用的了socket.swing相关知识,实现了一个简单的群聊和私聊的系统. 1.程序界面功能展示 服务端swing界面展示 客户端服务展示 用户上线与发送消息客户端与服务端 私发消息 相关代码 ...

  7. 源同步方法与注意事项

    2021年的信息安全攻防演练比2020年来的稍早了一些,还是一样的配方,还是一样的味道.检查单位的YUM源,发现没有CentOS 7.9的,排查后发现原来是中科大的rsync同步地址放生了变化,导致源 ...

  8. 以太坊公链私链_如何使用以太坊构建汽车制造供应链系统

    以太坊公链私链 by Marcelo Russi Mergulhão 由Marcelo RussiMergulhão 如何使用以太坊构建汽车制造供应链系统 (How to build a car ma ...

  9. 搭建私有npm私库(使用verdaccio)

    一.为什么要搭建npm私库 原因: 1)公司内部开发的私有包,统一管理,方便开发和使用: 2)安全性,由于公司内部开发的模块和一些内容并不希望其他无关人员能够看到,但是又希望内部能方便使用: 3)加速 ...

最新文章

  1. js 为什么0.1+0.2不等于0.3
  2. 电话光端机的电话接口类型有哪些?
  3. MVVM模式的一个小例子
  4. 【比赛分享】互联网新闻情感分析复赛top8(8/2745)解决方案及总结
  5. [转]利用C#操作配置文件
  6. 台达plc自由口通讯_台达PLC串行通讯及应用案例
  7. 联通托管服务器为什么打不开网页,为什么有些网页联通宽带打不开,移动4G能打开?...
  8. 在线评判系统java代码_sojV1.0 Online Judge System 在线评判系统是一个 联合开发网 - pudn.com...
  9. router-vue中meta参数
  10. 分析bootstrap class path not set in conjunction with -source 1.6
  11. Mapbox3D特效(立体闪光墙)
  12. 我绘制文章插图的三个神级工具
  13. 上海云盾技术贴趣味性讲解DDoS防御
  14. 关于正则表达式中的 lookahead
  15. 孕期、哺乳期吃海鲜注意事项----一洲服务
  16. 短视频系统源代码,自定义圆盘,方向盘
  17. 中国筒仓罐市场现状研究分析与发展前景预测报告(2022)
  18. 海报设计如何做好文案超多的海报
  19. linux下获取文件大小
  20. linux网卡恢复默认配置,Linux网卡的配置

热门文章

  1. python opencv resize函数_Python OpenCV中的resize()函数的使用
  2. UPS 异常停机案例分析
  3. “挖空三座山、装了几万台服务器”的绿色数据中心
  4. 编程笔试(解析及代码实现):猴子吃桃。猴子第一天吃了若干个桃子,当即吃了一半,还不解馋,又多吃了一个…的C++、Java、Python、C#等语言代码实现
  5. 成功解决getaddrinfo:请求的名称有效,但是找不到请求的类型的数据。(11004
  6. Py之keras-resnet:keras-resnet的简介、安装、使用方法之详细攻略
  7. ML之LoRDTRF:基于LoRDT(CART)RF算法对mushrooms蘑菇数据集(22+1,6513+1611)训练来预测蘑菇是否毒性(二分类预测)
  8. DL之BN-Inception:BN-Inception算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
  9. BlockChain:区块链/加密数字货币落地技术应用高质量相关文章
  10. BootStrap Table - JS事件绑定