1 คะแนน โดย GN⁺ 2024-07-16 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • ผู้คนแยกความแตกต่างระหว่างสิ่งที่ซับซ้อนกับสิ่งที่แค่ยุ่งยาก ความซับซ้อนมักถูกมองว่าน่าสนใจ แต่ความยุ่งยากถูกมองว่าเป็นโทษ กระบวนการตั้งค่า 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 ความคิดเห็น

 
GN⁺ 2024-07-16
ความคิดเห็นจาก Hacker News
  • มีวิธีเปลี่ยนไปใช้ long mode ได้โดยไม่ต้องสลับไป protected mode ด้วยตัวเองโดยตรง
    • ได้สร้างบูตโหลดเดอร์ที่โหลดเคอร์เนล 64 บิตขนาดเล็กลงใน boot sector
    • รวมขั้นตอนการโหลดเคอร์เนลจากดิสก์และตั้งค่าโหมด VESA
  • 80286 มี MSW ซึ่งเป็นรีจิสเตอร์ 16 บิต และ 80386 ได้ขยายมันเป็น CR0 แบบ 32 บิต
    • long mode 64 บิตได้เพิ่ม EFER MSR และขยาย CR0 เป็น 64 บิต
    • ปัจจุบันใช้งานเพียงบิตที่ 11 ของ CR0 และบิตที่ 8 ของ EFER
    • สงสัยว่าทำไม Intel/AMD ถึงไม่ใช้บิตว่างในรีจิสเตอร์เดิม
  • ส่วนที่ซับซ้อนเกินความจำเป็นที่สุดในบทความนี้คือ Makefile และ linker script
    • NASM สามารถสร้างเอาต์พุตแบบ flat binary ได้ แต่ดูเหมือนผู้เขียนจะคิดว่าการใช้วิธีนั้น "แฮ็ก" เกินไป
  • ทุกขั้นตอนที่จำเป็นในการสลับ CPU ไปยังโหมดที่ถูกต้องนั้นซับซ้อนเกินความจำเป็น
    • ดูเหมือนว่าทั้งหมดนี้จำเป็นเพื่อรองรับ backward compatibility
    • Intel น่าจะสามารถให้แฟลกหรือคำสั่งที่เริ่มต้นในโหมดที่ถูกต้องได้ตั้งแต่แรก
    • หรือไม่ก็ลบความเข้ากันได้ย้อนหลังทั้งหมดออกไป
    • จำได้ว่าเคยค้นดูว่า ARM64 ก็มีปัญหาคล้ายกันหรือไม่
    • สงสัยว่ามี CPU ที่ออกแบบมาเป็น 64 บิตตั้งแต่ต้นหรือไม่
    • นั่นน่าจะเป็นเป้าหมาย/แนวคิดการออกแบบของ Itanium
  • อาจมีผู้สนับสนุน UEFI ที่ไม่เข้าใจเหตุผลของการสร้างแนวทางบูตโหลดเดอร์แบบใหม่
    • อย่างที่ผู้เขียนบอกไว้ว่า "ถ้ามาถึงจุดนี้ได้ ก็เจ๋งแล้ว"
  • สงสัยว่า UEFI มีมานานแค่ไหนแล้ว
    • น่าเสียดายที่ไม่ได้ยกเลิก BIOS ไปพร้อมกับ long mode
  • สงสัยว่าขั้นตอนบูตนี้เข้ากันได้กับ EFI/UEFI หรือไม่
    • สงสัยว่า supervisor ของ UEFI จำลอง real mode/protected mode/long mode บนฮาร์ดแวร์จริงหรือไม่
  • สงสัยว่ากระบวนการนี้บน ARM จะง่ายกว่าหรือไม่