Код сборки ARM и нумерация SVC

В ассемблерных кодах ARM я вижу что-то подобное... (особенно в шеллкодах)

svc 0x0090003f
svc 0x001ff3bf
swi 0x0900ff0b

Я знаю, что «svc (или swi)» — это «вызов супервизора», например «int 0x80» или «SYSENTER» от Intel. но как я могу интерпретировать номера «svc»?? где я могу получить список его информации?? Как насчет инструкции большого пальца 'svc'??

Руководство по эксплуатации руки, кажется, не объясняет это ...

Кто-нибудь может мне помочь? Заранее спасибо.


person daehee    schedule 11.06.2014    source источник
comment
у вас есть пример или вы придумали эти цифры? они выглядят слишком большими или по крайней мере одно из них.   -  person auselen    schedule 11.06.2014
comment
я этого не придумал   -  person daehee    schedule 11.06.2014
comment
Эти числа не зависят от ЦП; они зависят от ОС. В Linux с соглашением OABI это номер системного вызова (с EABI он должен быть равен нулю). Другие ОС могут иметь собственную схему нумерации. В мире встраиваемых систем специальные соглашения не являются чем-то необычным. Без знания платформы ничего не скажешь.   -  person Seva Alekseyev    schedule 11.06.2014
comment
Тот факт, что системы Intel x86 интенсивно используют вызовы int xxh, а архитектура arm поддерживает аналогичные вещи, не означает, что это 1) хорошая идея сделать это таким же образом (используйте эту функцию) 2) есть список стандартных номеров вызовов svc... нет, и для приложений, которые вы обычно видите, которые могут использовать эти вызовы, многие/большинство этого не делают.   -  person old_timer    schedule 11.06.2014


Ответы (3)


6.2.8. Обработчики SVC

Обработчику исключений может потребоваться определить, находился ли процессор в состоянии ARM или Thumb, когда возникло исключение.

В частности, обработчикам SVC может потребоваться считывать состояние процессора. Это делается путем проверки T-бита SPSR. Этот бит установлен для состояния Thumb и очищен для состояния ARM.

Оба набора инструкций ARM и Thumb имеют инструкцию SVC. При вызове SVC из состояния Thumb необходимо учитывать следующее:

Адрес инструкции LR-2, а не LR-4.

Сама инструкция является 16-битной, поэтому требуется загрузка полуслова, см. рис. 6.3.

Номер SVC хранится в 8 битах вместо 24 битов в состоянии ARM.

Подробнее читайте на http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0203j/Cacdfeci.html

person Ruslan Gerasimov    schedule 11.06.2014
comment
Я уже видел это, но это не объясняет, что такое номера SVC. - person daehee; 11.06.2014
comment
Номера SVC совершенно произвольны и являются деталями реализации используемой операционной системы, поскольку они связаны с ее службами. Следовательно, нет документации от ARM. - person marko; 11.06.2014
comment
thumb2 номер находится в другом месте, нетривиально или невозможно иметь общий обработчик всех режимов, возможно, неплохо определить режим, в котором вы должны находиться, чтобы вызывать svc/swi и/или не беспокоить кодирование в инструкция а вместо этого в gpr... - person old_timer; 11.06.2014
comment
@old_timer, а исходная кодировка инструкций была задумана, когда в системах не было smp, L1, L2 и выполнения не по порядку. Изучение потока инструкций может быть довольно длительным в современных системах манипулятора. - person artless noise; 10.07.2019

Значение SVC сохраняется в 16-битных младших битах регистра ESR

Справочник по архитектуре ARMv8 D12.2.36 "ESR_EL1, регистр синдрома исключения ( EL1)» говорит, что если биты EC равны 0b010101, то поле ISS документируется как «кодирование ISS для исключения из выполнения инструкции HVC или SVC».

Затем в этом разделе говорится, что младшие 16 бит — это imm16, что, если вы посмотрите на определение SVC, является именем, данным 16-битному аргументу.

Наконец, вызовы SVC, которые вы показываете по своему вопросу, недействительны в ARMv8 GNU GAS, поскольку они больше 16 бит. Например:

SVC 0xABCDE

правильно не собирается с:

Error: immediate value out of range 0 to 65535 at operand 1 -- `svc 0xABCDE

Запускаемый пример

Вот минималистичный работающий пример aarch64 без операционной системы, который выполняет SVC и распечатывает все регистры во время обработчика, включая ESR arm-svc-instruction" rel="nofollow noreferrer">https://github.com/cirosantilli/linux-kernel-module-cheat/tree/b1bfd46efebabcba4f1ab1cbddf99611550e2dc2#arm-svc-instruction

person Ciro Santilli    schedule 16.07.2019

С 6.2.8. Обработчики SVC

Всякий раз, когда встречается какой-либо svc/swi, управление будет передано обработчику svc. в обработчике SVC эти числа будут использоваться для определения того, какую подпрограмму необходимо вызвать, поэтому это значения индекса, которые будут приняты обработчиком и обработаны соответствующим образом.

Пример 6.11. Обработчик SVC в функции C

void C_SVC_handler (unsigned number)
{
    switch (number)
    {
        case 0 :                 /* SVC number 0 code */
            ...
            break;
        case 1 :                 /* SVC number 1 code */
            ...
            break;
        ...
        default :                /* Unknown SVC - report error */
    }
}

Ссылка- 6.2.8. Обработчики SVC

person Himanshu Sourav    schedule 10.07.2019