查看“ARM System Calls”的源代码
←
ARM System Calls
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
{{Template:In Progress}} ==System Calls== <pre>swi 0x420000</pre> 这里向你介绍如何在ARM上做System Call。 指令 <span style="font-family:monospace">swi</span> 跳转到预定义的地址,该地址又跳转到System Call处理程序。 System Call处理程序执行特定函数,并返回用户代码: <pre>mov pc, lr</pre> 在大多数情况下,您无需担心从中断返回,因为GCC设置为针对ARM交叉编译,可以在C中编写中断处理程序: <source lang="c">void swi_handler () __attribute__((interrupt));</source> = = 创建System Call = = <pre> interrupt_vector_table: b . @ Reset Handler b . @ Undefined b . @ SWI Handler b . @ Prefetch Abort b . @ Data Abort b . @ IRQ b . @ FIQ </pre> 这是相当于在x86上IDT的ARM版,它默认存储在地址0。 我们需要关心的唯一条目是SWI Handler。 要安装我们自己的SWI Handler,我们替换 <span style="font-family:monospace">b .</span> 带有分支到我们的处理程序的指令: <pre> interrupt_vector_table: b . @ Reset Handler b . @ Undefined b swi_handler @ Our new SWI Handler b . @ Prefetch Abort b . @ Data Abort b . @ IRQ b . @ FIQ </pre> 我们可以像这样编码中断处理程序: <source lang="c"> void __attribute__ ((interrupt ("SWI"))) swi_handler (void) {} </source> ARM上函数的参数,在寄存器r0-r3中传递,如果遵循相同的约定的System Call,那么我们的中断处理程序也可以获取参数: <source lang="c"> void __attribute__ ((interrupt ("SWI"))) swi_handler (int r0, int r1, int r2, int r3) {} </source> 您可能已经注意到 <span style="font-family:monospace">swi</span> 采用整数参数。 为了在C中得到这个参数,我们必须这样做: <source lang="c"> uint8_t int_vector = 0; asm volatile ("ldrb %0, [lr, #-2]" : "=r" (int_vector)); </source> 这会将参数的高8位 (16-23) 加载到 <span style="font-family:monospace">int_vector</span> 中,使用Thumb加载完整的24位将不起作用。 [[Category:ARM]] [[Category:In Progress]]
本页使用的模板:
模板:In Progress
(
查看源代码
)
返回至“
ARM System Calls
”。
导航菜单
个人工具
登录
命名空间
页面
讨论
变体
已展开
已折叠
查看
阅读
查看源代码
查看历史
更多
已展开
已折叠
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
工具
链入页面
相关更改
特殊页面
页面信息