Я знаю, что когда исходный код, скажем, C ++, компилируется, выводом компилятора является машинный код (исполняемый файл), который, как я думал, был инструкцией непосредственно для процессора. Недавно я читал о ядрах и обнаружил, что программы не могут получить доступ к оборудованию напрямую, но должны пройти через ядро.
Поэтому, когда мы компилируем некоторый простой исходный код, скажем, просто с помощью printf()
функции, и компиляция создает исполняемый машинный код, будет ли каждая инструкция в этом машинном коде напрямую выполняться из памяти (как только код загружен в память операционной системой) или будет каждая команда в машинном коде все еще должна пройти через ОС (ядро) для выполнения?
Я прочитал похожий вопрос . Он не объяснил, является ли машинный код, сгенерированный после компиляции, инструкцией непосредственно для ЦП, или ему потребуется снова пройти через ядро, чтобы создать правильную инструкцию для ЦПУ. Т.е. что происходит после загрузки машинного кода в память? Пройдет ли оно через ядро или напрямую пообщается с процессором?
printf
не очень хороший пример. Он явно определен спецификацией C как функция, которая доступна только в «размещенных» реализациях (имеется в виду запуск в ядре, в отличие от «автономного», который может не требовать его). И на большинстве платформ printf
это просто функция, предоставляемая вами, libc
которая делает кучу вещей от вашего имени (которая в конечном итоге включает системный вызов для печати на стандартный вывод). Это на самом деле ничем не отличается от вызова libvlc_media_list_add_media
или PyObject_GetAttr
, за исключением того, что некоторые printf
реализации гарантированно связываются без добавления дополнительных нестандартных -l
s.