Assembly 禁用ARM cortex R中SVC的关键部分
我想在下面的代码块中实现SVC保护的关键部分:Assembly 禁用ARM cortex R中SVC的关键部分,assembly,arm,bare-metal,Assembly,Arm,Bare Metal,我想在下面的代码块中实现SVC保护的关键部分: key = SVC_disable(); ... /* SVC protected critical block of code */ SVC_restore(key); 如何在cortex R5 ARM上实现SVC_禁用/恢复 有关代码流的其他详细信息,以澄清 这是一款运行在ARM Cortex R5上的纯金属应用程序 执行路径1: Inst1 Inst2 /* ----- Start of SVC critical section
key = SVC_disable();
... /* SVC protected critical block of code */
SVC_restore(key);
如何在cortex R5 ARM上实现SVC_禁用/恢复
有关代码流的其他详细信息,以澄清
这是一款运行在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
我不想在关键部分完全禁用IRQ/FIQ。仅延迟SVC,直到执行路径1离开临界段
任何已发布的SVC都应该是挂起的异常,当执行路径1离开关键部分时,将执行该异常
我看到了禁用IRQ/FIQ的说明,但没有看到任何选择性禁用SVC异常的选项。。因此,只有在当前内核上运行用户空间代码时,才会发生这种情况,对吗?它不是异步发生的,禁用它也没有意义,因为当svc
指令运行时应该发生什么
要避免在内核函数处于关键部分时运行用户空间代码(可能包括svc
),请在关键部分周围禁用内核抢占,并且不要休眠。这是用户空间代码在同一个内核上运行的唯一方法,它运行在一些内核代码(AFAIK)的中间。
在Linux中,.可以像“禁用”
ldr
或任何其他可能引发同步异常的指令一样,简单地“禁用”svc
。通过在该代码序列中不使用它。@Peter Cordes这是一个纯金属应用程序,没有OS@Notlikethat系统中存在可抢占现有代码的中断,ISR可发布SVC。我不希望在关键部分执行任何SVC。我不是在询问当前线程发布SVC的情况,这通常是通过不调用SVC指令来完成的……所以,仅在状态更新时有选择地禁用中断?在关键部分设置标志,使SVC处理程序提前退出?切向而言,这就是M-profile体系结构使用PENDSVC的目的;不幸的是,这对R-proifile没有帮助。严格地说,这不仅仅是用户空间——更高的异常级别可以使用svc
来调用它们自己(与hvc
/smc
进行进一步的比较),但我认为这在实践中并不常见,同样的“那么就不要这样做了”原则仍然适用。@Peter Cordes是否有办法推迟例外,直到关键部分退出。我已经用更多细节更新了问题,以明确我在说什么about@Badrisvc
是同步的。如果CPU运行的代码包含svc
指令,但“svc已禁用”,那么会发生什么情况?在svc处理程序修改寄存器之前,它不能在svc之后运行指令。你想让CPU返回到临界区中间的代码并完成它,然后运行<代码> SVC 处理程序,然后在SVC之后返回到指令?这一切是怎么发生的?TL:DR:如果需要避免此问题,请不要从中断处理程序中使用svc
,或者禁用IRQ,这样就不会在关键部分切换上下文。