这是我在堆栈交换中的第一个查询,所以请多多包涵。我想到的几乎所有问题都已经从论坛上得到了解决,但我找不到这个。
我在 Linux 中制作了一个简单的设备驱动程序,在 my_init() 函数中我编写了以下代码:-
spinlock_t mylock = SPIN_LOCK_UNLOCKED
static int __init my_init()
{
unsigned long flags;
printk("Testing spinlock\n");
spin_lock_irqsave(&mylock, flag);
printk("Grabbing spinlock and return\n");
}
因此,我只是在没有释放自旋锁的情况下返回。根据理论和 Linux 源代码,中断在 ARM 中被禁用。所以我看到 ARM 的 CPSR 寄存器使用带有“I”位的调试器被屏蔽,因此 IRQ 被禁用。然而令我惊讶的是,Linux 提示符甚至 schedule() 函数都照常工作。
所以我的问题是在 Linux 中我们是否只对某些外围设备使用 IRQ 模式?如果是这种情况,我们如何保证线程上下文和中断上下文之间的完美同步?
关于我的目标的一些细节:TI81xx Soc、Linux 3.2、劳特巴赫调试器。
谢谢