Мне не удалось найти что-либо связанное с этим в интернете.Может кто-нибудь объяснить, что делает эта инструкция?Что такое SYS_ERROR0?
DEFINE(SYS_ERROR0, 0x9f0000);
Инструкция swi
обычно является вызовом из пользовательского режима в системный режим.Т.е. пространство пользователя для ядра Linux.Нижние числа - это стандартные системные вызовы Linux, такие как open()
, sbrk()
и т. Д.
Если вы посмотрите на uapi / asm / unistd.h в arch / arm Вы можете увидеть некоторые определения, такие как __ARM_NR_BASE
, что __NR_SYSCALL_BASE+0x0f0000
.Это может быть 0x9f0000 для систем OABI.По сути, это системные вызовы secret , которые являются специфичными для ARM вызовами ядра.Например, __ARM_NR_get_tls
используется только для управления потоками libc в ARM.Другие процессоры могут иметь разные механизмы не-syscall, чтобы делать то же самое, и / или интерфейс syscall может отличаться от интерфейса ARM-процессора.
Так что 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_table
и sys_oabi_call_table
для обработки OABI и более нового механизма.В обоих случаях старшие __NR_SYSCALL_BASE
имеют специальный корпус и используют arm_syscall
в traps.c .Так что SYS_ERROR0
- это код case 0: /* branch through 0 */
в traps.c.Сообщение ответвление через ноль печатается (потому что пространство пользователя переходит на вектор сброса, который может быть по адресу 0), и пространство пользователя получает сигнал.