ระบบปฏิบัติการที่ใช้ X86 สร้างขึ้นจากจุดเริ่มต้นเพื่อจุดประสงค์ในการเรียนรู้
int 64 ซึ่งจำเป็นต้องมีตัวบ่งชี้เกตสำหรับการเพิ่มสิทธิพิเศษเพื่อสร้างระบบปฏิบัติการ (สมมติว่า GCC, NASM ติดตั้ง),
makeเพื่อวิ่งภายใต้ QEMU
make qemuในการเรียกใช้ (สมมติว่า Bochs, Bochs-SDL ติดตั้ง),
make runเพื่อทำงานภายใต้ QEMU ด้วยการสนับสนุนการดีบัก (GDB)
make qemu_gdb(แนบ GDB, คำสั่งที่จำเป็นได้ให้ไว้แล้วในไฟล์. gdbinit ในระดับสูงสุด)
BIOS เริ่มโปรเซสเซอร์ในโหมดจริง 16 บิต Grub เริ่มต้นโหมดป้องกัน 32 บิต ภาพเคอร์เนลเอลฟ์นั้นมาพร้อมกับส่วนหัวมัลติบูตตามข้อกำหนดของด้วงหากด้วงพบส่วนหัวนี้ในภาพ 512 ไบต์แรกจากนั้นจะโหลด ELF ที่ตำแหน่ง 0x100000 หน่วยความจำที่ต่ำกว่าเป็นของไบออสและการแมปฮาร์ดแวร์/io อื่น ๆ เช่น VGA Bootup Code, ดำเนินการจากจุดเริ่มต้น _start ของเคอร์เนลและ (หมายเหตุ BSS เป็นศูนย์เริ่มต้นโดย GRUB)
การจัดสรรหน่วยความจำกลยุทธ์ first-fit อย่างง่ายจัดสรรหน่วยความจำจากพื้นที่เคอร์เนลในระหว่าง free มันยังจัดการการบดอัดของบล็อกฟรีที่อยู่ติดกัน
สำหรับผู้ใช้สเปซ malloc/ฟรีมีให้บริการที่ใช้ระบบ sbrk ภายในเพื่อเพิ่มการหยุดพักของระบบ (ถ้าจำเป็น) เคอร์เนลไม่จำเป็นต้องตั้งค่าตารางหน้าและการส่งคืนเพิ่มขีด จำกัด การแบ่งระบบ
สิ่งนี้แบ่งออกเป็นการแมปหน่วยความจำพื้นที่เคอร์เนลและการแมปหน่วยความจำพื้นที่ผู้ใช้ การแมปพื้นที่เคอร์เนลยังคงคงที่และเป็นส่วนหนึ่งของพื้นที่ที่อยู่กระบวนการทุกขั้นตอนเท่านั้นที่เชื่อมโยงไม่ได้โคลนเนื่องจากการเปลี่ยนแปลงจากกระบวนการหนึ่งในพื้นที่เคอร์เนลควรมองเห็นกระบวนการอื่น ๆ ได้เช่นกัน
การแมปพื้นที่ของผู้ใช้ขึ้นอยู่กับการโทร exec และทุกกระบวนการมีเคอร์เนลของตัวเองและสแต็กผู้ใช้
ในระหว่างการสวิตช์บริบทการลงทะเบียน CR3 จะได้รับการโหลดด้วยที่อยู่พื้นฐานของไดเรกทอรีหน้ากระบวนการในปัจจุบัน
แอปพลิเคชันพื้นที่ผู้ใช้จะถูกเก็บไว้ใน initramfs ซึ่งเป็นรูปแบบ CPIO Archieve ในรูปแบบ ELF มาตรฐาน ในระหว่างเคอร์เนล exec พบและวิเคราะห์ภาพเอลฟ์ให้ตั้งค่าตารางหน้าตามนั้น กระบวนการเริ่ม Init จะเริ่มต้นเฉพาะ shell แล้วแขวนอยู่ที่นั่นตลอดไป
Scheduler ทำงานในนามของกระบวนการดำเนินการในปัจจุบันส่วนใหญ่ในสองกรณี
รหัสโหมดเคอร์เนล/ส่วนข้อมูลแยกต่างหากกว่ารหัสโหมดผู้ใช้/กลุ่มข้อมูลที่มีระดับสิทธิ์ที่ตั้งโปรแกรมไว้ ในขณะที่กลับมาจากข้อยกเว้นฮาร์ดแวร์จะปรากฏขึ้น CS (เซ็กเมนต์โค้ด) และ SS (เซ็กเมนต์สแต็ก) จากสแต็กเพื่อกลับสู่ระดับสิทธิพิเศษที่ลดลง
เราตั้งโปรแกรมเฟรมสแต็กนี้ตามที่สร้างงานใหม่
/* Task will start in CPL = 3, i.e. user mode */
task -> irqf -> cs = ( SEG_UCODE << 3 ) | DPL_USER ;
task -> irqf -> ds = ( SEG_UDATA << 3 ) | DPL_USER ;
task -> irqf -> eflags = 0x200 ;
task -> irqf -> ss = ( SEG_UDATA << 3 ) | DPL_USER ;ฮาร์ดแวร์ x86 มีการสนับสนุนในตัวสำหรับการสลับงานโดยทั่วไปการสลับจากสแต็กผู้ใช้เป็นสแต็กเคอร์เนลพร้อมกับพารามิเตอร์การแบ่งส่วนอื่น ๆ สำหรับสิ่งนี้ทุกงานจำเป็นต้องตั้งค่าด้วย TSS ของตัวเองซึ่งได้รับการแก้ไขในระหว่างการสลับบริบท เราจะไม่ใช้การสลับงานฮาร์ดแวร์ แต่จะทำแบบเดียวกันในซอฟต์แวร์เอง ไม่ว่าในกรณีใดเราจำเป็นต้องตั้งค่าอย่างน้อยหนึ่ง TSS ซึ่งมีโหมดเคอร์เนลที่ถูกต้อง SS (เซ็กเมนต์สแต็ก) และ ESP (สแต็กตัวชี้) สำหรับงานปัจจุบัน
คำถามที่พบบ่อยสุ่ม
อย่าลังเลที่จะแยกและส่งคำขอรวม