ARM的spinlock
OS homework 4
c
1 | /* |
prefetch
: 该指令用于把将要使用到的数据从主存提前装入缓存中,以减少访问主存的指令执行时的延迟。arm64的prefetch
用于手工执行预抓取,其是通过gcc内置的函数, 通过汇编实现的,主要用于提升性能。prefetch
定义在incude/linux/prefetch.h
中。prefetch
用于读预取,prefetchw
用于写预取。volatile
:__asm__
用来声明一个内联汇编表达式,__volatile__
则是向GCC 声明不允许对该内联汇编优化。内嵌汇编语法如下:__asm__(汇编语句模板: 输出部分: 输入部分: 破坏描述部分)
(破坏描述符用于通知编译器我们使用了哪些寄存器或内存)。参考:asm volatile内嵌汇编用法简述,也可见 [Arm instruction set reference guide](https://static.docs.arm.com/100076/0100/arm_instruction_set_ reference_guide_100076_0100_00_en.pdf)
smp_mb()
:即barrier()
,在拿到锁之后和放掉锁之前添加barrier
,是为了避免在拿到锁之前修改critical section里面的数据。也就是执行顺序必须是先拿锁 ,再执行critical section,最后放锁。