关于SWAP指令用于实现多CPU的互斥信号量

 

1楼:提问

atomic load and store operation, allowing a MEMORY semaphore to be loaded and altered

without interruption.

semaphore instructions用于进程同步, 不是很理解。

记得操作系统中进程同步用信号量,底层实现用这个指令?

atomic load and store operation什么意思?

是不是每个cpu都有这种指令/

谢谢

2楼: >>参与讨论

作者: high 于 2006-6-22 13:38:00 发布:

re摘自arm_zhiling.pdf from zlg
arm是risc,对存储器访问只能使用加载和存储指令。
swp是寄存器和存储内容交换的指令,可用于信号量操作,实现系统任务之间的同步或互斥。使用例子如下:

DISP_SEM  EQU 0X40002A00

DISPWAIT  MOV  R1,#0
          LDR  R0,=DISP_SEM
          SWP  R1,R1,[R0]
          CMP  R1,#0
          BEQ  DISP_WAIT
------------------------以上摘抄

3楼: >>参与讨论

作者: rockos 于 2006-6-23 13:07:00 发布:

re
在单个CPU工作时,这条指令意义不大,因为在单个CPU下禁止多任务访问同一个内存单元可以采用禁止CPU中断的方法实现。

ARM并没有说不支持多CPU结构,在多CPU结构中,比如SMP,禁止中断只能对单个的CPU生效,此时就需要使用这条指令访问互斥信号量了。

4楼: >>参与讨论

作者: rockos 于 2006-6-26 14:58:00 发布:

回复关于SWP指令

OS的底层实现上也不一定会使用这条指令,如上面所说,在单个CPU的情况下,因为没有其它CPU干扰,信号量操作可以采用关闭中断的方法实现。

原子操作,意思就是“不可分割的操作”,这个是OS里的一个基本概念。

ARM SWP指令要求目标寄存器中应当先有一个已知值,在执行后把目标寄存器的内容与目标地址的内容交换,这样就可以用别的指令检查那个地址的值是否处于期望的状态,通常只用于在OS中用于实现互斥信号量。比如:

MUTEX_PORT equ 0x80000000      ; 多CPU共用的旗标内存区

retry

    mov r0, #1                 ; 试图占用(互斥)信号量

    ldr r1, =MUTEX_PORT

    swp r0, r0, [r1]

    cmp r0, #0                 ; 0表示没有别的CPU在这个临界区执行,其它值表示有别的CPU正在这个临界区执行

    bne retry

mutex_action                   ; 占用成功后,这一小段代码是一个临界区操作

    ....

done

    mov r0, #0                 ; 释放(互斥)信号量

    ldr r1, =MUTEX_PORT

    swp r0, r0, [r1]

这一小段代码是支持多处理器的OS中实现多CPU互斥操作(比如,操作就绪任务队列)的一种典型的模式算法,可以看出SWP指令还伴随着一个轮循过程(这个就是多CPU结构1+1<2的重要原因)。尽管ARM指令规定第二个参数中的初始值可以是任意的,通常使用时却只有0和1两个。这条指令不能用于多CPU环境下的同步信号量,多CPU下的同步信号量比互斥信号量还要复杂。

所有支持多处理器结构的CPU中都有类似的指令,或者有替代的实现(如x86 CPU的LOCK指令前缀)。只能单个工作的CPU不需要支持这条指令。

* - 本贴最后修改时间:2006-6-27 9:35:56 修改者:rockos

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值