start_kernel
В 4.2, start_kernel
от init/main.c
- значительный процесс инициализации и может быть сравнен с функцией main
.
Это первый независимый от дуги код и устанавливает большую часть ядра.
Это, однако, не первый код ядра для запуска.
Как start_kernel
вызывается в x86_64
arch/x86/kernel/vmlinux.lds.S
, компоновщик скрипт, устанавливает:
ENTRY(phys_startup_64)
и
phys_startup_64 = startup_64 - LOAD_OFFSET;
и:
#define LOAD_OFFSET __START_KERNEL_map
arch/x86/include/asm/page_64_types.h
определяет __START_KERNEL_map
как:
#define __START_KERNEL_map _AC(0xffffffff80000000, UL)
, который является адресом входа ядра. TODO, как именно этот адрес достиг? Я должен понять, что интерфейс Linux предоставляет загрузчикам.
arch/x86/kernel/vmlinux.lds.S
устанавливает самую первую секцию загрузчика как:
.text : AT(ADDR(.text) - LOAD_OFFSET) {
_text = .;
/* bootstrapping code */
HEAD_TEXT
include/asm-generic/vmlinux.lds.h
определяет HEAD_TEXT
:
#define HEAD_TEXT *(.head.text)
arch/x86/kernel/head_64.S
определяет startup_64
. Это самый первый код ядра x86, который запускается. Он делает лот установки низкого уровня, включая сегментацию и пейджинг.
То есть то первое, что работает, потому что файл начинается с:
.text
__HEAD
.code64
.globl startup_64
и include/linux/init.h
определяет __HEAD
как:
#define __HEAD .section ".head.text","ax"
так же, как и самое первое, что сценарий линкера ,
В конце концов, это вызывает x86_64_start_kernel
немного неловко и lretq
:
movq initial_code(%rip),%rax
pushq $0 # fake return address to stop unwinder
pushq $__KERNEL_CS # set correct cs
pushq %rax # target address in negative space
lretq
и:
.balign 8
GLOBAL(initial_code)
.quad x86_64_start_kernel
arch/x86/kernel/head64.c
определяет x86_64_start_kernel
, который вызывает x86_64_start_reservations
который вызывает start_kernel
.
Если никто не знает ответа, почему вы голосуете за мой вопрос? – someone
С 'main()' вы, возможно, означаете, что означает 'main()' для программы, а именно ее «точка входа»? – alk
@ alk..Book говорит, что мы имеем 'init_module' как точку входа и' exit_module' как точку выхода. Я исхожу из фона 'C' и узнаю, что никакая программа не может выполняться без функции' main() '. поэтому просто хочу знать, как работают драйверы без 'main()'. – someone