Assembly 当访问ISA/LPC时,内核函数/x86指令是否是向外和向内原子的?

Assembly 当访问ISA/LPC时,内核函数/x86指令是否是向外和向内原子的?,assembly,io,x86,linux-device-driver,instruction-set,Assembly,Io,X86,Linux Device Driver,Instruction Set,tl;dr 在多核系统上访问x86上的ISA/LPC时,Linux内核函数outw()和inw()是否是原子的,因为在硬件级别上它必须由四个独立的8位事务组成 作为一个等价的问题,由于outw()和inw()函数是同名内联汇编指令的包装器,因此在多核x86上访问LPC/ISA时,这些指令是否保证是原子指令 背景 我目前正在为一个需要32位访问的设备编写一个Linux驱动程序,但它与LPC总线接口(该总线显示为操作系统的ISA总线)。FPGA将四个独立的8位LPC事务映射为单个32位事务 我可以看

tl;dr

在多核系统上访问x86上的ISA/LPC时,Linux内核函数outw()和inw()是否是原子的,因为在硬件级别上它必须由四个独立的8位事务组成

作为一个等价的问题,由于outw()和inw()函数是同名内联汇编指令的包装器,因此在多核x86上访问LPC/ISA时,这些指令是否保证是原子指令

背景

我目前正在为一个需要32位访问的设备编写一个Linux驱动程序,但它与LPC总线接口(该总线显示为操作系统的ISA总线)。FPGA将四个独立的8位LPC事务映射为单个32位事务

我可以看到,对于x86,内核outw和outl用于x86,它们退化为同名的内联汇编指令

即使在多核系统上,这些功能/指令是否定义为原子的?特别是,如果在另一个内核运行中断开始一个新的(伪)32位事务之前,仅访问(例如)四个字节中的两个字节,我会考虑一种可能的竞争条件。除了承认函数的存在之外,没有说太多,内核在这方面也同样没有帮助

同时,我已经实现了四个独立的inb()事务,封装在一个自旋锁中。(如果其他驱动程序在两者之间插入事务,这无关紧要,因为在构建32位事务时,FPGA转换器将不包括这些地址)


(顺便说一句,我已经测试了outw()和inw(),它们确实在我的平台上执行了多字节访问—英特尔Atom Bay Trail—但关于可能的竞争条件的问题仍然存在)。

即使使用自旋锁,为什么不使用单个32位IN指令?我很确定它不会比4个独立的INB指令慢。关于原子性的问题问得好。我不确定。@PeterCordes,谢谢。这是一个很好的建议,尽管原子性问题仍然存在。x86上的所有
mov%(addr)、rX
指令都是原子的。当你的IO出错时,实际的问题是无序和写合并。即使你使用了自旋锁,为什么不在指令中使用单个32位呢?我很确定它不会比4个独立的INB指令慢。关于原子性的问题问得好。我不确定。@PeterCordes,谢谢。这是一个很好的建议,尽管原子性问题仍然存在。x86上的所有
mov%(addr)、rX
指令都是原子的。实际问题是无序的,当你的IO搞砸了的时候,写联合收割机。