wLiu2007 发表于 2014-08-13 15:15

低端芯片的原子操作只是关中断吧,需要陷入内核吗?

对于低端的芯片,没有指令/锁总线相关的技术来支持原子操作,比如arm 9,那么原子操作应该就是一个关中断的操作吧

在用户空间关中断,这个涉及到写硬件寄存器,需要陷入到内核去做吗?如果是这样,代价岂不是很大?
从技术角度来看,开关中断写的寄存器是cpu的内部寄存器(比如arm的R15 CPSR寄存器),不需要地址空间(写外设的寄存器需要地址),在用户空间是可以直接访问的, 但是这样貌似违背了Linux内核空间和用户空间隔离的思想

humjb_1983 发表于 2014-08-13 16:54

用户空间可以直接关中断?

Tinnal 发表于 2014-08-13 20:55

wLiu2007 发表于 2014-08-13 15:15 static/image/common/back.gif
对于低端的芯片,没有指令/锁总线相关的技术来支持原子操作,比如arm 9,那么原子操作应该就是一个关中断的 ...

ARM9时代, ARM还没有多核呢。在UP的模式下,spin_lock_XXX会退化为关中断和关抢占就行。不需要原子操作。

spin_lock_XXX的的实现代码在spinlock_api_up.h

#define __LOCK(lock) \
do { preempt_disable(); __acquire(lock); (void)(lock); } while (0)
#define __LOCK_IRQ(lock) \
do { local_irq_disable(); __LOCK(lock); } while (0)


#define _spin_lock(lock)                        __LOCK(lock)
#define _spin_lock_irq(lock)                        __LOCK_IRQ(lock)

另外,用户态肯定不能这么做呀,用户态关了中断,整个系统都会受影响。用户态应该用睡眠锁。拿不到锁,就睡眠,让出CPU给其它进程运行。进程互斥和同步的函数,你可以找本Linux应用程序开发的书来看看。推荐你看《UNIX高级环境编程》






wLiu2007 发表于 2014-08-13 22:46

之所以有这个疑问是因为在我目前用系统中,powerpc有专门的指令和机制来完成原子操作,所以我们在用户空间按照内核实现了原子操作,这样减少锁的开销;
如果将我应用程序移植到一个没有硬件指令支持原子的平台上时,这一部分我还要做修改吗,不能按照内核实现那样,用关中断来在用户空间实现吗

Tinnal 发表于 2014-08-13 23:05

回复 4# wLiu2007

额,又是非常规用法。在用户模式下,你是不能改变CPSR的,也就是不能屏蔽中断,这是系统的特权。但如果你非要这么做,我告诉你两个别外的方法。
1. 自己做个系统调用去实现,不过这样有系统调用开销。
2. 就是从源头阻止,把GIC控制器的寄存器预先MAP到用户态,想关闭中断时,直接把所有中断都给屏蔽了就了。

不过还是提醒,在用户态关中断,慎重。还是想想别的方法吧。pthread_mutex也是很轻量的。如果要想做到完全没有内核开消,也可以研究一下Linux用户态的协程(纤程)。


   

hmsghnh 发表于 2014-08-14 10:43

回复 4# wLiu2007

你确定可以减少lock的开销?   现在futex实现,加锁也是不需要内核参与的了吧。   
页: [1]
查看完整版本: 低端芯片的原子操作只是关中断吧,需要陷入内核吗?