#: Train-OS เซสชั่นการฝึกอบรมเพื่อสร้างระบบปฏิบัติการ เริ่มต้นจากพื้นดินขึ้นมาใช้ทรัพยากรจาก AMD และ Intel เท่านั้น
ยังอยู่ในเวทีอัลฟ่า
ที่เก็บนี้ยังไม่ขัดและยังคงต้องได้รับการพิจารณาในเวทีอัลฟ่า รหัสควรรวบรวมและทำงาน แต่การส่งข้อความเป็นเพียงร่างแรกที่ฉันสังเกตเห็นนอกเหนือจากขณะที่ฉันกำลังเขียนโค้ดและค้นคว้า
อะไรคือสิ่งที่แตกต่างจากบทเรียนอื่น ๆ ?
มีบทเรียนมากมายและส่วนใหญ่ของวัสดุที่ฉันมีอยู่ก็ครอบคลุมอยู่ที่นั่น แล้วทำไมต้องกังวล? ฉันชอบโดยเฉพาะและได้รับแรงบันดาลใจจากสิ่งเหล่านี้:
- Phil Todo: ลิงค์
- intermezzos: todo: ลิงค์
รุ่นนี้แตกต่างกันอย่างไร? เมื่อฉันเรียนรู้สิ่งใหม่ ๆ ฉันมักจะรู้สึกว่าฉันไม่รู้/เรียนรู้ ว่า ฉันจะทำสิ่งที่ฉันเพิ่งทำด้วยตัวเองได้อย่างสมบูรณ์ในครั้งต่อไป ฉันไม่รู้ว่ามันเป็นวิธีที่ฉันเรียนรู้หรือเป็นเพียงสิ่งทั่วไปที่ละเว้นได้ง่ายเมื่อเขียนบทเรียน นี่คือบางจุดที่ฉันสงสัยเกี่ยวกับเป็นประจำและฉันต้องการที่อยู่ (ฉันอาจจะพลาดสิ่งสำคัญอื่น ๆ เพื่อชดเชยให้กับมัน)
- ให้รายละเอียดเพิ่มเติมเกี่ยวกับ จุด ที่เป็นเพียง การประชุม ที่ตกลงกันไว้ว่าอะไรคือมาตรฐานอะไรคือสถาปัตยกรรมที่เฉพาะเจาะจง ฉันยังจำได้ว่าตอนที่ฉันเริ่มเรียนรู้การเขียนโปรแกรมเป็นวัยรุ่นเป็นครั้งแรกฉันเป็นเหมือน "Uuhh ... คอมพิวเตอร์รู้ได้อย่างไรว่าฟังก์ชั่น หลัก จะต้องเรียกว่าครั้งแรก" และไม่มีเพื่อนหรือครูคนใดของฉันใหม่ มันเป็นแค่ "เวทมนตร์" สิ่งเหล่านี้ รบกวน ฉันฉันอยากจะทำอะไรมาจากไหน ...
- ชี้ไปที่มาตรฐานและการทำงานจากที่นั่น ฉันจะไม่นำเสนอวิธีแก้ปัญหา ที่เสร็จแล้ว ที่คุณเพิ่งคัดลอก เราใช้มาตรฐานและ ค้นหาสิ่งต่าง ๆ เช่นเดียวกับที่เราจะต้องทำถ้าเราต้องการเรียกใช้รหัสบนสมมติว่าเยื่อหุ้มสมองแขนแทนเครื่อง x86_64 ของคุณ หรือกรอบแตกต่างกันถ้าเราจะเป็นคนแรกที่เขียนบทช่วยสอนเราจะทำให้ bootloader ดำเนินไปได้ อย่างไร การขัดจังหวะที่กำหนดค่าหรือ CPU เป็นโหมด 64 บิตในตอนแรก
- ทำสิ่งต่างๆสองครั้ง ก่อนอื่นฉันจะไปเปล่าสิ่งนี้จะช่วยให้เข้าใจสิ่งที่เกิดขึ้นและจากนั้นเราใช้เครื่องมือเพื่อหลีกเลี่ยงการทำงานภาคพื้นดินนั้นทุกครั้ง
- ขั้นตอนกลางและ "จุดตรวจ"
- ให้โครงร่างก่อน -> เพื่อดูภาพที่ใหญ่ขึ้น
- ให้ตัวอย่างเป็นรหัสจริง -> เช่นว่าเคอร์เนลถังแรกนั้นเป็นจริงวิธีการสร้าง Linux
- นำเสนอทางเลือก/ตัวเลือกสำหรับ
dependency แต่ละครั้งที่เราเริ่มใช้ สำหรับฉันแล้วมันเป็นคนเกียจคร้านถ้าฉันต้องการติดตามการสอนและห้องสมุดภายนอกจำนวนมากทำเวทมนตร์ที่ฉันต้องการเรียนรู้
ร่าง
โครงร่างคร่าวๆของสิ่งที่ฉันต้องการจะทำ หวังว่าจะมีลำดับเวลามากขึ้นหรือน้อยลง ประเด็นก็คือว่ามีอะไรมากมายที่เราสามารถทำได้จริง ๆ แล้วมันค่อนข้างยากที่จะเลือกเส้นทาง
ก่อนอื่นฉันต้องการทำความเข้าใจกระบวนการบูตให้ดีขึ้น จะเกิดอะไรขึ้น ก่อนที่ bootloader จะกระโดดเข้ามาจริง ๆ แล้วการกลิ้ง bootloader ของคุณเอง (ลิงก์ไปยัง OSDEV) เป็นงานที่ยิ่งใหญ่ด้วยตัวเอง
แผนของฉันคือการสำรวจระยะแรกในกระบวนการบูตเล็กน้อย เป้าหมายของสิ่งนั้นคือการเข้าใจและชื่นชมสิ่งที่ bootloader ทำเพื่อเรา ในตอนท้ายฉันต้องการมีความเข้าใจคร่าวๆเกี่ยวกับโหมดโปรเซสเซอร์ที่แตกต่างกันสิ่งที่พวกเขาเสนอและวิธีการเปลี่ยนไปใช้โหมดป้องกัน 32 บิต เป้าหมายที่เป็นรูปธรรมคือการสามารถเปลี่ยนไปใช้โหมดที่ได้รับการป้องกันและพิมพ์ Hello World! ไปยังหน้าจอ ทุกอย่างที่นำไปใช้ในแอสเซมบลีและไม่ต้องใช้ตัวโหลดบูต
หลังจากนั้นฉันวางแผนที่จะสลับและใช้ Grub เป็น bootloader และดำเนินการต่อจากที่นั่น
tl; dr
- เขียนภาพที่สามารถบูตได้น้อยที่สุด
- Bootloader ที่พิมพ์
Hello World ในโหมดจริง 16 บิต - เปลี่ยนเป็นโหมดป้องกัน 32-bin ด้วยตนเองและพิมพ์
Hello World - เปลี่ยนเป็นโหมดยาว 64-bin ด้วยตนเอง
- ใช้ด้วงเป็น bootloader และพิมพ์
Hello World - เปลี่ยนเป็นโหมดยาว (อีกครั้ง)
- กระโดดเข้าสู่
C พิมพ์ Hello World - กองซ้อน
- ใช้ไดรเวอร์วิดีโอ VGA
- Interrupts (ตอนที่ 1) - บอก CPU ว่าจะหาตัวจัดการได้ที่ไหนใน ASM
- การขัดจังหวะ (ตอนที่ 2) - ย้ายรหัสจาก 10 ไปยัง C
- ใช้ตัวจัดการที่ดีขึ้น
- การดีบัก
- จัดการการขัดจังหวะ/ข้อยกเว้น
- ใช้การเพจหน่วยความจำ
- ทำใหม่เคอร์เนล
ไม่ระบุ:
- refactoring?
- สาธารณูปโภค (memset?)
ในภายหลัง ...
- ระบบไฟล์
- กระบวนการ
- การกำหนดเวลา
- การโทรระบบ
- สำรวจสแต็กกระตุ้นสแต็คล้นและข้อยกเว้น
- เชื่อมต่อกับ GDB ผ่าน UART (สำหรับการดีบักและตัวอย่างฝังตัว)
- ข้ามการแข่งขันบางส่วน (หรือมาก) ไปยังโปรเซสเซอร์แขน (ฉันมีกระดาน STM และ Infineon ที่ไม่ได้ใช้)
prerequesits?
ไม่มี. อย่างจริงจังอย่ากลัว จุดรวมของบทช่วยสอนนี้คือการพัฒนาความรู้ที่จำเป็นทั้งหมดจากพื้นดิน มีเพียงเงื่อนไข เดียว ที่ฉันคิดและนั่นคือคุณสามารถตั้งโปรแกรมได้อย่างเหมาะสม โดยเหมาะสมฉันหมายความว่าอย่างน้อยคุณก็เคยได้ยินเกี่ยวกับสแต็คและกองและสามารถมีประสิทธิผลในบางภาษา ฉันเดาว่าน่าจะเพียงพอ ท้ายที่สุดเราไม่ได้พยายามพัฒนาระบบปฏิบัติการหลักของ GEN ครั้งต่อไปที่นี่เรากำลังซ่อมแซมระดับงานอดิเรก
และสิ่งหนึ่งที่ฉันสามารถรับรองคุณได้: แม้ว่าคุณจะไม่เคยสัมผัสรหัสนี้อีกแล้วและจะไม่เขียนระบบปฏิบัติการ ประสบการณ์ จะ เปลี่ยนความเข้าใจในระบบที่คุณกำลังดำเนินการ อย่างลึกซึ้ง ความรู้ที่ได้รับจากการพัฒนาในระดับเคอร์เนลกระจายเหมือนเมล็ดตลอดอาชีพของคุณและข้อมูลเชิงลึกจะพิสูจน์ได้ว่ามีประโยชน์ในช่วงเวลาที่ไม่คาดคิดที่สุด
Scratchpad (แนวคิดที่ไม่มีการรวบรวมกันจากที่นี่เป็นต้นไป)
ความคิด
- CPU ทำอะไรถ้าคุณใส่คำแนะนำ หลังจาก 512 ไบต์แรก? พวกเขาถูกดำเนินการหรือไม่? (CPU อยู่ในโหมดจริง 16 บิต)
ร่าง
- Bootload -> สองตัวเลือกม้วนตัวเองหรือใช้งานที่มีอยู่เช่นด้วง
- โหมด 16 บิต
- เข้าสู่โหมดป้องกัน 32 บิต
- เข้าสู่โหมดยาว 64 บิต
- ป้อน C
- เขียนโมดูล Memory Managemen
รอบ 0 - สิ่งแวดล้อมและการคอมไพล์ toolchain
- คุณอาจข้ามขั้นตอนบางอย่าง เราไม่จำเป็นต้องใช้เครื่องมือรวบรวมไขว้ก่อนที่เราจะเริ่มเขียนรหัส C
- เริ่มสร้าง toolchain ของคุณที่ไหนสักแห่งภายใต้ $ home
- ตรวจสอบให้แน่ใจว่าขอบเขตของตัวแปรสภาพแวดล้อมถูกต้อง
- ข้อผิดพลาดเช่น "ไม่ได้รับอนุญาตให้สร้างไดเรกทอรี
/usr/lib/i686-elf " ระบุว่า $PREFIX ไม่ถูกตั้งค่าไม่ถูกต้อง - เราไม่ได้รับซีพียู "ของจริง" แต่ยังมี BIOS ต่อหน้าเรา มันเริ่มต้น CPU และส่งมอบ CPU ให้กับเราในโหมดจริง
รอบ 0 - bootloader
ทรัพยากร
- เอกสาร nasm https://www.nasm.us/xdoc/2.14.02/html/nasmdoc3.html
- คู่มือ Intel