Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 禁用ARM cortex R中SVC的关键部分_Assembly_Arm_Bare Metal - Fatal编程技术网

Assembly 禁用ARM cortex R中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

我想在下面的代码块中实现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 -----*/
 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@Badri
svc
是同步的。如果CPU运行的代码包含
svc
指令,但“svc已禁用”,那么会发生什么情况?在svc处理程序修改寄存器之前,它不能在svc之后运行指令。你想让CPU返回到临界区中间的代码并完成它,然后运行<代码> SVC 处理程序,然后在SVC之后返回到指令?这一切是怎么发生的?TL:DR:如果需要避免此问题,请不要从中断处理程序中使用
svc
,或者禁用IRQ,这样就不会在关键部分切换上下文。