เคอร์เนลไม่มีmain
ฟังก์ชั่น main
เป็นแนวคิดของภาษา C เคอร์เนลเขียนใน C และชุดประกอบ รหัสรายการของเคอร์เนลเขียนโดยชุดประกอบ
ลำดับการบู๊ตถูกจัดระเบียบดังนี้:
- BIOS จะโหลดตัวโหลดบูตจากอุปกรณ์บล็อกการบูต ตัวโหลดบูตยอดนิยมในขณะนี้คือด้วง
- ด้วงโหลดภาพ kernel ลงในหน่วยความจำที่เป็นไปได้กับอุปกรณ์รากเริ่มต้น (
initrd
) จากนั้นโค้ดที่ที่อยู่บางส่วนจะถูกดำเนินการ
- อิมเมจเคอร์เนลมีโมดูลเคอร์เนลบางตัวอย่างเช่น: โมดูลระบบไฟล์ไดรเวอร์อุปกรณ์ อิมเมจเคอร์เนลใช้โมดูลระบบไฟล์เพื่อเมาท์ระบบไฟล์รูท ตอนนี้เคอร์เนลสามารถโหลดและรันโมดูลเคอร์เนลทั้งหมดจากดิสก์
- เคอร์เนลรันภารกิจการเริ่มต้น ตัวอย่างเช่น: สำรวจบัส PCI และค้นหาอุปกรณ์ PCI ทั้งหมดเตรียมใช้งานไดรเวอร์อุปกรณ์ทั้งหมด
- ในที่สุดเคอร์เนลสร้างกระบวนการ 0 และกระบวนการ 1 (
init
กระบวนการ) สลับบริบทของ CPU จากแหวน 0 เป็นแหวน 3 และเริ่มต้นกระบวนการเริ่มต้น (กระบวนการ id คือ 1) ตอนนี้การบูตเคอร์เนลเสร็จสิ้นแล้ว!
init
โปรแกรมเรียกใช้สคริปต์ init ทั้งหมด บริการทั้งหมดเริ่มต้นแล้ว เชลล์เรียกว่า ผู้ใช้สามารถเข้าสู่ระบบ
main
ฟังก์ชั่นเป็นฟังก์ชัน C จริง ๆ แล้ววิธีการหลักไม่ใช่จุดเริ่มต้นของโปรแกรม C รันไทม์ C เรียกใช้ฟังก์ชันมากมายก่อนหน้าmain
นี้ GCC มีคุณสมบัติเพิ่มเติม: ตัวสร้าง ฟังก์ชั่นประกาศว่า "คอนสตรัค" main
ก่อนที่จะถูกเรียกว่า
ตัวอย่างเช่น:
/* This should not be used directly. Use block_init etc. instead. */
#define module_init(function, type) \
static void _attribute__((constructor)) do_qemu_init ## function(void) { \
register_module_init(function, type); \
}
มาโครนี้มาจากโครงการ qemu