gpt4 book ai didi

linux - swi SYS_ERROR0 在 arm linux 内核中做什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:03:22 25 4
gpt4 key购买 nike

下面是 arm linux (arch/arm/kernel/entry-armv.S) 中定义的复位向量的代码

vector_rst:
ARM( swi SYS_ERROR0 )
THUMB( svc #0 )
THUMB( nop )
b vector_und

swi SYS_ERROR0 指令有什么作用?我查看的时候在arch/arm/kernel/asm-offsets.c中发现了SYS_ERROR0

DEFINE(SYS_ERROR0,            0x9f0000);

我无法在互联网上找到与它相关的任何内容。有人可以解释这条指令的作用吗?什么是 SYS_ERROR0

最佳答案

I was unable to find anything related to it on internet. Can someone explain what does this instruction do ? What is SYS_ERROR0 ?

DEFINE(SYS_ERROR0,            0x9f0000);

swi instruction通常是从用户模式到系统模式的调用。即,Linux 内核的用户空间。较低的数字是标准的 Linux 系统调用,例如 open()sbrk() 等。

如果你看uapi/asm/unistd.harch/arm 中,您可以看到一些定义,例如 __ARM_NR_BASE,即 __NR_SYSCALL_BASE+0x0f0000。对于 OABI 系统,这可以是 0x9f0000。基本上,这些是 secret 系统调用,它们是 ARM 特定的内核调用。例如,__ARM_NR_get_tls 仅用于 ARM 上的 libc 线程管理。其他 CPU 可能具有不同的非系统调用机制来执行相同的操作和/或系统调用接口(interface)可能与 ARM CPU 上的不同。

所以SYS_ERROR0是一个特殊的ARM系统调用。顺便说一句,asm-offset.c 从未被直接使用过。它被编译并通过脚本扫描对象以获得汇编器对结构的偏移等。因此,如果编译器以不同方式打包结构,那么理论上,汇编器将与编译器版本同步。我们从这里开始,

.L__vectors_start:
W(b) vector_rst
W(b) vector_und
W(ldr) pc, .L__vectors_start + 0x1000
W(b) vector_pabt
W(b) vector_dabt
W(b) vector_addrexcptn
W(b) vector_irq
W(b) vector_fiq

swi 是由W(ldr) pc, .L__vectors_start + 0x1000 处理的向量,所以代码在向量表之后4k。这是 vector_swi,您可以在 entry-common.S 中查看代码.有两种方法可以进行系统调用。较旧的 (OABI) 在 SWI 指令中对调用进行编码。这很糟糕,因为 ICACHE 必须作为数据 (DCACHE) 检查。较新的系统在 r7 中传递系统调用。有两个跳转表; sys_call_tablesys_oabi_call_table 来处理 OABI 和更新的机制。在这两种情况下,更高的 __NR_SYSCALL_BASE 都是特殊情况,并在 traps.c 中使用 arm_syscall .所以 SYS_ERROR0case 0:/* branch through 0 */ traps.c 中的代码。消息branch through zero 被打印(因为用户空间跳转到可以在地址 0 的重置向量)并且用户空间得到一个信号。

关于linux - swi SYS_ERROR0 在 arm linux 内核中做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53764955/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com