- ผู้คนแยกความแตกต่างระหว่างสิ่งที่ซับซ้อนกับสิ่งที่แค่ยุ่งยาก ความซับซ้อนมักถูกมองว่าน่าสนใจ แต่ความยุ่งยากถูกมองว่าเป็นโทษ กระบวนการตั้งค่า CPU x86_64 ส่วนใหญ่จัดอยู่ในประเภทหลัง
- อธิบายวิธีตั้งค่า CPU จากบูตเซกเตอร์ที่ BIOS โหลดขึ้นมา ให้เปลี่ยนจาก 16-bit real mode ไปเป็น 64-bit long mode การตั้งค่านี้เป็นเพียงพื้นฐาน และยังต้องมีงานอื่นเพิ่มเติม
- ต้องใช้ Intel 64 and IA-32 Architectures Software Developer’s Manual, แอสเซมเบลอร์ (ใช้ nasm) และ QEMU รวมถึงควรรู้ x86 assembly และไวยากรณ์ของ nasm
จุดเริ่มต้น: BIOS
- หลังรีเซ็ต CPU ตระกูล x86 จะอยู่ใน "real mode" โหมดนี้มีขนาดโอเปอแรนด์เริ่มต้น 16 บิต และสามารถอ้างที่อยู่หน่วยความจำ 1MB ได้ด้วยการใช้ segmentation
- โค้ดชุดแรกที่รันหลัง BIOS อยู่ในบูตเซกเตอร์ BIOS จะค้นหาเซกเตอร์แรกในระบบที่ลงท้ายด้วย
0xaa55 แล้วโหลดบูตเซกเตอร์นั้นไปยังที่อยู่หน่วยความจำ 0x7c00
- BIOS ให้มาเพียง 512 ไบต์ ดังนั้นจึงต้องใช้พื้นที่นี้ในการบูตสแตรปส่วนที่เหลือของบูตโหลดเดอร์
การตั้งค่าบูตเซกเตอร์
- ตั้งค่าบูตเซกเตอร์แบบง่ายเพื่อใช้รูทีนของ BIOS แสดงข้อความบนหน้าจอแล้วหยุดการทำงาน เพื่อยืนยันว่าเครื่องมือทำงานได้ถูกต้อง
- ใช้โค้ดแอสเซมบลีและ Makefile เพื่อตั้งค่าบูตเซกเตอร์
ขั้นที่ 1 – โหลดขั้นที่ 2 จากดิสก์
- สามารถแบ่งบูตโหลดเดอร์ออกเป็นสองขั้นได้ ขั้นที่ 1 คือโค้ดในบูตเซกเตอร์ ซึ่งเป็นทุกอย่างที่ BIOS โหลดมา จุดประสงค์เดียวของขั้นที่ 1 คือโหลดขั้นที่ 2 เข้าสู่หน่วยความจำ
- ในขั้นที่ 2 จะเปลี่ยนจาก 16-bit real mode ไปเป็น 32-bit protected mode ใน protected mode จะไม่สามารถใช้รูทีนของ BIOS ได้อีกต่อไป การโหลดเซกเตอร์จากดิสก์จึงซับซ้อนขึ้นมาก
- อธิบายวิธีเข้าถึงดิสก์โดยใช้ BIOS
32-bit protected mode
- เปลี่ยน CPU จาก real mode (16 บิต) ไปเป็น protected mode (32 บิต) ใน protected mode จะใช้ segmentation เพื่อทำ memory protection
- ก่อนเปลี่ยนไป protected mode ต้องกำหนด Global Descriptor Table (GDT) ก่อน โดย GDT จะถูกนิยามเป็นโครงสร้างต่อเนื่องในหน่วยความจำ
- อธิบายวิธีกำหนด GDT และสลับไปยัง protected mode
64-bit long mode
- ก่อนจะเปลี่ยนไป long mode CPU ต้องอยู่ใน protected mode และต้องเปิดใช้ paging แล้ว โดย protected mode ได้ตั้งค่าไว้แล้ว แต่ยังต้องมี paging
- paging จะเข้ามาแทน segmentation เพื่อจัดการ virtual address space, สิทธิ์การเข้าถึง และอื่น ๆ พร้อมอธิบายวิธีสร้าง page table สำหรับการสลับไป long mode
- อธิบายการกำหนด GDT สำหรับการเปลี่ยนไป long mode และวิธีสลับจาก protected mode ไปเป็น long mode
สรุปโดย GN⁺
- บทความนี้อธิบายอย่างละเอียดถึงกระบวนการตั้งค่า CPU x86_64 จาก 16-bit real mode ไปเป็น 64-bit long mode ซึ่งช่วยเพิ่มความเข้าใจเกี่ยวกับการพัฒนาบูตโหลดเดอร์และเคอร์เนลของระบบปฏิบัติการ
- ครอบคลุมแนวคิดหลากหลาย เช่น BIOS, บูตเซกเตอร์, protected mode และ long mode พร้อมให้โค้ดแอสเซมบลีและวิธีตั้งค่าที่จำเป็นในแต่ละขั้น
- บทความนี้มีประโยชน์สำหรับผู้ที่สนใจการพัฒนาระบบปฏิบัติการ โดยเฉพาะผู้ที่ต้องการความเข้าใจเชิงลึกเกี่ยวกับสถาปัตยกรรม x86 โครงการที่มีลักษณะคล้ายกันคือ "Writing a Simple Operating System – from Scratch"
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News