Как человек, который написал программы, которые выполняются без ОС, я предлагаю однозначный ответ.
Требуется ли для запуска исполняемого файла ядро ОС?
Это зависит от того, как эта программа была написана и построена.
Вы могли бы написать программу (при условии, что у вас есть знания), которая вообще не требует ОС.
Такая программа называется автономной.
Загрузчики и диагностические программы типичны для автономных программ.
Однако типичная программа, написанная и встроенная в некоторые среды хост-ОС, по умолчанию будет выполняться в той же среде хост-ОС.
Для написания и построения отдельной программы требуются очень четкие решения и действия.
... выводом компилятора является машинный код (исполняемый файл), который, как я думал, был инструкцией непосредственно для процессора.
Правильный.
Недавно я читал о ядрах и обнаружил, что программы не могут напрямую обращаться к оборудованию, но должны пройти через ядро.
Это ограничение, накладываемое режимом процессора, который ОС использует для выполнения программ, и облегчается некоторыми инструментами сборки, такими как компиляторы и библиотеки.
Это не внутреннее ограничение для каждой программы, когда-либо написанной.
Поэтому, когда мы скомпилируем некоторый простой исходный код, скажем, просто с помощью функции printf(), и компиляция создаст исполняемый машинный код, каждая инструкция в этом машинном коде будет напрямую выполняться из памяти (как только код будет загружен в память ОС ) или каждая команда в машинном коде все еще должна проходить через ОС (ядро) для выполнения?
Каждая инструкция выполняется процессором.
Неподдерживаемая или недопустимая инструкция (например, процесс имеет недостаточные привилегии) вызовет немедленное исключение, и ЦП вместо этого выполнит подпрограмму для обработки этого необычного условия.
Функция printf() не должна использоваться в качестве примера "простого исходного кода".
Перевод с объектно-ориентированного языка программирования высокого уровня на машинный код может быть не таким тривиальным, как вы предполагаете.
Затем вы выбираете одну из самых сложных функций из библиотеки времени выполнения, которая выполняет преобразование данных и ввод-вывод.
Обратите внимание, что ваш вопрос предусматривает среду с ОС (и библиотекой времени выполнения).
Как только система загружается и ОС получает контроль над компьютером, накладываются ограничения на то, что может делать программа (например, ввод-вывод должен выполняться ОС).
Если вы ожидаете запуска автономной программы (то есть без ОС), вам не нужно загружать компьютер для запуска ОС.
... что происходит после загрузки машинного кода в память?
Это зависит от окружающей среды.
Для автономной программы это может быть выполнено, т.е. управление передается путем перехода к начальному адресу программы.
Для программы, загружаемой ОС, программа должна быть динамически связана с общими библиотеками, от которых она зависит. ОС должна создать пространство для выполнения процесса, который будет выполнять программу.
Пройдет ли оно через ядро или напрямую пообщается с процессором?
Машинный код выполняется процессором.
Они не "проходят через ядро", но и не "общаются с процессором".
Машинный код (состоящий из кода операции и операндов) является инструкцией для ЦП, которая декодируется, и операция выполняется.
Возможно, следующая тема, которую вы должны изучить, - это режимы процессора.