Что делает swi SYS_ERROR0 в ядре arm linux? - PullRequest
0 голосов
/ 13 декабря 2018

Ниже приведен код для вектора сброса в соответствии с определением 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?Когда я проверил, я нашел SYS_ERROR0 в arch / arm / kernel / asm-offsets.c

DEFINE(SYS_ERROR0,            0x9f0000);

Я не смог найти что-либо связанное с этим в Интернете.Может кто-нибудь объяснить, что делает эта инструкция?Что такое SYS_ERROR0?

1 Ответ

0 голосов
/ 17 декабря 2018

Мне не удалось найти что-либо связанное с этим в интернете.Может кто-нибудь объяснить, что делает эта инструкция?Что такое 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), и пространство пользователя получает сигнал.

...