在ARM皮质R中禁用SVC的临界区



我想在下面的代码块中实现SVC保护的临界区:

key = SVC_disable();
... /* SVC protected critical block of code */
SVC_restore(key);

如何在cortex R5 ARM上实现SVC_disable/restore

关于代码流的附加细节以澄清

这是一个运行在ARM Cortex R5上的裸机应用程序

执行路径1:

 Inst1
 Inst2
 /* ----- Start of SVC critical section -----*/
 Update  state atomically.
    -- Another SVC may also update same state so updates to state should prevent execution of any other SVC in the core
 /* ---- End of critical section ----*/

现在,当控制处于临界段时,可能会发生中断,中断服务程序可以发布一个SVC,可以破坏状态。

我不想在临界区完全禁用IRQs/FIQs。只延迟svc直到执行路径1离开临界区

任何发布的SVC都应该是一个等待异常,当执行路径1离开临界区时将被执行

我看到了禁用IRQ/FIQ的说明,但没有看到有选择地禁用SVC异常的选项。

svc是用户空间系统调用指令。所以只有当用户空间代码在当前核心上运行时才会发生这种情况,对吧?它不会异步发生,它没有意义,让它禁用,因为什么应该发生当svc指令运行?

要避免用户空间代码(可能包括svc)在内核函数处于临界区时运行,请禁用临界区周围的内核抢占,并且不要休眠。这是用户空间代码可以在运行某些内核代码(AFAIK)的同一核心上运行的唯一方法。

Linux下,调用preempt_enable()/preempt_disable()

相关内容

  • 没有找到相关文章

最新更新