После того, как загрузчик выполнит выполнение ядра, что произойдет? Я знаю ассемблер, так какие первые инструкции нужно сделать ядру? Или есть функция C, которая делает это? Какова последовательность запуска, прежде чем ядро может выполнить произвольный двоичный файл?
Каковы первые операции, выполняемые ядром Linux при загрузке?
Ответ 1
Я предполагаю, что вы говорите о x86 здесь...
Это зависит от того, где вы считаете границу между "загрузчиком" и "ядром": начало собственно ядра - это 32-разрядный код защищенного режима, но сам ядро предоставляет некоторый код загрузки, чтобы добраться из реального режима.
Код реального режима находится в arch/x86/boot/
: start_of_setup
выполняет некоторую базовую настройку среды для C и вызывает main()
, что делает некоторые довольно скучные вещи, заканчивающиеся фактическим перейдите в защищенный режим (см. pmjump.S
).
Теперь, когда вы закончите, зависит от того, сжато ядро или нет. Если это так, точка входа фактически является процедурой самодекомпрессии. Это довольно скучный материал и, по сути, прозрачный: код декомпрессии и сжатое ядро перемещаются выше в сторону от места, тогда ядро несжато в исходное местоположение, а затем впрыскивается, как если бы он был несжатым вдоль. Этот код находится в arch/x86/boot/compressed/
(точка входа startup_32
в head_32.S
).
Ядро действительно правильно идет на startup_32
в arch/x86/kernel/head_32.S
. Код заканчивается тем, что вызывается i386_start_kernel()
в arch/x86/kernel/head32.c
, который в конечном итоге вызывает общий код запуска ядра в start_kernel()
.
Ответ 2
Это asmlinkage void __init start_kernel(void)
Функция C в init/main.c
.