Nighpher ผมจะพยายามที่จะตอบคำถามของคุณ แต่สำหรับคำอธิบายที่ครอบคลุมมากขึ้นของกระบวนการบูตลองบทความไอบีเอ็ม
ตกลงฉันคิดว่าคุณกำลังใช้ GRUB หรือ GRUB2 เป็น bootloader ของคุณสำหรับคำอธิบาย ก่อนอื่นเมื่อ BIOS เข้าถึงดิสก์ของคุณเพื่อโหลด bootloader มันจะใช้รูทีนในตัวสำหรับการเข้าถึงดิสก์ซึ่งถูกเก็บไว้ใน 13h interrupt ที่มีชื่อเสียง Bootloader (และเคอร์เนลในขั้นตอนการตั้งค่า) ใช้ประโยชน์จากรูทีนเหล่านั้นเมื่อเข้าถึงดิสก์ โปรดทราบว่า BIOS ทำงานในโหมดจริง (16 บิต) ของโปรเซสเซอร์ดังนั้นจึงไม่สามารถระบุ RAM ได้มากกว่า 2 ^ 20 ไบต์ (2 ^ 20 ไม่ใช่ 2 ^ 16 เพราะแต่ละแอดเดรสในโหมดจริงประกอบด้วย Segment_address * 16 + ออฟเซ็ต ที่ทั้งอยู่เซ็กเมนต์และชดเชยเป็น 16 บิตดูhttp://en.wikipedia.org/wiki/X86_memory_segmentation ) ดังนั้นกิจวัตรเหล่านี้ไม่สามารถเข้าถึง RAM มากกว่า 1 MiB ซึ่งเป็นข้อ จำกัด ที่เข้มงวดและความไม่สะดวกที่สำคัญ
BIOS โหลดรหัส bootloader จาก MBR - 512 ไบต์แรกของดิสก์ของคุณและเรียกใช้งาน หากคุณกำลังใช้ GRUB รหัสนั้นจะเป็น GRUB ขั้นที่ 1 โค้ดนั้นจะโหลด GRUB สเตจ 1.5 ซึ่งอยู่ในพื้นที่ดิสก์ 32 กิโลบิตแรกซึ่งเรียกว่าภูมิภาคเข้ากันได้ของ DOS หรือจากที่อยู่ถาวรของระบบไฟล์ ไม่จำเป็นต้องทำความเข้าใจกับระบบไฟล์เพื่อทำสิ่งนี้เพราะเหตุนี้ถึงแม้ว่าขั้นตอนที่ 1.5 จะอยู่ในระบบไฟล์มันเป็นรหัส "ดิบ" และสามารถโหลดไปยัง RAM โดยตรงและดำเนินการได้ที่: http://www.pixelbeat.org/ เอกสาร / ดิสก์ / โหลดของ stage1.5 จากดิสก์ไปยัง RAM ทำให้การใช้รูทีนการเข้าถึงดิสก์ BIOS
Stage1.5 มียูทิลิตีระบบไฟล์เพื่อให้สามารถอ่านสเตจ 2 จากระบบไฟล์ได้ (ยังคงใช้ BIOS 13h เพื่ออ่านจากดิสก์ถึง RAM แต่ตอนนี้มันสามารถถอดรหัสข้อมูลระบบไฟล์เกี่ยวกับ inodes ฯลฯ และรับรหัสดิบจาก ดิสก์). BIOS ที่เก่ากว่าอาจไม่สามารถเข้าถึง HD ทั้งหมดได้เนื่องจากข้อ จำกัด ในโหมดการกำหนดแอดเดรสของดิสก์ - พวกเขาอาจใช้ระบบ Cylinder-Head-Sector ไม่สามารถจัดการกับพื้นที่ดิสก์ได้มากกว่า 8 GiB แรก: http: //en.wikipedia org
Stage2 โหลดเคอร์เนลเป็น RAM (อีกครั้งโดยใช้ยูทิลิตี้ดิสก์ BIOS) หากเป็นเคอร์เนล 2.6+ เคอร์เนลก็มีการรวบรวม initramfs ไว้ภายในดังนั้นจึงไม่จำเป็นต้องโหลด หากเป็นเคอร์เนลที่เก่ากว่า bootloader จะโหลดอิมเมจ initrd แบบสแตนด์อโลนไว้ในหน่วยความจำด้วยดังนั้นเคอร์เนลจึงสามารถเมานต์และรับไดรเวอร์สำหรับติดตั้งระบบไฟล์จริงจากดิสก์
ปัญหาคือเคอร์เนล (และ ramdisk) มีน้ำหนักมากกว่า 1 MiB ดังนั้นการโหลดลงใน RAM คุณต้องโหลดเคอร์เนลเป็น 1 MiB แรกจากนั้นข้ามไปที่โหมดป้องกัน (32 บิต) ย้ายเคอร์เนลที่โหลดไปยังหน่วยความจำสูง (ฟรี 1 MiB แรกสำหรับโหมดจริง) จากนั้นกลับสู่โหมดจริง (16 บิต) อีกครั้งรับ ramdisk จากดิสก์ไปที่ 1 MiB แรก (ถ้าเป็นโหมด initrd และเคอร์เนลที่แยกต่างหาก) อาจเปลี่ยนเป็นโหมดป้องกัน (32 บิต) อีกครั้ง นำไปไว้ในตำแหน่งที่เป็นไปได้กลับไปที่โหมดจริง (หรือไม่: /programming/4821911/does-grub-switch-to-protected-mode ) และรันโค้ดเคอร์เนล คำเตือน: ฉันไม่แน่ใจเกี่ยวกับความละเอียดและความแม่นยำของคำอธิบายส่วนนี้ทั้งหมด
ตอนนี้เมื่อคุณรันเคอร์เนลในที่สุดคุณก็มีมันและ ramdisk ถูกโหลดเข้าไปใน RAM โดย bootloaderดังนั้นเคอร์เนลจึงสามารถใช้ยูทิลิตี้ดิสก์จาก ramdisk เพื่อติดตั้งระบบไฟล์รูทจริงและเดือยหลักของมัน มีไดรเวอร์ ramfs อยู่ในเคอร์เนลดังนั้นจึงสามารถเข้าใจเนื้อหาของ initramfs ได้