正如您所说,您正在运行在单处理器系统上以 SMP 模式编译的 linux 内核,因此很明显,您不会在速度和内存方面获得任何好处。
由于 linux-kernel 使用广泛的锁定进行同步。但是在单处理器模式下,理论上可能不需要锁定,但在很多情况下需要锁定,因此请尝试在需要的地方使用锁定,但不如在 SMP 中那么多。
但是你应该很清楚,自旋锁是由一组宏实现的,其中一些会阻止与 IRQ 处理程序的并发,而另一些则不会。自旋锁适用于保护旨在运行很短时间的小段代码。
在您的第二个问题中,您正试图通过禁用单处理器模式的中断来删除自旋锁,但自旋锁宏位于不可抢占的 UP(单处理器)内核中,评估为空宏(或其中一些宏只是禁用/启用中断)。启用抢占的 UP 内核使用自旋锁来禁用抢占。对于大多数目的,抢占可以等同于 SMP。因此,在 UP 内核中,如果您使用 Spinlocks,那么它们将只是空宏,我认为使用它会更好。
基本上有四种同步技术:1->不可抢占性,2->原子操作,3->中断禁用,4->锁。
但是正如您所说的禁用中断以进行同步,请记住由于其简单性,内核函数使用中断禁用来实现关键区域。这种技术并不总是能防止内核控制路径交错。
关键部分应该很短,因为当内核控制路径在此部分运行时,CPU 和 I/O 之间的任何通信都会被阻塞。
因此,如果您需要在 Uni-Processor 中进行同步,请使用信号量。