Я изучаю драйверы устройств и программирование ядра. Согласно книге Джонатана Корбета, main()
в драйверах устройств нет функции.
Итак, у меня два вопроса:
- Почему нам не нужна
main()
функция в драйверах устройств? - Есть ли у самого ядра
main()
функция?
Может кто-то объяснить это мне?
linux-kernel
drivers
кто то
источник
источник
Ответы:
В программах пространства пользователя
main()
- это точка входа в программу, которая вызывается кодом инициализации libc при выполнении двоичного файла. Код ядра не может позволить себе полагаться на libc, так как сам libc использует интерфейс системного вызова ядра для распределения памяти, ввода-вывода, управления процессами и т. Д.Тем не менее, эквивалент
main()
в коде ядра естьstart_kernel()
, который вызывается загрузчиком после загрузки образа ядра, распаковывает его в память и настраивает необходимое оборудование и пейджинг памяти.start_kernel()
выполняет большую часть настройки системы и в конечном итоге порождает процесс инициализации.Точка входа в модули ядра Linux - это функция init, которая регистрируется в ядре путем вызова
module_init()
макроса. Зарегистрированная функция инициализации модуля затем вызывается кодом ядра черезdo_initcalls()
функцию во время запуска ядра.источник
main
метода в C. (Это слишком распространенное заблуждение, что операционная система делает прямой вызовmain
, что не соответствует действительности , а в меньшей степени, например, в C ++.) I ' Я бы дал тебе еще один голос, если бы мог.Ядро не имеет
main
функции.main
это концепция языка C. Ядро написано на С и сборке. Код входа в ядро написан сборкой.Последовательность загрузки организована следующим образом:
initrd
). Затем выполняется код по какому-либо адресу.init
процесс), переключает контекст ЦП с кольца 0 на кольцо 3 и запускает процесс инициализации (идентификатор процесса равен 1). Теперь загрузка ядра завершена!init
Программа запускает все сценарии инициализации. Все сервисы запущены. Оболочка называется. Пользователи могут войти.main
Функция является функцией С. На самом деле основной метод не является точкой входа программ на Си. Среда выполнения C вызывает много функций раньшеmain
. GCC имеет расширенную функцию: конструкторы. Функции, объявленные как «конструктор», вызываются раньшеmain
.Например:
Этот макрос из проекта qemu.
источник
initrd.img
НЕ является образом ядра. Это набор модулей, загружаемых ядром при загрузке. Изображения ядра обычно имеют имена, начинающиеся с «vmlinuz», но отличаются от дистрибутива к дистрибутиву.Например, в файле arch / x86 / boot / main.c есть функция main () для подготовки системы к переходу из реального в защищенный режим, но в других архитектурах такого кода нет. Есть хороший обзор, как работает загрузка ядра Linux 2.6.x на платформе x86. Это действительно стоит прочитать.
Согласно документу HOWTO по разработке ядра Linux, ядро Linux
что в соответствии со стандартом C, кстати, означает, что
источник