linux – 测试和设置(或其他原子RMW操作)是否是任何架构上的特权指令?
作者:互联网
硬件提供原子指令,如测试和设置,比较和交换,负载链接存储条件.这些特权指示吗?也就是说,只能操作系统执行它们(因此需要系统调用)?
我认为他们没有特权,可以在用户空间中调用.但http://faculty.salina.k-state.edu/tim/ossg/IPC_sync/ts.html似乎暗示不然.但是,futex(7),在某些条件下,可以在没有系统调用的情况下实现锁定,这意味着它必须在没有特权的情况下执行指令(如测试和设置).
矛盾?如果是这样,哪个是对的?
解决方法:
那页错了.它似乎声称无锁原子操作一般在ISA上具有特权,但事实并非如此.我从来没有听说过一个原子测试和设置或任何其他无锁操作需要内核模式.
如果是这种情况,则需要C++11 lock-free atomic read-modify-write operations才能编译为系统调用,但它们不适用于x86,ARM,AArch64,MIPS,PowerPC或任何其他普通CPU. (试试https://godbolt.org/).
它也会使“轻量级”锁定(试图在没有系统调用的情况下锁定)变得不可能. (http://preshing.com/20111124/always-use-a-lightweight-mutex/)
正常的ISA允许用户空间执行原子RMW操作,在线程之间共享的内存上,甚至在单独的进程之间.我不知道在x86上禁用用户空间的原子RMW的机制.即使在任何ISA上都有这样的东西,它也不是正常的操作模式.
只读或只写访问通常在所有ISA上的对齐位置上自然是原子的,直到某个宽度(Why is integer assignment on a naturally aligned variable atomic on x86?),但原子RMW确实需要硬件支持.
在x86上,TAS是锁定bts,没有特权. (Documentation for the lock
prefix). x86有很多其他原子操作选择,比如lock add [mem],reg / immediate,lock cmpxchg [mem],reg,甚至lock xadd [mem],reg,当需要返回值时实现fetch_add. (Can num++ be atomic for ‘int num’?)
大多数RISC都有LL / SC,包括ARM,MIPS和PowerPC,以及所有旧的不再常见的RISC ISA.
futex(2)是一个系统调用.如果你调用它,它所做的一切都是在内核模式下.
这是轻量级锁定所使用的回退机制,以防有争用,提供操作系统辅助的睡眠/唤醒.因此,在用户空间中执行任何操作都不是futex本身,而是围绕futex构建的锁定实现可以避免在无竞争或低争用情况下进行系统调用.
(例如,如果锁定可用,则在用户空间中旋转几次.)
这就是futex(7)手册页所描述的内容.但是如果你实际上没有进行系统调用,我觉得把它称为“futex操作”有点奇怪.我猜它是在内存代码可能会代表正在等待的其他线程查看的内存上运行的,因此用于修改用户空间代码中的内存位置的必要语义取决于futex.
标签:linux,cpu-architecture,operating-system,assembly,futex 来源: https://codeday.me/bug/20190727/1549363.html