Я просматривал некоторые 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?
«Где реализация _actual_ ...» - Вы знаете [какой syscall is] (https://en.wikipedia.org/wiki/System_call), правильно? ;) – Notlikethat
@Notlikethat, конечно. Возможно нет. Что вы имеете в виду? Я знаю, что syscalls * do * для пользователя в пользовательском пространстве, но их реализация - это то, о чем я не знаком. – sherrellbc
@sherrellbc Реализация будет в исходном коде ОС. – Degustaf