Intereting Posts
Как криптографически подписывать конкатенацию открытых ключей с openssl Ask Question Не удается подключиться к X-серверу: 0.0 в качестве суперпользователя Автоматический вход через ssh (нет установленной среды GUI / отсутствует ssh-agent)? Когда MacOS полностью перешел на 64-битную версию? Не могу двойной загрузки ОС Phoenix и Lubuntu Монетный двор 17.3 Не воспроизводить звук Как игнорировать конфликты в Yast (Opensuse Leap 42.2) Как установить «vi» в качестве редактора по умолчанию в UNIX? Добавить источники для apt-get для Debian Linux 2.4.27-3-286 поиск всех слов в текстовом файле, появляющемся в другом текстовом файле Грепируйте линии между появлением одного и того же шаблона Запуск двоичного файла Solaris на SPARC без оборудования SPARC Значение значений для флага ulimit memlock Есть ли способ проверить целостность xz-архива без распаковки всего архива? Чтение потоковых данных с сервера

Что вы называете соглашением о вызовах `int 0x80`?

Я знаю, что syscall соглашение о syscall вызовах, но то, что вы называете соглашением о вызовах, которое предшествует ему, вы видите, когда вы вызываете int 80 а не syscall , вот так.

 mov rax,4 ; system call number (sys_write) mov rbx,1 ; file descriptor (stdout) mov rcx,hello ; message to write mov rdx,12 ; message length int 0x80 ; call kernel 

Я читал здесь, что аргументы после rdx – это esi , edi , ebp (или для x64 rsi , rdi , rbp ), я не вижу его на странице Википедии для соглашений о вызовах , но int80h, кажется, указывает, что Windows также использует это соглашение ?

Как называется это условное имя? Где в исходном тексте Ядра Linux можно увидеть его определение? И где находится таблица, которая разрешает rax для процедур при вызове int 0x80 ? Для syscall sys_write имеет syscall sys_write rax=1

Ваш вопрос охватывает ряд тем, я постараюсь решить их все.

  1. Я не уверен, что существует единственный канонический термин для способа, которым системные вызовы вызываются, тем более для определенного способа, которым системные вызовы вызываются (прерывание 0x80 в отличие от SYSENTER или SYSCALL ). На x86-64 документированный интерфейс системных вызовов, использующий SYSCALL , описан в System V x86-64 ABI, но это только информативно, а не нормативно. Аналогичным образом, хотя большинство людей понимают, о чем вы говорите, если вы называете их «i386 Linux ABI ядра» (заменяя «i386» любой архитектурой, о которой вы говорите), это также может сбивать с толку, так как «kernel ABI» имеет другое значение (в контексте модhive ядра), и опять же, это не ограничивается прерыванием 0x80.

    На практике большинство людей не должны беспокоиться о специфике вплоть до этого уровня детализации, тем более что они могут развиваться: прерывание 0x80, SYSCALL и т. Д., Как вы упоминаете, но также vDSO, который вводит свои тонкости и является предпочтительной записью. точка для всех системных вызовов в x86 в настоящее время … Конечно, это не означает, что не может быть термина, который бы относился к конкретному соглашению о вызовах, но я не уверен, что это было бы так полезно.

  2. Windows также поддерживает использование прерывания для своего интерфейса системных вызовов, 0x2E, но ее «соглашение о вызовах» совершенно иное : аргументы помещаются в стек, запрошенный системный вызов задается EAX, а EBX указывает на аргументы в стеке.

  3. Текущие ядра x86 определяют интерфейс системного вызова в arch/x86/entry : entry_32.S содержит интерфейс i386, entry_64.S интерфейс x86-32 и x86-64, entry_64_compat.S 32-битный интерфейс x86-64 (для обратной совместимость), syscalls/syscall_32.tbl таблица системных вызовов i386, syscalls/syscall_64.tbl таблица syscalls/syscall_64.tbl x86-32 и x86-64.

    Комментарии в этих файлах документируют интерфейс, в частности, как передаются аргументы: для 32-битных вызовов EAX содержит номер системного вызова, а его параметры помещаются в EBX, ECX, EDX, ESI, EDI и EBP (параметр сам для SYSENTER , указатель на стек пользователя, содержащий параметр для прерывания 0x80); для 64-битных вызовов RAX содержит номер системного вызова, а его параметры помещаются в RDI, RSI, RDX, R10, R8 и R9 (см. также Почему регистры системных вызовов и порядок изменились с 32-битного Intel на 64-битный? ) , В call.h есть хорошая сводка с диаграммами.

Как примечание, исторические сравнения часто ссылаются на интерфейс вызова MS-DOS, который в основном использовал прерывание 0x21 ; он также включал мультиплексное прерывание 0x2F , которое обеспечивало расширяемый механизм для добавления системных служб (обычно с использованием TSR; драйверы устройств в основном использовали другой интерфейс).