Изучение сборки x86 на Mac / BSD: встроенные функции ядра?Как узнать аргументы / порядок? - PullRequest
1 голос
/ 07 сентября 2011

Я играл с yasm, пытаясь понять основы сборки x86. Из моих тестов кажется, что вы вызываете функции из ядра, устанавливая регистр EAX с номером нужной вам функции. Затем вы помещаете аргументы функции в стек и запускаете системный вызов (0x80) для выполнения инструкции. Это стиль Mac OS X / BSD, я знаю, что Linux использует регистры для хранения аргументов вместо использования стека. Это звучит правильно? Это основная идея?

Я немного запутался, потому что где документированы функции? Откуда мне знать, какие аргументы и в каком порядке помещать их в стек? Должен ли я искать в syscall.h ответы? Кажется, для поддерживаемых вызовов ядра, кроме заголовков языка C, есть конкретная ссылка.

Кроме того, стандартные функции C, такие как printf (), полагаются на встроенные функции ядра, например, для записи в стандартный вывод? Другими словами, знает ли компилятор C, что такое функции ядра, и пытается ли он «понять», как взять код C и преобразовать его в функции ядра (которые ассемблер затем переводит в машинный код)?

C код -> C компилятор -> вызовы ядра / asm -> ассемблер -> машинный бинарник

Я уверен, что это действительно базовые вопросы, но мое понимание всего, что происходит после компилятора Си, довольно мутное.

Ответы [ 2 ]

4 голосов
/ 07 сентября 2011

Документация по системным вызовам

Убедитесь, что у вас установлены инструменты разработчика XCode для руководств UNIX для Mac OS X, а затем запустите man 2 intro в командной строке.Для получения списка системных вызовов вы можете использовать syscall.h (который полезен для номеров системных вызовов) или запустить man 2 syscalls.Затем, чтобы посмотреть каждый конкретный системный вызов, вы можете запустить man 2 syscall_name, то есть для чтения, вы можете запустить man 2 read.

Справочные страницы UNIX являются исторически значимой справочной документацией для систем UNIX.Практически любая низкоуровневая функция или системный вызов POSIX будет документирована с использованием их, а также большинства команд.В разделе 2 рассматриваются только системные вызовы, и поэтому, когда вы запускаете man 2 pagename, вы запрашиваете man-страницу в разделе системных вызовов.В разделе 3 также рассматриваются библиотечные функции, поэтому вы можете запустить man 3 sprintf в следующий раз, когда захотите прочитать о sprintf.

Как библиотеки C связаны с системными вызовами

Что касается того, как библиотеки C реализуют свою функциональность, обычно они создают все поверх системных вызовов, особенно в UNIX-подобных операционных системах.malloc внутренне использует mmap () или brk () на многих платформах, чтобы получить реальную память для вашего процесса, а функции ввода-вывода часто используют буферы с вызовами чтения, записи.Если есть какой-то другой механизм или библиотека, обеспечивающая необходимую функциональность, они могут также использовать их вместо этого (то есть некоторые библиотеки C для DOS могут использовать прямые прерывания BIOS вместо вызова только прерываний DOS, тогда как библиотеки C для Windows могут использовать Win32 APIзвонки).

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

Чтобы на самом деле узнать, что происходит с вашей конкретной реализацией, вы должны исследовать, что происходит в отладчике (просто продолжайте входить во все вызовы функций), или просмотреть исходный код библиотеки C, которую вы используете.

Как ваш код C с использованием библиотек C связан с машинным кодом

В вашем вопросе вы также предложили:

C code -> C compiler -> kernel calls / asm -> assembler -> machine binary

Это объединяет два очень разныхконцепции.Функции и вызовы функций поддерживаются на уровне машинного кода и сборки, поэтому ваш код на C имеет прямое отображение на машинный код:

C code -> C compiler -> Assembler -> Linker -> Machine Binary

То есть компилятор переводит ваши вызовы функций в C в вызовы функцийв Assembly и системные вызовы в C для системных вызовов в Assembly.

Однако на большинстве платформ этот машинный код содержит ссылки на общие библиотеки и функции в этих библиотеках, поэтому ваш машинный код может иметь функцию, которая вызывает другие функции.из общей библиотеки.Затем ОС загружает машинный код этой общей библиотеки (если он еще не загружен для чего-то другого), а затем запускает машинный код для функции библиотеки.Затем, если эта библиотечная функция вызывает системные вызовы через прерывания, ядро ​​получает запрос на системный вызов и выполняет низкоуровневые операции непосредственно с аппаратным обеспечением или BIOS.

Таким образом, в ОС защищенного режима ваш машинный код может бытьрассматривается как выполнение следующих действий:

                                <----------+
                                           |  
Function call to -> Other function calls --+
              or -> System calls to -> Direct hardware access (inside kernel)
                                 or -> BIOS calls (inside kernel)

Конечно, вы можете также вызывать системные вызовы непосредственно в вашей программе, пропуская необходимость в каких-либо библиотеках, но если вы не пишете свою собственную библиотеку, обычно естьочень мало нужно сделать это.Если вам нужен доступ даже более низкого уровня, вы должны написать код уровня ядра, такой как драйверы или подсистемы ядра.

2 голосов
/ 07 сентября 2011

Рекомендованным способом является не выполнение INT 0x80 самостоятельно, а использование функций-обёрток из stdlib. Они, конечно, также доступны для сборки.

Относительно printf это работает следующим образом:

printf внутренне вызывает fprintf(stdout, ...), который, в свою очередь, использует FILE * stdout для записи в дескриптор файла 1 и выполняет write(1, ...). Это вызывает небольшую функцию-обертку, чтобы установить правильные регистры для аргументов и выполнить вызов ядра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...