Việc chuyển giao từ bộ nạp khởi động vào kernel nhất thiết phải bao gồm một số cân nhắc về kiến trúc cụ thể như địa chỉ bộ nhớ và đăng ký sử dụng. Do đó, vị trí cần tìm là trong các thư mục dành riêng cho kiến trúc ( arch/*
). Hơn nữa, việc chuyển giao từ bộ nạp khởi động liên quan đến một giao thức sử dụng đăng ký chính xác có khả năng được thực hiện trong trình biên dịch chương trình. Hạt nhân thậm chí có các điểm nhập khác nhau cho các bộ tải khởi động khác nhau trên một số kiến trúc.
Ví dụ: trên x86, điểm vào là arch/x86/boot/header.S
(Tôi không biết các điểm vào khác, nhưng tôi không chắc là không có điểm nào). Điểm mấu chốt thực sự là những _start
nhãn ở bù đắp 512 trong nhị phân . 512 byte trước đó có thể được sử dụng để tạo bản ghi khởi động chính cho BIOS tương thích với PC của IBM (ngày xưa, kernel có thể khởi động theo cách đó, nhưng bây giờ phần này chỉ hiển thị thông báo lỗi). Các _start
nhãn bắt đầu một số chế biến khá lâu, trong chế độ thực , lần đầu tiên trong lắp ráp và sau đó trong main.c
. Tại một số điểm, mã khởi tạo chuyển sang chế độ được bảo vệ . Tôi nghĩ rằng đây là điểm giải nén xảy ra nếu kernel bị nén; sau đó đạt kiểm soát startup_32
hoặc startup_64
trong arch/x86/kernel/head_*.S
tùy thuộc vào việc này là một phiên bản 32-bit hoặc 64-bit kernel. Sau khi lắp ráp nhiều hơn, i386_start_kernel
tronghead32.c
hoặc x86_64_start_kernel
tronghead64.c
được gọi. Cuối cùng, start_kernel
hàminit/main.c
độc lập với kiến trúc trong được gọi.
start_kernel
là nơi hạt nhân bắt đầu chuẩn bị cho thế giới thực. Khi nó khởi động, chỉ có một CPU và một số bộ nhớ (với bộ nhớ ảo, MMU đã được bật tại thời điểm đó). Mã ở đó thiết lập các cặp bản đồ bộ nhớ, khởi tạo tất cả các hệ thống con, thiết lập các trình xử lý ngắt, khởi động bộ lập lịch để các luồng có thể được tạo, bắt đầu tương tác với các thiết bị ngoại vi, v.v.
Nhân có các điểm nhập khác ngoài bộ nạp khởi động: điểm nhập khi bật lõi trên CPU đa lõi, trình xử lý ngắt, trình xử lý cuộc gọi hệ thống, trình xử lý lỗi, lỗi