Nhìn vào các tệp nguồn, Linux bắt đầu thực thi ở đâu?


7

Tôi muốn đọc một chút mã nguồn để thử và hiểu làm thế nào tất cả khớp với nhau, nhưng không thể thấy bắt đầu từ đâu. Tập tin nào trong mã nguồn Linux là tập tin chính được sử dụng để biên dịch kernel?

Tôi đã mong đợi một nửa để tìm một kernel/main.c, nhưng có nhiều tập tin bên dưới kernel/và tôi không thể xem cái nào là chính? Phải kernel/sys.ckhông

Câu trả lời:


9

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 _startnhã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 _startnhã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_32hoặc startup_64trong arch/x86/kernel/head_*.Stù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_kerneltronghead32.c hoặc x86_64_start_kerneltronghead64.c được gọi. Cuối cùng, start_kernelhàminit/main.c độc lập với kiến ​​trúc trong được gọi.

start_kernellà 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


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.