<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>http://wiki.foofun.cn//index.php?action=history&amp;feed=atom&amp;title=ARM_System_Calls</id>
	<title>ARM System Calls - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.foofun.cn//index.php?action=history&amp;feed=atom&amp;title=ARM_System_Calls"/>
	<link rel="alternate" type="text/html" href="http://wiki.foofun.cn//index.php?title=ARM_System_Calls&amp;action=history"/>
	<updated>2026-05-13T18:52:37Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>http://wiki.foofun.cn//index.php?title=ARM_System_Calls&amp;diff=407&amp;oldid=prev</id>
		<title>Zhang3：创建页面，内容为“{{Template:In Progress}} ==System Calls==  &lt;pre&gt;swi 0x420000&lt;/pre&gt; 这里向你介绍如何在ARM上做System Call。 指令 &lt;span style=&quot;font-family:monospace&quot;&gt;swi&lt;/span&gt; 跳转到预定义的地址，该地址又跳转到System Call处理程序。 System Call处理程序执行特定函数，并返回用户代码: &lt;pre&gt;mov pc, lr&lt;/pre&gt; 在大多数情况下，您无需担心从中断返回，因为GCC设置为针对ARM交叉编译，可以在C中编写中断…”</title>
		<link rel="alternate" type="text/html" href="http://wiki.foofun.cn//index.php?title=ARM_System_Calls&amp;diff=407&amp;oldid=prev"/>
		<updated>2022-02-08T09:44:16Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“{{Template:In Progress}} ==System Calls==  &amp;lt;pre&amp;gt;swi 0x420000&amp;lt;/pre&amp;gt; 这里向你介绍如何在ARM上做System Call。 指令 &amp;lt;span style=&amp;quot;font-family:monospace&amp;quot;&amp;gt;swi&amp;lt;/span&amp;gt; 跳转到预定义的地址，该地址又跳转到System Call处理程序。 System Call处理程序执行特定函数，并返回用户代码: &amp;lt;pre&amp;gt;mov pc, lr&amp;lt;/pre&amp;gt; 在大多数情况下，您无需担心从中断返回，因为GCC设置为针对ARM交叉编译，可以在C中编写中断…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Template:In Progress}}&lt;br /&gt;
==System Calls==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;swi 0x420000&amp;lt;/pre&amp;gt;&lt;br /&gt;
这里向你介绍如何在ARM上做System Call。 指令 &amp;lt;span style=&amp;quot;font-family:monospace&amp;quot;&amp;gt;swi&amp;lt;/span&amp;gt; 跳转到预定义的地址，该地址又跳转到System Call处理程序。 System Call处理程序执行特定函数，并返回用户代码:&lt;br /&gt;
&amp;lt;pre&amp;gt;mov pc, lr&amp;lt;/pre&amp;gt;&lt;br /&gt;
在大多数情况下，您无需担心从中断返回，因为GCC设置为针对ARM交叉编译，可以在C中编写中断处理程序:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;void swi_handler () __attribute__((interrupt));&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= = 创建System Call = =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
interrupt_vector_table:&lt;br /&gt;
    b . @ Reset Handler&lt;br /&gt;
    b . @ Undefined&lt;br /&gt;
    b . @ SWI Handler&lt;br /&gt;
    b . @ Prefetch Abort&lt;br /&gt;
    b . @ Data Abort&lt;br /&gt;
    b . @ IRQ&lt;br /&gt;
    b . @ FIQ&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
这是相当于在x86上IDT的ARM版，它默认存储在地址0。 我们需要关心的唯一条目是SWI Handler。 要安装我们自己的SWI Handler，我们替换 &amp;lt;span style=&amp;quot;font-family:monospace&amp;quot;&amp;gt;b .&amp;lt;/span&amp;gt; 带有分支到我们的处理程序的指令:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
interrupt_vector_table:&lt;br /&gt;
    b . @ Reset Handler&lt;br /&gt;
    b . @ Undefined&lt;br /&gt;
    b swi_handler @ Our new SWI Handler&lt;br /&gt;
    b . @ Prefetch Abort&lt;br /&gt;
    b . @ Data Abort&lt;br /&gt;
    b . @ IRQ&lt;br /&gt;
    b . @ FIQ&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
我们可以像这样编码中断处理程序:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void __attribute__ ((interrupt (&amp;quot;SWI&amp;quot;))) swi_handler (void) {}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
ARM上函数的参数，在寄存器r0-r3中传递，如果遵循相同的约定的System Call，那么我们的中断处理程序也可以获取参数:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void __attribute__ ((interrupt (&amp;quot;SWI&amp;quot;))) swi_handler (int r0, int r1, int r2, int r3) {}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
您可能已经注意到 &amp;lt;span style=&amp;quot;font-family:monospace&amp;quot;&amp;gt;swi&amp;lt;/span&amp;gt; 采用整数参数。 为了在C中得到这个参数，我们必须这样做:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
uint8_t int_vector = 0;&lt;br /&gt;
asm volatile (&amp;quot;ldrb %0, [lr, #-2]&amp;quot; : &amp;quot;=r&amp;quot; (int_vector));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
这会将参数的高8位 (16-23) 加载到 &amp;lt;span style=&amp;quot;font-family:monospace&amp;quot;&amp;gt;int_vector&amp;lt;/span&amp;gt; 中，使用Thumb加载完整的24位将不起作用。&lt;br /&gt;
[[Category:ARM]]&lt;br /&gt;
[[Category:In Progress]]&lt;/div&gt;</summary>
		<author><name>Zhang3</name></author>
	</entry>
</feed>