2015-06-16 4 views
2

Я просматривал некоторые Android-источники и нашел, что реализация writev будет полностью собрана. У меня есть общее знание ASM, но я не знаком с нюансами набора инструкций ARM. Учитывая этот код:ARM Assembly - Что происходит в этом коде?

ENTRY(writev) 
    mov  ip, r7 
    ldr  r7, =__NR_writev 
    swi  #0 
    mov  r7, ip 
    cmn  r0, #(MAX_ERRNO + 1) 
    bxls lr 
    neg  r0, r0 
    b  __set_errno 
END(writev) 

После некоторых поисков вокруг я нашел следующее:

__NR_writev = __NR_SYSCALL_BASE+146 
__NR_SYSCALL_BASE = 0 

Что именно здесь происходит? Из того, что я мог найти, регистр ip является псевдонимом для r12 и далее известен как регистр царапин. Почти все реализации ASM, которые я могу найти в источнике, имеют этот общий макет:

Код загружает r7 в ip, r7 загружается с фактическим адресом памяти подпрограммы, затем выдается программное прерывание. Хотя я точно не знаю, что происходит, я вижу, что оставшийся бит кода проверяет ошибки, используя возвращаемые значения вызова подпрограммы __NR_writev.

  • Где реализация фактической из writev если ASM рутина только перенаправляет вызов и проверка на наличие ошибок?

  • Почему здесь сохраняется r7 и почему в ip (r12/scratch register)?

  • Почему адрес памяти фактической реализации загружен в r7 до SWI?

+0

«Где реализация _actual_ ...» - Вы знаете [какой syscall is] (https://en.wikipedia.org/wiki/System_call), правильно? ;) – Notlikethat

+0

@Notlikethat, конечно. Возможно нет. Что вы имеете в виду? Я знаю, что syscalls * do * для пользователя в пользовательском пространстве, но их реализация - это то, о чем я не знаком. – sherrellbc

+2

@sherrellbc Реализация будет в исходном коде ОС. – Degustaf

ответ

3

Фактическая реализация writev находится где-то в ядре вашей операционной системы. Инструкция SWI заставляет CPU переключиться в режим супервизора и начать выполнение обработчика исключений ядра. В режиме супервизора ядро ​​может делать то, что ваш код режима пользователя не может выполнять напрямую, например, устройства доступа.

Значение R7 сохраняется в IP (R12), поскольку в соответствии с принятым соглашением необходимо сохранить значение R7 по вызову. Он не требует сохранения регистра IP.

Значение, загруженное в R7, не является адресом, это номер 146. Поскольку другие системные вызовы также используют SWI #0, все они заканчивают выполнение одного и того же обработчика исключений в ядре. Используется значение в R7, определяющее, какой системный вызов был вызван. Обработчик исключений, вероятно, переходит к реализации системного вызова в ядре, используя значение в R7 как масштабированное смещение в таблицу адресов.

Смежные вопросы