ระบบปฏิบัติการ…ทำงาน…โดยไม่ต้องมีระบบปฏิบัติการเพื่อทำงานได้อย่างไร?


167

ตอนนี้ฉันอยากรู้จริงๆ ฉันเป็นโปรแกรมเมอร์ Python และคำถามนี้ทำให้ฉันสับสนมาก: คุณเขียนระบบปฏิบัติการ คุณจะเรียกใช้มันได้อย่างไร มันจะต้องทำงานอย่างใดและวิธีการที่อยู่ในระบบปฏิบัติการอื่นได้หรือไม่

แอปพลิเคชันจะทำงานอย่างไรโดยไม่ต้องอยู่ในระบบปฏิบัติการ คุณจะบอกให้คอมพิวเตอร์รัน, พูด, C และดำเนินการคำสั่งเหล่านี้ไปยังหน้าจอได้อย่างไรถ้ามันไม่มี OS ให้ทำงาน?

มันต้องทำอย่างไรกับเคอร์เนล UNIX? ถ้าใช่เคอร์เนล Unix หรือเคอร์เนลโดยทั่วไปคืออะไร?

ฉันแน่ใจว่าระบบปฏิบัติการนั้นซับซ้อนกว่านั้น แต่มันทำงานอย่างไร


14
ฉันค่อนข้างแน่ใจว่าเป็นสิ่งที่ BIOS ใช้สำหรับ - มันเป็นระบบปฏิบัติการขนาดเล็กมาก ๆ ที่บูตการทำงานของระบบปฏิบัติการขนาดใหญ่
sevenseacat

64
ระบบปฏิบัติการนั้นสะดวกแต่คุณไม่จำเป็นต้องใช้เพื่อเรียกใช้โปรแกรมบนคอมพิวเตอร์
Andres F.

10
เป็นไปได้อย่างสมบูรณ์ที่จะเขียนซอฟต์แวร์ที่ไม่ใช่ระบบปฏิบัติการโดยไม่มีระบบปฏิบัติการ ล่าม Forth จำนวนมากทำงานตามเนื้อผ้าโดยไม่มีระบบปฏิบัติการ (หรือคุณสามารถพูดได้ว่าพวกเขาเป็นระบบปฏิบัติการ) มันไม่ใช่เรื่องยาก ถ้าคุณรู้จัก C คุณอาจสนุกกับการเขียนโปรแกรม (เกมเล็ก ๆ หรือบางที) เป็นแบบฝึกหัดการเรียนรู้
สูงสุด

44
ความสับสนนี้เป็นหนึ่งในค่าใช้จ่ายของที่ยอดเยี่ยมปลอดภัยระบบคอมพิวเตอร์ใจลอยมากที่เราใช้วันนี้: คนสามารถมากโปรแกรมเมอร์ที่ดีและมีความสามารถและไม่ทราบว่าแม้ปัจจัยพื้นฐานเกี่ยวกับวิธีการทำงานของคอมพิวเตอร์ คุณอยากไปต่ำแค่ไหน? สำหรับต่ำมาก แต่ยังเหนือระดับฟิสิกส์ดูไมโครโปรเซสเซอร์ตัวแรกตั้งโปรแกรมอย่างไร บน Electronics.SE
dmckee

2
การเขียนโปรแกรมเสร็จก่อนการคิดค้นแนวคิดระบบปฏิบัติการปัจจุบัน เห็นได้ชัดว่าบางสิ่งในระดับนั้นคือสิ่งที่เริ่มต้นขึ้นจากระบบปฏิบัติการ ระบบปฏิบัติการจะ bootstrapped เรื่องนี้มักจะกล่าวถึงอย่างน้อยในโปรแกรม CS 4 ปีในบางจุดเนื่องจากส่วนใหญ่ต้องการทฤษฎีคอมพิวเตอร์ของหลักสูตรระบบปฏิบัติการ
Rig

คำตอบ:


263

มีเว็บไซต์มากมายที่ต้องผ่านกระบวนการบู๊ต (เช่นHow Computers Boot Up ) โดยสรุปแล้วมันเป็นกระบวนการหลายขั้นตอนที่สร้างระบบขึ้นเล็กน้อยในแต่ละครั้งจนกว่ามันจะสามารถเริ่มกระบวนการ OS ได้ในที่สุด

มันเริ่มต้นด้วยเฟิร์มแวร์บนแผงวงจรหลักซึ่งพยายามที่จะทำให้ซีพียูทำงานได้ จากนั้นโหลดไบออสซึ่งเป็นระบบปฏิบัติการขนาดเล็กที่ทำให้ฮาร์ดแวร์อื่น ๆ ทำงานและทำงานอยู่ เมื่อดำเนินการเสร็จแล้วจะค้นหาอุปกรณ์สำหรับเริ่มระบบ (ดิสก์ซีดี ฯลฯ ) และเมื่อพบแล้วจะหาตำแหน่ง MBR (มาสเตอร์บูตเรกคอร์ด) และโหลดลงในหน่วยความจำและดำเนินการ นี่เป็นโค้ดชิ้นเล็ก ๆ ที่จะรู้วิธีเริ่มต้นและเริ่มระบบปฏิบัติการ (หรือบูตโหลดเดอร์อื่น ๆ เนื่องจากสิ่งต่าง ๆ มีความซับซ้อนมากขึ้น) เมื่อมาถึงจุดนี้สิ่งต่าง ๆ เช่นเคอร์เนลจะถูกโหลดและเริ่มทำงาน

มันค่อนข้างเหลือเชื่อว่ามันใช้งานได้!


108
+1 สำหรับประโยคสุดท้าย
CVN

39
มีเหตุผลที่เรียกว่า "บูท"; คำศัพท์สั้นสำหรับ "bootstrapping" ดังเช่น "ดึงตัวคุณเองด้วย bootstraps"
KeithS

5
มีบางครั้งที่บางคนต้องคีย์หรือสลับในรหัส bootstrap บางครั้งมันเป็นการข้ามไปที่คำสั่งแรกของโปรแกรมใน ROM อย่างง่าย บางครั้งมันเป็นรหัสให้อ่านจากอุปกรณ์และข้ามไปยังคำสั่งโปรแกรมแรกในข้อมูลที่อ่าน ตอนนี้สิ่งต่างๆนั้นง่ายกว่ามาก
BillThor

ดูเพิ่มเติมที่ibm.com/developerworks/linux/library/l-grub2/ …
Tobias Kienzler

15
@BillThor: โดยที่ "ง่ายกว่ามาก" แน่นอนว่าคุณหมายถึง "ซับซ้อนมากขึ้น" พวกเขากำลังเพียงง่ายในการใช้
Raphael Schweikert

173

ระบบปฏิบัติการ "โลหะเปลือย" ไม่ทำงานภายในสิ่งใด มันรันชุดคำสั่งเต็มรูปแบบบนเครื่องทางกายภาพและมีการเข้าถึงหน่วยความจำกายภาพทั้งหมดการลงทะเบียนอุปกรณ์ทั้งหมดและคำแนะนำพิเศษทั้งหมดรวมถึงที่ควบคุมฮาร์ดแวร์สนับสนุนหน่วยความจำเสมือน

(หากระบบปฏิบัติการกำลังทำงานอยู่บนเครื่องเสมือนอาจคิดว่ามันอยู่ในสถานการณ์เดียวกันกับข้างต้นความแตกต่างคือบางสิ่งมีการจำลองหรือในทางอื่นที่ hypervisor จัดการเช่นระดับที่ใช้งานเครื่องเสมือน .)

อย่างไรก็ตามในขณะที่ระบบปฏิบัติการอาจถูกนำไปใช้ใน (ตัวอย่าง) C แต่จะไม่มีไลบรารี C ปกติทั้งหมดให้ใช้งาน โดยเฉพาะอย่างยิ่งมันไม่มีไลบรารี 'stdio' ปกติ แต่จะใช้งาน (ตัวอย่าง) ไดรเวอร์อุปกรณ์ดิสก์ที่อนุญาตให้อ่านและเขียนบล็อกดิสก์ มันจะใช้ระบบไฟล์ที่อยู่ด้านบนของชั้นดิสก์บล็อกและที่ด้านบนของมันจะใช้ระบบการเรียกว่าห้องสมุดรันไทม์ของผู้ใช้แอปพลิเคชันของการสร้าง (อ่าน) เช่นสร้างอ่านและเขียนไฟล์ ... และอื่น ๆ

แอปพลิเคชันจะทำงานอย่างไรโดยไม่ต้องอยู่ในระบบปฏิบัติการ

ต้องเป็นแอปพลิเคชันพิเศษ (เช่นระบบปฏิบัติการ) ที่รู้วิธีโต้ตอบโดยตรงกับฮาร์ดแวร์ I / O เป็นต้น

คุณจะบอกให้คอมพิวเตอร์รัน, พูด, C และดำเนินการคำสั่งเหล่านี้ไปยังหน้าจอได้อย่างไรถ้ามันไม่มี OS ให้ทำงาน?

คุณทำไม่ได้

แอปพลิเคชัน (ซึ่งมีวัตถุประสงค์เพื่อการโต้แย้งที่เขียนใน C) จะรวบรวมและเชื่อมโยงกับเครื่องอื่นเพื่อให้ภาพรหัสเนทีฟ จากนั้นภาพจะถูกเขียนไปยังฮาร์ดไดรฟ์ในตำแหน่งที่ BIOS สามารถค้นหาได้ BIOS โหลดภาพลงในหน่วยความจำและดำเนินการคำสั่งเพื่อข้ามไปยังจุดเข้าใช้งานของแอปพลิเคชัน

ที่นั่น (โดยทั่วไป) ไม่มี "การรัน C และการดำเนินการคำสั่ง" ในแอปพลิเคชันยกเว้นว่าเป็นระบบปฏิบัติการแบบเต็มเป่า และในกรณีนั้นมันเป็นความรับผิดชอบของระบบปฏิบัติการที่จะใช้โครงสร้างพื้นฐานที่จำเป็นทั้งหมดเพื่อให้มันเกิดขึ้น ไม่มีเวทมนต์ โค้ดจำนวนมาก

คำตอบของ Billครอบคลุมbootstrappingซึ่งเป็นกระบวนการที่คุณใช้ตั้งแต่เครื่องที่ปิดเครื่องไปจนถึงเครื่องที่ระบบปฏิบัติการปกติเปิดใช้งาน อย่างไรก็ตามมันเป็นสิ่งที่น่าสังเกตว่าเมื่อ BIOS ทำงานเสร็จแล้วมัน (โดยทั่วไป) จะให้การควบคุมฮาร์ดแวร์กับระบบปฏิบัติการหลักอย่างสมบูรณ์และจะไม่มีส่วนใดเพิ่มเติมจนกว่าจะรีสตาร์ทระบบครั้งถัดไป ระบบปฏิบัติการหลักไม่ได้ใช้งาน "ภายใน" BIOS ในความหมายทั่วไป

มันต้องทำอย่างไรกับเคอร์เนล UNIX? ถ้าเป็นเช่นนั้นยูนิกซ์เคอร์เนลหรือเคอร์เนลโดยทั่วไปคืออะไร?

ใช่แล้ว.

เคอร์เนล UNIX เป็นแกนหลักของระบบปฏิบัติการ UNIX มันเป็นส่วนหนึ่งของ UNIX ที่ทำสิ่งที่ "โลหะเปลือย" ทั้งหมดที่อธิบายไว้ข้างต้น

แนวคิดของ "เคอร์เนล" คือคุณพยายามที่จะแยกซอฟต์แวร์ระบบเป็นเนื้อหาหลัก (ที่ต้องมีการเข้าถึงอุปกรณ์ทางกายภาพ, หน่วยความจำทั้งหมด, ฯลฯ ) และสิ่งที่ไม่ใช่คอร์ เคอร์เนลประกอบด้วยเนื้อหาหลัก

ในความเป็นจริงความแตกต่างระหว่าง kernel / core และ non-kernel / non-core นั้นซับซ้อนกว่านั้น และมีการถกเถียงกันมากมายเกี่ยวกับสิ่งที่เป็นของเคอร์เนลและอะไรที่ไม่ (ค้นหาไมโครเคอร์เนลเป็นตัวอย่าง)


6
คำตอบของปรากฏการณ์ ฉันจะให้ upvotes มากกว่านี้ถ้าเป็นไปได้
weberc2

7
คำตอบที่ดีมากมายที่นี่ดังนั้นฉันจะเพิ่มนี่เป็นความคิดเห็นเนื่องจากยังไม่มีใครพูดถึงเรื่องนี้: หนึ่งในคุณสมบัติที่สำคัญในระบบปฏิบัติการคือการอนุญาตให้แอปพลิเคชั่นหลายตัวดำเนินการ "พร้อมกัน" จากมุมมองของผู้ใช้ ความสามารถในการกำหนดเวลากระบวนการและป้องกันกระบวนการจากการเปลี่ยนแปลงพฤติกรรมของอีกคนหนึ่งเป็นคุณสมบัติที่พบได้เฉพาะในระบบปฏิบัติการเท่านั้นไม่ใช่จากเฟิร์มแวร์หรือ BIOS
Sean Barbeau

2
The idea of a "kernel" is that you try to separate the system software into core stuffง่ายต่อการจดจำโดยสังเกตว่าคำkernelนี้มาจากภาษาเยอรมันKernซึ่งหมายถึงแกนกลาง / นิวเคลียส
deed02392

1
รักคำตอบนี้ที่นี่เพราะมันบอกว่ามันรวบรวมและเชื่อมโยงรหัสไบนารี่ที่ทำงานอยู่ไม่ C.
Travis Pessetto

3
"การหลีกเลี่ยงสิ่งนั้นทำให้ผู้ใช้พีซีฉลาดน้อยลง" - ไม่ฉลาดน้อย ... รู้คอมพิวเตอร์น้อยลง คุณสามารถพูดได้ว่ามันเพิ่มจำนวนผู้ใช้พีซี
สตีเฟนซี

62

ในการเริ่มต้นไม่มีพลังในซีพียู

และชายคนนั้นพูดว่า "ปล่อยให้มีพลัง" และซีพียูก็เริ่มอ่านจากที่อยู่ที่กำหนดไว้ในหน่วยความจำและดำเนินการตามคำแนะนำที่มีอยู่ จากนั้นจะมีคนต่อไปเรื่อย ๆ จนกว่าจะหมดอำนาจ

นี่คือการบูตขึ้น หน้าที่ของมันคือการโหลดซอฟต์แวร์อีกชิ้นเพื่อเข้าถึงสภาพแวดล้อมที่ซอฟต์แวร์หลักอยู่และโหลด

ในที่สุดหน้าจอที่เป็นมิตรเชิญคุณเข้าสู่ระบบ


58
คำตอบนี้ควรถูกย้ายไปที่ christianity.stackexchange.com
Coomie

6
"ที่อยู่ที่กำหนด" คืออะไรมาจากไหน ขออภัยที่เล่น Charles Darwin ที่นี่
Midhat

7
@Midhat - ที่อยู่แรกที่ถูกเรียกโดย CPU นั้นจะเดินสายอยู่ข้างใน โดยปกติแล้วจะเป็น 0.
mouviciel

17
... และในวันที่ 7 ชายคนนั้นพักเกมของเขา
Canadian Luke

9
@mouviciel ที่อยู่ในหน่วยความจำ0x7C00สำหรับx86สถาปัตยกรรมที่เข้ากันได้และก่อนอื่นจะต้องเต็มไปด้วยไบออสซึ่งมักจะโหลดภาคแรกของอุปกรณ์ที่สามารถบู๊ตได้สิ่งที่มันต้องการ ... คำตอบที่ดีแม้ว่า: -7
Tobias Kienzler

29

ขออภัยที่จะมาช้า แต่ฉันจะอธิบายเป็นดังนี้:

  • เมนบอร์ดได้รับพลังงาน

  • วงจรกำหนดเวลาเริ่มต้นและมีเสถียรภาพหากจำเป็นขึ้นอยู่กับลักษณะทางไฟฟ้าของพวกเขาเท่านั้น อุปกรณ์ใหม่บางรุ่นอาจใช้ไมโครโปรเซสเซอร์หรือซีเควนเซอร์ที่ จำกัด

    ควรสังเกตสิ่งต่าง ๆ เช่น "วงจรเวลาเริ่มต้นและมีเสถียรภาพหากจำเป็น" ไม่เกิดขึ้นจริงในฮาร์ดแวร์อีกต่อไป จำนวนมหาศาลของงานนั้นเป็นซอฟต์แวร์พิเศษที่ทำงานอยู่ในหน่วยประมวลผลย่อย / ซีเควน จำกัด

    - jkerianเวลา5:20 วันที่ 25 ตุลาคม

  • กำลังไฟถูกกำหนดให้กับ CPU และ RAM

  • CPU โหลดข้อมูล (ขึ้นอยู่กับการเดินสายภายใน) จาก BIOS ในบางเครื่องไบออสอาจถูกทำมิเรอร์เป็น RAM และดำเนินการจากที่นั่น แต่นั่นเป็น IIRC ที่หายาก

    เมื่อเปิดใช้งานซีพียูที่เข้ากันได้กับ x86 จะเริ่มต้นที่แอดเดรส 0xFFFFFFF0 ในพื้นที่ที่อยู่ ...

    -Micheal Steil, 17 ข้อผิดพลาดที่เกิดขึ้นกับ Microsoft ในระบบรักษาความปลอดภัยของ Xbox ( ไฟล์เก็บถาวร )

  • BIOS ทำการเรียกไปยังพอร์ตฮาร์ดแวร์และที่อยู่ที่ใช้โดยเมนบอร์ดสำหรับดิสก์และฮาร์ดแวร์อื่น ๆ ของ IO และหมุนดิสก์ขึ้นทำให้ RAM ทำงานได้ตลอดเวลาและอื่น ๆ

  • รหัส BIOS (โดยวิธีการตั้งค่า CMOS ที่เก็บไว้ในฮาร์ดแวร์) ใช้คำสั่ง IDE หรือ SATA ระดับต่ำเพื่ออ่านบูตเซกเตอร์ของแต่ละดิสก์ตามลำดับที่ระบุโดย CMOS หรือผู้ใช้แทนที่ด้วยเมนู

  • ดิสก์แรกที่มีบูตเซกเตอร์จะเรียกใช้บูตเซกเตอร์ บูตเซกเตอร์นี้เป็นแอสเซมบลีที่มีคำแนะนำในการโหลดข้อมูลเพิ่มเติมจากดิสก์โหลดขนาดใหญ่NTLDRระยะที่ใหม่กว่าGRUBเป็นต้น

  • ในที่สุดรหัสเครื่อง OS จะถูกเรียกใช้งานโดย bootloader ไม่ว่าโดยตรงหรือโดยอ้อมผ่านการบีบอัดการโหลดเซกเตอร์สำหรับบูตจากตำแหน่งอื่นหรือออฟเซ็ต

จากนั้นคุณจะได้รับความตื่นตระหนกของเคอร์เนลที่เป็นมิตรนกเพนกวินที่หายใจไม่ออกหรือดิสก์ของคุณหยุดทำงานเนื่องจากมีปัญหาจากการชนศีรษะ =) ในสถานการณ์อื่นเคอร์เนลของคุณตั้งค่าตารางกระบวนการโครงสร้างในหน่วยความจำและเมาท์ดิสก์โหลดไดรเวอร์โมดูลและ GUI หรือชุดบริการ (ถ้าบนเซิร์ฟเวอร์) จากนั้นโปรแกรมจะถูกดำเนินการตามส่วนหัวของพวกเขาจะถูกอ่านและการชุมนุมของพวกเขาจะถูกนำเข้าสู่หน่วยความจำและแมปตาม


2
ควรสังเกตสิ่งต่าง ๆ มากมายเช่น "วงจรเวลาเริ่มต้นและมีเสถียรภาพหากจำเป็น" จะไม่เกิดขึ้นจริงในฮาร์ดแวร์อีกต่อไป จำนวนมหาศาลของงานนั้นเป็นซอฟต์แวร์พิเศษที่ทำงานอยู่ในหน่วยประมวลผลย่อย / ซีเควน จำกัด - วิศวกรเฟิร์มแวพื้นที่ใกล้เคียงที่เป็นมิตร
jkerian

@ jkerian คุณคิดว่าฉันได้แสดงความคิดเห็นของคุณในโพสต์ของฉันหรือไม่?
ζ--

เฮ้ไม่เลย
jkerian

BIOS ไม่ใช่ระบบปฏิบัติการ BIOS เป็นแบบย่อสำหรับระบบอินพุต / เอาท์พุตพื้นฐานและนั่นคือสิ่งที่ BIOS ทำ อนุญาตให้โปรแกรมเมอร์ใช้ทรัพยากรระดับต่ำพร้อมไดรเวอร์ที่ผู้ผลิตจัดให้ เมื่อระบบปฏิบัติการเข้าสู่โหมด Protected (32 บิต) หรือ Long (64 บิต) BIOS จะไม่สามารถใช้งานได้อีกต่อไปและ OS จะใช้ไดรเวอร์ของตัวเองซึ่งโดยทั่วไปจะแทนที่การทำงานที่ BIOS จัดไว้ในระดับ "ต่ำ" ระบบปฏิบัติการที่ทันสมัยเช่น Linux และ Windows ใช้ BIOS สำหรับการตรวจจับส่วน RAM ที่ใช้งานได้และโหลดตัวโหลดขั้นสูงของตัวเองที่สามารถโหลดไดรเวอร์ที่ต้องการ
Hannes Karppila

1
@HannesKarppila อัพเดต; แม้ว่านี่จะอายุประมาณสี่ปีแล้วและฉันก็ไม่ได้ใช้งานเว็บไซต์นี้อีกต่อไป
ζ--

15

มีคำตอบที่ดีมากมาย แต่ฉันต้องการเพิ่มสิ่งนี้: คุณพูดถึงคุณมาจากพื้นหลัง Python Python เป็น ninterpreted (หรือ "interpiled" หรืออะไรก็ตามอย่างน้อยในกรณีการใช้งาน CPython ทั่วไป) ซึ่งหมายความว่าคุณมีซอฟต์แวร์อื่น ๆ (ล่าม Python) ดูแหล่งที่มาและดำเนินการอย่างใดอย่างหนึ่ง นี่เป็นรูปแบบที่ดีและช่วยให้ภาษาระดับสูงค่อนข้างดีซึ่งแยกออกจากฮาร์ดแวร์จริง ข้อเสียคือคุณต้องใช้ซอฟต์แวร์ล่ามนี้ก่อนเสมอ

โดยทั่วไปซอฟต์แวร์ล่ามดังกล่าวจะเขียนด้วยภาษาที่คอมไพล์ไปยังรหัสเครื่องเช่น C หรือ C ++ รหัสเครื่องเป็นสิ่งที่ CPU สามารถจัดการได้ สิ่งที่ CPU สามารถทำได้คืออ่านบางไบต์จากหน่วยความจำและขึ้นอยู่กับค่าไบต์เริ่มการดำเนินการเฉพาะ ดังนั้นหนึ่งไบต์ลำดับคือคำสั่งเพื่อโหลดข้อมูลบางอย่างจากหน่วยความจำลงในทะเบียนอีกลำดับเพื่อเพิ่มสองค่าอีกเพื่อเก็บค่าจากลงทะเบียนกลับไปยังหน่วยความจำหลักและในไม่ช้า (ลงทะเบียนเป็นพื้นที่หน่วยความจำพิเศษซึ่งเป็นส่วนหนึ่ง ของซีพียูที่สามารถทำงานได้ดีที่สุด) คำสั่งเหล่านี้ส่วนใหญ่ค่อนข้างต่ำในระดับนั้น มนุษย์สามารถอ่านได้สำหรับคำแนะนำของรหัสเครื่องเหล่านี้คือรหัสแอสเซมเบลอร์ รหัสเครื่องนี้โดยทั่วไปคือสิ่งที่ถูกจัดเก็บในไฟล์. exe or.com บน windows หรือภายในไบนารี / Linux / Unix

ตอนนี้หากคอมพิวเตอร์เริ่มต้นทำงานมันจะเป็นใบ้ แต่ก็มีสายไฟบางส่วนซึ่งจะอ่านคำแนะนำของรหัสเครื่องดังกล่าว บนพีซีนี้โดยปกติ (ปัจจุบัน) เป็นชิป EEPROM บนเมนบอร์ดที่มี BIOS (ระบบอินพุตพื้นฐาน ouptput) ระบบนี้ไม่สามารถทำอะไรได้มากมันสามารถเข้าถึงฮาร์ดแวร์บางอย่างได้ง่ายและจากนั้นทำการดำเนินการที่สำคัญ: ไปที่ บูตและคัดลอกไม่กี่ไบต์แรก (หรือที่รู้จักว่ามาสเตอร์บูตเรคคอร์ด, MBR) ลงในหน่วยความจำแล้วบอกซีพียู "ที่นี่มีโปรแกรมของคุณ" CPU จะจัดการไบต์เหล่านั้นที่นั่นเป็นรหัสเครื่องและดำเนินการ โดยทั่วไปแล้วนี่คือตัวโหลดระบบปฏิบัติการบางตัวซึ่งจะโหลดเคอร์เนลพร้อมพารามิเตอร์บางตัวและมอบการควบคุมให้กับเคอร์เนลนั้นซึ่งจะโหลดไดรเวอร์ทั้งหมดเพื่อเข้าถึงฮาร์ดแวร์ทั้งหมดโหลดเดสก์ท็อปหรือโปรแกรมเชลล์หรืออะไรก็ตามและอนุญาตให้ผู้ใช้เข้าสู่ระบบและ ใช้ระบบ


6
"interpiled"? ฉันไม่เคยได้ยินคำนั้นมาก่อน
ไบรอัน Oakley

3
คำดังกล่าวนั้นใช้มาตั้งแต่ 5 ปีก่อนเพื่ออธิบายล่าม "สมัยใหม่" ที่มีขั้นตอนการรวบรวมที่แตกต่างซึ่งแยกจากการดำเนินการ ไม่มีความคิดถ้าคำนี้รอดชีวิตมาได้ทุกที่ ;-)
โยฮันเนส

1
"ninterpreted"? ฉันไม่เคยได้ยินคำนั้นมาก่อน
โคลจอห์นสัน

12

คุณถามว่า "แอปพลิเคชันจะทำงานอย่างไรโดยไม่ต้องอยู่ในระบบปฏิบัติการ" คำตอบง่ายๆคือ "ระบบปฏิบัติการไม่ใช่แอปพลิเคชัน" ในขณะที่ระบบปฏิบัติการสามารถสร้างขึ้นได้ด้วยเครื่องมือเดียวกับแอปพลิเคชันและทำจากวัตถุดิบเดียวกัน แต่ก็ไม่เหมือนกัน ระบบปฏิบัติการไม่จำเป็นต้องเล่นตามกฎเดียวกันกับแอปพลิเคชัน

OTOH คุณสามารถนึกถึงฮาร์ดแวร์และเฟิร์มแวร์จริง ๆ ว่า "ระบบปฏิบัติการ" ซึ่งระบบปฏิบัติการ "แอปพลิเคชัน" ทำงานอยู่ ฮาร์ดแวร์เป็นระบบปฏิบัติการที่ง่ายมาก - มันรู้วิธีเรียกใช้คำสั่งที่เขียนในรหัสเครื่องและรู้ว่าเมื่อมันเริ่มต้นขึ้นควรดูที่อยู่หน่วยความจำเฉพาะสำหรับคำสั่งแรก ดังนั้นมันจะเริ่มต้นขึ้นและจากนั้นจะเรียกใช้คำสั่งแรกนั้นทันทีตามด้วยข้อที่สองเป็นต้น

ดังนั้นระบบปฏิบัติการเป็นเพียงรหัสเครื่องที่มีอยู่ในตำแหน่งที่รู้จักและสามารถโต้ตอบกับฮาร์ดแวร์ได้โดยตรง


1
+1 ฉันคิดว่านี่เป็นคำตอบที่ดีที่สุด ในแง่ของ abstractions ฉันคิดว่าคุณกำลังเก่งในระดับที่เหมาะสม
Preet Sangha

6

คำตอบสำหรับคำถามของคุณต้องการความรู้ว่าโค้ดเนทีฟ (สำหรับ CPU) มีลักษณะอย่างไรและ CPU จะตีความอย่างไร

โดยทั่วไปกระบวนการรวบรวมทั้งหมดจะขึ้นอยู่กับการแปลสิ่งที่คุณเขียนใน C, Pascal หรือ Python (ใช้ pypy) และ C # เป็นสิ่งที่ CPU เข้าใจเช่นคำแนะนำง่ายๆเช่น "เก็บบางสิ่งภายใต้ [memory address]", "เพิ่มตัวเลขที่เก็บไว้ในทะเบียน eax และ ebx "," ฟังก์ชั่นการโทร foo "," เปรียบเทียบ eax กับ 10 " คำแนะนำเหล่านั้นดำเนินการทีละอย่างทำสิ่งที่คุณต้องการจะทำกับรหัสของคุณ

ตอนนี้คิดเกี่ยวกับสิ่งนี้: คุณไม่จำเป็นต้องใช้ระบบปฏิบัติการเพื่อเรียกใช้โค้ดเนทีฟนี้! สิ่งที่คุณต้องมีก็คือการโหลดรหัสนี้ลงในหน่วยความจำและบอกซีพียูที่อยู่ในนั้นและคุณต้องการให้มันทำงาน อย่ากังวลมากไปกว่านั้น นั่นคือ BIOS งานที่ควรกังวล - โหลดรหัสของคุณ (หนึ่งและหนึ่งส่วนเท่านั้น) หลังจาก CPU เริ่มทำงานภายใต้ที่อยู่จริง 0x7C00 จากนั้นซีพียูจะเริ่มประมวลผลรหัสของคุณหนึ่งเซกเตอร์ (512 B) และคุณสามารถทำสิ่งที่คุณจินตนาการ! โดยไม่ต้องแน่นอนการสนับสนุนใด ๆ จากระบบปฏิบัติการ นั่นเป็นเพราะคุณเป็นระบบปฏิบัติการ เจ๋งใช่มั้ย ไม่มีไลบรารี่มาตรฐาน, ไม่มีบูสต์, ไม่มีไพ ธ อน, ไม่มีโปรแกรม, ไม่มีไดรเวอร์! คุณต้องเขียนทุกอย่างด้วยตัวเอง

และคุณสื่อสารกับฮาร์ดแวร์อย่างไร คุณมีสองทางเลือก:

  1. คุณอยู่ใน "โหมดจริง" - โหมดการทำงานของ CPU ที่มีหน่วยความจำเพียง 1 MB (และน้อยกว่า) ไม่มีคุณลักษณะของ CPU ขั้นสูงเช่นส่วนขยายของ CPU การป้องกันหน่วยความจำมัลติทาสก์; รหัสที่สามารถเรียกใช้งานได้ 16 บิตโหมดการกำหนดตำแหน่งที่อยู่ ... แต่ด้วยการทำงานบางอย่างที่ได้รับจาก BIOS รวมถึงการแสดงผลหน้าจอที่เรียบง่ายการรองรับคีย์บอร์ด ในหนึ่งคำคุณจะย้อนกลับไปในช่วงเวลาของ MS-DOS และซีพียู 16 บิต
  2. คุณอยู่ภายใต้ "โหมดที่ได้รับการป้องกัน" พร้อมคุณสมบัติทั้งหมดที่ CPU ของคุณมีหน่วยความจำทั้งหมดที่คุณติดตั้งและอื่น ๆ แต่ในโหมดป้องกันคุณอยู่คนเดียวอย่างสมบูรณ์และคุณต้องทำทุกอย่างด้วยตัวเอง (และคุณสื่อสารกับฮาร์ดแวร์โดยใช้คำสั่ง "ใน" และ "ออก" เพื่อป้อนข้อมูล / ส่งออกข้อมูลไปยังพอร์ต I / O และการขัดจังหวะและหน่วยความจำ / O) ฉันต้องบอกว่าทุกระบบปฏิบัติการตั้งแต่ Windows 95 และ Linux ตัวแรกเลือกตัวเลือกนี้หรือไม่?

ตอนนี้คุณกำลังถามว่าเคอร์เนลคืออะไร ในไม่ช้าเคอร์เนลคือทุกสิ่งที่คุณไม่เห็นและสัมผัสโดยตรง มันจัดการรวมถึงไดรเวอร์ทุกอย่างเริ่มจากคีย์บอร์ดไปจนถึงฮาร์ดแวร์เกือบทุกชิ้นในพีซีของคุณ คุณสื่อสารกับมันด้วยกราฟิกเชลล์หรือเทอร์มินัล หรือตามฟังก์ชั่นภายในโค้ดของคุณตอนนี้ถูกดำเนินการโชคดีด้วยการรองรับระบบปฏิบัติการ

เพื่อความเข้าใจที่ดีขึ้นฉันสามารถให้คำแนะนำแก่คุณ: พยายามเขียนระบบปฏิบัติการของคุณเอง แม้ว่ามันจะเขียน "Hello world" บนหน้าจอ


3

มีความแตกต่างบางประการสำหรับวิธีการที่ระบบปฏิบัติการทำงานซึ่งขึ้นอยู่กับระบบเป็นอย่างมาก เพื่อให้มีประโยชน์ระบบจะต้องมีพฤติกรรมที่สามารถคาดเดาได้เมื่อเริ่มต้นเช่น "เริ่มการทำงานที่ที่อยู่ X" สำหรับระบบที่มีที่จัดเก็บข้อมูลแบบไม่ลบเลือน (เช่นหน่วยความจำแฟลช) ถูกแมปลงในพื้นที่ของโปรแกรมสิ่งนี้ค่อนข้างง่ายเนื่องจากคุณเพียงตรวจสอบให้แน่ใจว่าคุณใส่รหัสเริ่มต้นในตำแหน่งที่ถูกต้องภายในพื้นที่โปรแกรมของโปรเซสเซอร์ นี่เป็นเรื่องธรรมดามากสำหรับไมโครคอนโทรลเลอร์ บางระบบจำเป็นต้องเรียกคืนโปรแกรมเริ่มต้นจากที่อื่นก่อนที่จะดำเนินการ ระบบเหล่านี้จะมีการดำเนินการบางส่วนเดินสาย (หรือเกือบเดินสาย) ในพวกเขา มีโปรเซสเซอร์บางตัวที่รับรหัสเริ่มต้นผ่าน i2c จากชิปอื่น

ระบบที่ใช้โปรเซสเซอร์ตระกูล x86 มักใช้กระบวนการบูตแบบหลายขั้นตอนที่ค่อนข้างซับซ้อนเนื่องจากวิวัฒนาการและปัญหาความเข้ากันได้ย้อนหลัง ระบบเรียกใช้งานเฟิร์มแวร์บางตัว (เรียกว่า BIOS - ระบบอินพุต / เอาท์พุตพื้นฐานหรือคล้ายกัน) ที่อยู่ในหน่วยความจำที่ไม่ลบเลือนบนเมนบอร์ด บางครั้งเฟิร์มแวร์นี้บางส่วนหรือทั้งหมดจะถูกคัดลอก (ย้ายที่) ลงใน RAM เพื่อให้ทำงานได้เร็วขึ้น รหัสนี้เขียนด้วยความรู้เกี่ยวกับฮาร์ดแวร์ที่จะนำเสนอและใช้งานได้สำหรับการบูท

มักจะเขียนเฟิร์มแวร์เริ่มต้นพร้อมข้อสมมติฐานเกี่ยวกับฮาร์ดแวร์ที่จะแสดงในระบบ ปีที่แล้วในเครื่อง 286 อาจมีข้อสันนิษฐานว่าจะมีตัวควบคุมฟลอปปี้ไดรฟ์ที่ที่อยู่ I / O X และจะโหลดเซกเตอร์ 0 ไปยังตำแหน่งหน่วยความจำที่แน่นอนหากได้รับคำสั่งชุดหนึ่ง (และรหัสที่เซกเตอร์ 0 รู้วิธีใช้ฟังก์ชั่นของไบออสเพื่อโหลดรหัสเพิ่มเติมและในที่สุดก็มีรหัสเพียงพอที่จะโหลดระบบปฏิบัติการ) บนไมโครคอนโทรลเลอร์อาจมีข้อสันนิษฐานว่ามีการทำงานของพอร์ตอนุกรมพร้อมการตั้งค่าบางอย่างที่ควรรอคำสั่ง (เพื่ออัปเดตเฟิร์มแวร์ที่ซับซ้อนมากขึ้น) จากจำนวน X เป็นระยะเวลาก่อนดำเนินการกระบวนการบูตต่อไป

กระบวนการเริ่มต้นที่แน่นอนของระบบที่กำหนดนั้นไม่สำคัญสำหรับคุณเท่าที่ทราบว่ามันแตกต่างกันไปตามระบบที่แตกต่างกัน บ่อยครั้งที่อยู่ในรหัสเริ่มต้น (bootstrapping) เมื่อต้องใช้ I / O อุปกรณ์ I / O จะทำการสำรวจมากกว่าที่จะขึ้นอยู่กับการขัดจังหวะ เนื่องจากอินเทอร์รัปต์มีความซับซ้อนให้ใช้สแต็กแรม (ซึ่งอาจยังไม่ได้ตั้งค่าอย่างสมบูรณ์) และคุณไม่จำเป็นต้องกังวลเกี่ยวกับการบล็อกการทำงานอื่น ๆ เมื่อคุณเป็นเพียงการดำเนินการ

เมื่อถูกโหลดครั้งแรกเคอร์เนลระบบปฏิบัติการ (เคอร์เนลเป็นส่วนหลักของระบบปฏิบัติการส่วนใหญ่) ในขั้นต้นจะทำหน้าที่เหมือนเฟิร์มแวร์ มันจะต้องถูกตั้งโปรแกรมด้วยความรู้หรือค้นพบฮาร์ดแวร์ในปัจจุบันตั้งค่า RAM บางส่วนเป็นพื้นที่ว่างทำการทดสอบต่าง ๆ ตั้งค่าโครงสร้างข้อมูลต่าง ๆ ค้นหาและติดตั้งระบบไฟล์แล้วอาจเริ่มโปรแกรมบางอย่างที่มากกว่า เช่นโปรแกรมที่คุณคุ้นเคยกับการเขียน (โปรแกรมที่ใช้ระบบปฏิบัติการที่มีอยู่)

รหัส OS มักจะเขียนในส่วนผสมของ C และการชุมนุม รหัสแรกสุดสำหรับเคอร์เนลระบบปฏิบัติการนั้นมักจะอยู่ในชุดประกอบเสมอและทำสิ่งต่าง ๆ เช่นตั้งค่าสแต็กซึ่งรหัส C นั้นอาศัยและจากนั้นเรียกใช้ฟังก์ชัน C ชุดประกอบที่เขียนด้วยมืออื่น ๆ จะอยู่ในนั้นด้วยเช่นกันเนื่องจากการดำเนินการบางอย่างที่ระบบปฏิบัติการจำเป็นต้องทำมักไม่แสดงใน C (เช่นการสลับบริบท / การสลับสแต็ก) บ่อยครั้งที่มีการตั้งค่าสถานะพิเศษให้กับคอมไพเลอร์ C เพื่อบอกว่าไม่ต้องพึ่งพาไลบรารีมาตรฐานที่โปรแกรม C ส่วนใหญ่ใช้และไม่คาดหวังว่าจะมีint main(int argc, char *argv[])ในโปรแกรม ตัวเลือก linker พิเศษนอกจากนี้ที่โปรแกรมเมอร์ส่วนใหญ่ไม่เคยใช้ต้องใช้ สิ่งเหล่านี้อาจทำให้โปรแกรมเคอร์เนลคาดว่าจะโหลดที่ที่อยู่บางอย่างหรือตั้งค่าให้ดูเหมือนว่ามีตัวแปรภายนอกในบางตำแหน่งแม้ว่าตัวแปรเหล่านั้นไม่เคยประกาศในรหัส C ใด ๆ (ซึ่งมีประโยชน์สำหรับหน่วยความจำ I / O ที่แมปหรือ ตำแหน่งหน่วยความจำพิเศษอื่น ๆ )

การดำเนินการทั้งหมดดูเหมือนจะเป็นเวทย์มนตร์ในตอนแรก แต่หลังจากที่คุณมองเข้าไปในมันและเข้าใจบางส่วนของมันเวทย์มนตร์กลายเป็นเพียงชุดของโปรแกรมที่ต้องใช้การวางแผนและความรู้ของระบบที่จะนำไปปฏิบัติ แม้ว่าการแก้จุดบกพร่องนั้นต้องใช้เวทย์มนตร์


3

เพื่อให้เข้าใจถึงวิธีการทำงานของระบบปฏิบัติการอาจเป็นประโยชน์ในการแบ่งออกเป็นสองประเภท: ประเภทที่ให้บริการกับแอปพลิเคชันตามคำขอและผู้ที่ใช้คุณสมบัติฮาร์ดแวร์ใน CPU เพื่อป้องกันไม่ให้แอปพลิเคชันทำสิ่งที่ไม่ควร MS-DOS เป็นสไตล์ดั้งเดิม Windows ทุกรุ่นตั้งแต่ 3.0 เป็นสไตล์หลัง (อย่างน้อยเมื่อรันอะไรก็ตามที่มีประสิทธิภาพมากกว่า 8086)

พีซี IBM ดั้งเดิมที่รัน PC-DOS หรือ MS-DOS น่าจะเป็นตัวอย่างของรูปแบบเดิมของ "OS" หากแอปพลิเคชันต้องการแสดงอักขระบนหน้าจอจะมีวิธีการสองสามวิธี มันสามารถเรียกรูทีนซึ่งจะขอให้ MS-DOS ส่งไปที่ "เอาต์พุตมาตรฐาน" ถ้าทำอย่างนั้น MS-DOS จะตรวจสอบว่ามีการเปลี่ยนเส้นทางเอาต์พุตหรือไม่และถ้าไม่มันจะเรียกรูทีนที่เก็บไว้ใน ROM (ในชุดของกิจวัตร IBM เรียกว่าระบบอินพุต / เอาท์พุตพื้นฐาน) ซึ่งจะแสดงอักขระที่ ตำแหน่งเคอร์เซอร์และย้ายเคอร์เซอร์ ("เขียน teletype") รูทีนไบออสนั้นจะเก็บไบต์ไว้หนึ่งคู่ในช่วง 0xB800: 0 ถึง 0xB800: 3999; ฮาร์ดแวร์บน Color Graphics Adapter จะดึงข้อมูลไบต์คู่ซ้ำภายในช่วงนั้น ๆ ซ้ำ ๆ ใช้ไบต์แรกของแต่ละคู่เพื่อเลือกรูปร่างตัวอักษรและตัวที่สองเพื่อเลือกสีพื้นหน้าและพื้นหลัง ไบต์จะถูกนำมาใช้และประมวลผลเป็นสัญญาณสีแดงสีเขียวและสีน้ำเงินตามลำดับซึ่งให้การแสดงข้อความที่อ่านได้ง่าย

โปรแกรมบน IBM PC สามารถแสดงข้อความโดยใช้รูทีน DOS "เอาต์พุตมาตรฐาน" หรือโดยใช้รูทีน "write teletype" ของ BIOS หรือโดยการจัดเก็บโดยตรงไปยังหน่วยความจำการแสดงผล โปรแกรมหลายโปรแกรมที่ต้องการแสดงข้อความจำนวนมากเลือกใช้วิธีการหลังอย่างรวดเร็วเนื่องจากอาจเร็วกว่าการใช้งานรูทีนของ DOS อย่างแท้จริงหลายร้อยเท่า สิ่งนี้ไม่ใช่เพราะรูทีน DOS และ BIOS ไม่มีประสิทธิภาพเป็นพิเศษ นอกจากว่าจอแสดงผลจะว่างเปล่ามันสามารถเขียนได้ในบางช่วงเวลาเท่านั้น ชุดคำสั่ง BIOS เพื่อส่งออกอักขระได้รับการออกแบบเพื่อให้สามารถเรียกใช้ได้ตลอดเวลา แต่ละคำขอจึงต้องเริ่มต้นใหม่อีกครั้งรอเวลาที่เหมาะสมเพื่อดำเนินการเขียน ในทางตรงกันข้ามรหัสแอปพลิเคชั่นที่รู้ว่าต้องทำอะไรสามารถจัดระเบียบตัวเองในโอกาสที่มีอยู่เพื่อเขียนจอแสดงผล

ประเด็นสำคัญในที่นี้คือในขณะที่ DOS และ BIOS จัดเตรียมวิธีการแสดงข้อความไปยังจอแสดงผล แอปพลิเคชันที่ต้องการเขียนข้อความไปยังจอแสดงผลสามารถทำได้อย่างมีประสิทธิภาพอย่างน้อยถ้าฮาร์ดแวร์การแสดงผลทำงานตามที่แอปพลิเคชันคาดหวัง (ถ้ามีคนติดตั้ง Monochrome Display Adapter ซึ่งคล้ายกับ CGA แต่มีหน่วยความจำอักขระ) อยู่ที่ 0xB000: 0000-0xB000: 3999) BIOS จะแสดงอักขระโดยอัตโนมัติ แอปพลิเคชันที่ถูกตั้งโปรแกรมให้ทำงานร่วมกับ MDA หรือ CGA สามารถทำได้เช่นกัน แต่แอปพลิเคชันที่ถูกตั้งโปรแกรมสำหรับ CGA จะไม่มีประโยชน์กับ MDA ทั้งหมด)

สำหรับระบบที่ใหม่กว่าสิ่งต่าง ๆ จะแตกต่างกันเล็กน้อย โปรเซสเซอร์มีโหมด "สิทธิ์" ที่หลากหลาย พวกเขาเริ่มต้นในโหมดที่ได้รับการยกเว้นมากที่สุดโดยที่โค้ดได้รับอนุญาตให้ทำสิ่งที่ต้องการ จากนั้นพวกเขาสามารถเปลี่ยนเป็นโหมด จำกัด ซึ่งมีเฉพาะช่วงของหน่วยความจำที่เลือกหรือสิ่งอำนวยความสะดวก I / O ที่มีอยู่ รหัสไม่สามารถสลับโดยตรงจากโหมด จำกัด กลับสู่โหมดสิทธิ์ แต่โปรเซสเซอร์ได้กำหนดจุดเข้าใช้โหมดพิเศษและรหัสโหมด จำกัด สามารถขอให้ตัวประมวลผลเริ่มต้นการเรียกใช้รหัสที่หนึ่งในจุดเข้าใช้เหล่านั้นในโหมดพิเศษ นอกจากนี้ยังมีจุดเข้าใช้โหมดพิเศษที่เชื่อมโยงกับการปฏิบัติการหลายอย่างซึ่งจะถูกห้ามในโหมด จำกัด ตัวอย่างเช่นสมมติว่ามีคนต้องการเรียกใช้แอปพลิเคชั่น MS-DOS หลายตัวพร้อมกันโดยแต่ละคนมีหน้าจอของตัวเอง หากแอปพลิเคชันสามารถเขียนโดยตรงไปยังตัวควบคุมการแสดงผลที่ 0xB800: 0 จะไม่มีวิธีในการป้องกันแอปพลิเคชันหนึ่งจากการเขียนทับหน้าจอของแอปพลิเคชันอื่น ในทางกลับกันระบบปฏิบัติการสามารถเรียกใช้แอปพลิเคชั่นในโหมด จำกัด และดักจับการเข้าถึงหน่วยความจำจอแสดงผล หากพบว่าแอปพลิเคชันที่ควรจะอยู่ใน "แบ็คกราวน์" กำลังพยายามเขียน 0xB800: 160 มันสามารถเก็บข้อมูลไว้ในหน่วยความจำบางส่วนที่ตั้งไว้เป็นบัฟเฟอร์หน้าจอแอปพลิเคชันแบ็คกราวน์ หากแอปพลิเคชันนั้นถูกเปลี่ยนเป็นพื้นหน้าในภายหลังก็สามารถคัดลอกบัฟเฟอร์ไปยังหน้าจอจริงได้ ระบบปฏิบัติการสามารถเรียกใช้แอปพลิเคชั่นในโหมด จำกัด และดักจับการเข้าถึงหน่วยความจำจอแสดงผล หากพบว่าแอปพลิเคชันที่ควรจะอยู่ใน "แบ็คกราวน์" กำลังพยายามเขียน 0xB800: 160 มันสามารถเก็บข้อมูลไว้ในหน่วยความจำบางส่วนที่ตั้งไว้เป็นบัฟเฟอร์หน้าจอแอปพลิเคชันแบ็คกราวน์ หากแอปพลิเคชันนั้นถูกเปลี่ยนเป็นพื้นหน้าในภายหลังก็สามารถคัดลอกบัฟเฟอร์ไปยังหน้าจอจริงได้ ระบบปฏิบัติการสามารถเรียกใช้แอปพลิเคชั่นในโหมด จำกัด และดักจับการเข้าถึงหน่วยความจำจอแสดงผล หากพบว่าแอปพลิเคชันที่ควรจะอยู่ใน "แบ็คกราวน์" กำลังพยายามเขียน 0xB800: 160 มันสามารถเก็บข้อมูลไว้ในหน่วยความจำบางส่วนที่ตั้งไว้เป็นบัฟเฟอร์หน้าจอแอปพลิเคชันแบ็คกราวน์ หากแอปพลิเคชันนั้นถูกเปลี่ยนเป็นพื้นหน้าในภายหลังก็สามารถคัดลอกบัฟเฟอร์ไปยังหน้าจอจริงได้

สิ่งสำคัญที่ควรทราบคือ (1) แม้ว่ามันจะสะดวกในการมีชุดของกิจวัตรมาตรฐานในการให้บริการมาตรฐานต่าง ๆ เช่นการแสดงข้อความ แต่ก็ไม่ได้ทำสิ่งใดที่แอปพลิเคชันที่ทำงานใน "โหมดเอกสิทธิ์" ไม่สามารถทำได้ หากมีการตั้งโปรแกรมให้จัดการกับฮาร์ดแวร์ที่ติดตั้งไว้อย่างถูกต้อง (2) แม้ว่าแอพพลิเคชั่นส่วนใหญ่ที่ทำงานในวันนี้จะถูกป้องกันโดยระบบปฏิบัติการของพวกเขาจากการทำ I / O โดยตรง แต่โปรแกรมที่เริ่มทำงานในโหมดเอกสิทธิ์จะทำทุกอย่างที่ต้องการและสามารถกำหนดกฎที่ต้องการสำหรับโหมด จำกัด โปรแกรม


2

ดังที่สตีเฟ่นซีกล่าวว่ามันไม่ได้เป็นเพียงแค่การเริ่มต้นระบบปฏิบัติการ แต่ยังเกี่ยวกับวิธีการทำงานการโต้ตอบกับฮาร์ดแวร์และซอฟต์แวร์ที่อยู่ด้านบน

ฉันเพิ่งจะเพิ่มคำตอบของเขาที่คุณอาจต้องการที่จะดูที่"องค์ประกอบของระบบคอมพิวเตอร์" มันเป็นหนังสือและเครื่องมือบางอย่างที่อธิบายว่าคอมพิวเตอร์ระบบปฏิบัติการและคอมไพเลอร์มีปฏิสัมพันธ์อย่างไร สิ่งที่ไม่ซ้ำกันเกี่ยวกับเรื่องนี้ก็คือว่ามันจะช่วยให้คุณมีเครื่องมือในการพัฒนาอย่างรวดเร็วของระบบปฏิบัติการของตัวเองในสภาพแวดล้อมจำลองละเลยรายละเอียดมากที่จำเป็นสำหรับหนึ่งจริงเพื่อให้คุณสามารถเข้าใจแนวคิด มันเป็นงานที่ยอดเยี่ยมที่ให้คุณได้เห็นป่าแทนที่จะเป็นต้นไม้

หากคุณต้องการที่จะไปลงรายละเอียดเพิ่มเติมเกี่ยวกับวิธีระบบปฏิบัติการโต้ตอบกับฮาร์ดแวร์แล้วตรวจสอบมินิกซ์


1

คุณเขียนระบบปฏิบัติการ มันจะต้องทำงานอย่างใดและวิธีการที่อยู่ในระบบปฏิบัติการอื่นได้หรือไม่

แอปพลิเคชันของคุณทำงานในระบบปฏิบัติการ ระบบปฏิบัติการนี้ให้บริการกับแอปพลิเคชันของคุณสิ่งต่างๆเช่นการเปิดไฟล์และการเขียนไบต์ไปยังมัน บริการเหล่านี้มักจะให้ผ่านการโทรของระบบ

ระบบปฏิบัติการกำลังทำงานอยู่ภายในฮาร์ดแวร์ ฮาร์ดแวร์ให้บริการกับระบบปฏิบัติการสิ่งต่าง ๆ เช่นการตั้งค่าอัตราการรับส่งข้อมูลของพอร์ตอนุกรมและการเขียนไบต์ไป บริการเหล่านี้มักจะมีให้ผ่านการลงทะเบียนหน่วยความจำที่แมปหรือพอร์ต I / O


ในการให้ตัวอย่างแบบง่ายมากเกี่ยวกับวิธีการทำงาน:

แอปพลิเคชันของคุณบอกให้ระบบปฏิบัติการเขียนบางอย่างลงในไฟล์ สำหรับแอปพลิเคชันของคุณระบบปฏิบัติการจะให้แนวคิดเช่นไฟล์และไดเรกทอรี

บนฮาร์ดแวร์แนวคิดเหล่านี้ไม่มีอยู่ ฮาร์ดแวร์ให้แนวคิดเช่นดิสก์ที่แบ่งเป็นบล็อกขนาด 512 ไบต์ ระบบปฏิบัติการจะตัดสินใจว่าจะใช้บล็อกใดสำหรับไฟล์ของคุณและบล็อกอื่น ๆ สำหรับข้อมูลเมตาเช่นชื่อไฟล์ขนาดและตำแหน่งบนดิสก์ จากนั้นจะบอกฮาร์ดแวร์: เขียน 512 ไบต์เหล่านี้ไปยังเซกเตอร์ด้วยหมายเลขนี้บนดิสก์ด้วยหมายเลขนั้น เขียน 512 ไบต์อื่น ๆ เหล่านี้ไปยังเซกเตอร์ด้วยหมายเลขที่แตกต่างกันนี้บนดิสก์ด้วยหมายเลขเดียวกันนั้น และอื่น ๆ

วิธีที่ระบบปฏิบัติการบอกให้ฮาร์ดแวร์ทำสิ่งนั้นแตกต่างกันมาก หนึ่งในฟังก์ชั่นของระบบปฏิบัติการคือการป้องกันแอพพลิเคชั่นจากความแตกต่างเหล่านี้ สำหรับตัวอย่างดิสก์บนฮาร์ดแวร์ชนิดหนึ่งระบบปฏิบัติการจะต้องเขียนดิสก์และหมายเลขเซกเตอร์ไปยังพอร์ต I / O แล้วเขียนไบต์หนึ่งต่อหนึ่งไปยังพอร์ต I / O แยกต่างหาก บนฮาร์ดแวร์ชนิดอื่นระบบปฏิบัติการจะต้องคัดลอกทั้ง 512 ไบต์ของเซกเตอร์ไปยังพื้นที่หน่วยความจำเขียนตำแหน่งของพื้นที่หน่วยความจำนั้นไปยังตำแหน่งหน่วยความจำพิเศษแล้วเขียนดิสก์และหมายเลขเซกเตอร์ไปยังอีกหน่วยหนึ่ง ตำแหน่งหน่วยความจำพิเศษ


ฮาร์ดแวร์ระดับสูงในปัจจุบันมีความซับซ้อนมาก คู่มือที่ให้รายละเอียดการเขียนโปรแกรมทั้งหมดเป็นเครื่องมือหยุดประตูที่มีหลายพันหน้า ตัวอย่างเช่นคู่มือ CPU Intel ล่าสุดคือเจ็ดเล่มมีทั้งหมดกว่า 4000 หน้า - และนั่นเป็นเพียงสำหรับ CPU ส่วนประกอบอื่น ๆ ส่วนใหญ่จะเปิดเผยบล็อกของหน่วยความจำหรือพอร์ต I / O ซึ่งระบบปฏิบัติการสามารถบอก CPU ให้จับคู่กับที่อยู่ภายในพื้นที่ที่อยู่ ส่วนประกอบเหล่านี้หลายอย่างเปิดเผยสิ่งต่าง ๆ มากขึ้นหลังพอร์ต I / O หรือที่อยู่หน่วยความจำน้อย ตัวอย่างเช่น RTC (นาฬิกาเรียลไทม์ซึ่งเป็นส่วนประกอบที่ช่วยให้เวลาของคอมพิวเตอร์ในขณะที่ปิดเครื่อง) ทำให้หน่วยความจำสองสามร้อยไบต์อยู่ด้านหลังพอร์ต I / O คู่หนึ่งซึ่งเป็นส่วนประกอบที่ง่ายมาก PC / AT ดั้งเดิม สิ่งต่าง ๆ เช่นฮาร์ดดิสก์มีโปรเซสเซอร์ที่แยกจากกันทั้งหมด ซึ่งระบบปฏิบัติการพูดผ่านคำสั่งมาตรฐาน GPU นั้นซับซ้อนยิ่งขึ้น

หลายคนในความคิดเห็นข้างต้นแนะนำ Arduino ฉันเห็นด้วยกับพวกเขามันง่ายกว่าที่จะเข้าใจ - ATmega328 ซึ่งทำทุกอย่างบน Arduino Uno ยกเว้นการเปิดเผยตัวเชื่อมต่อ USB เป็นพอร์ตอนุกรมมีคู่มือที่มีเพียงไม่กี่ร้อยหน้า บน Arduino คุณสามารถรันบนฮาร์ดแวร์ได้โดยตรงโดยไม่มีระบบปฏิบัติการ ไลบรารีรูทีนขนาดเล็กเพียงไม่กี่ตัวซึ่งคุณไม่จำเป็นต้องใช้หากคุณไม่ต้องการ


1

ตัวอย่างที่เรียกใช้

ในทางเทคนิคแล้วโปรแกรมที่ทำงานโดยไม่มี OS เป็นระบบปฏิบัติการ ดังนั้นเรามาดูวิธีการสร้างและรันระบบปฏิบัติการ Hello world ขนาดจิ๋ว

โค้ดของตัวอย่างทั้งหมดด้านล่างมีอยู่ในrepo ของ GitHubนี้

บูตเซกเตอร์

บน x86 สิ่งที่ง่ายที่สุดและต่ำที่สุดที่คุณสามารถทำได้คือการสร้างMaster Boot Sector (MBR)ซึ่งเป็นประเภทของบูตเซกเตอร์แล้วติดตั้งลงในดิสก์

ที่นี่เราสร้างขึ้นมาด้วยการprintfโทรเพียงครั้งเดียว:

printf '\364%509s\125\252' > main.img
sudo apt-get install qemu-system-x86
qemu-system-x86_64 -hda main.img

ผล:

ป้อนคำอธิบายรูปภาพที่นี่

ทดสอบบน Ubuntu 18.04, QEMU 2.11.1

main.img มีดังต่อไปนี้:

  • \364ใน octal == 0xf4ใน hex: การเข้ารหัสสำหรับhltคำสั่งซึ่งบอกให้ CPU หยุดทำงาน

    ดังนั้นโปรแกรมของเราจะไม่ทำอะไรเลยเพียง แต่เริ่มและหยุดเท่านั้น

    เราใช้ฐานแปดเพราะเลขฐาน\xสิบหกไม่ได้ถูกระบุโดย POSIX

    เราสามารถรับการเข้ารหัสนี้ได้อย่างง่ายดายด้วย:

    echo hlt > a.asm
    nasm -f bin a.asm
    hd a
    

    แต่การ0xf4เข้ารหัสนั้นมีการบันทึกไว้ในคู่มือ Intel แน่นอน

  • %509sผลิต 509 ช่องว่าง จำเป็นต้องกรอกข้อมูลในไฟล์จนถึงไบต์ 510

  • \125\252ใน octal == 0x55ตามด้วย0xaa: magic bytes ต้องการโดยฮาร์ดแวร์ พวกเขาจะต้องเป็นไบต์ 511 และ 512

    หากไม่มีอยู่ฮาร์ดแวร์จะไม่ถือเป็นดิสก์ที่ใช้บู๊ตได้

โปรดทราบว่าแม้จะไม่ได้ทำอะไรเลยตัวละครบางตัวก็พิมพ์อยู่บนหน้าจอแล้ว เหล่านั้นถูกพิมพ์โดยเฟิร์มแวร์และให้บริการเพื่อระบุระบบ

ทำงานบนฮาร์ดแวร์จริง

อีมูเลเตอร์เป็นเรื่องสนุก แต่ฮาร์ดแวร์เป็นเรื่องจริง

โปรดทราบว่านี่เป็นอันตรายและคุณสามารถล้างดิสก์ของคุณโดยไม่ได้ตั้งใจ: ทำสิ่งนี้กับเครื่องเก่าที่ไม่มีข้อมูลที่สำคัญ! หรือดียิ่งกว่า devboards เช่น Raspberry Pi ดูตัวอย่าง ARM ด้านล่าง

สำหรับแล็ปท็อปทั่วไปคุณต้องทำสิ่งต่อไปนี้:

  • เบิร์นภาพเป็นแท่ง USB (จะทำลายข้อมูลของคุณ!):

    sudo dd if=main.img of=/dev/sdX
    
  • เสียบ USB บนคอมพิวเตอร์

  • เปิด

  • บอกให้บูตจาก USB

    นี่หมายถึงการทำให้เฟิร์มแวร์เลือก USB ก่อนฮาร์ดดิสก์

    หากนี่ไม่ใช่พฤติกรรมเริ่มต้นของเครื่องให้กดปุ่ม Enter, F12, ESC หรือปุ่มแปลก ๆ อื่น ๆ หลังจากเปิดเครื่องจนกว่าคุณจะได้รับเมนูบูตที่คุณสามารถเลือกที่จะบูตจาก USB

    บ่อยครั้งที่สามารถกำหนดค่าลำดับการค้นหาในเมนูเหล่านั้นได้

ตัวอย่างเช่น Lenovo Thinkpad T430 รุ่นเก่า UEFI BIOS 1.16 ฉันสามารถดู:

สวัสดีชาวโลก

ตอนนี้เราได้จัดทำโปรแกรมขั้นต่ำให้ย้ายไปสู่โลกสวัสดี

คำถามที่ชัดเจนคือทำอย่างไร IO? ตัวเลือกไม่กี่:

  • ถามเฟิร์มแวร์เช่น BIOS หรือ UEFI ให้ทำเพื่อเรา
  • VGA: พื้นที่หน่วยความจำพิเศษที่ถูกพิมพ์ไปที่หน้าจอถ้าเขียน สามารถใช้ในโหมดที่ได้รับการป้องกัน
  • เขียนไดรเวอร์และพูดคุยกับฮาร์ดแวร์การแสดงผลโดยตรง นี่เป็นวิธีที่ "เหมาะสม" ที่จะทำ: มีประสิทธิภาพมากกว่า แต่ซับซ้อนกว่า
  • พอร์ตอนุกรม นี่เป็นโปรโตคอลมาตรฐานที่ง่ายมากที่ส่งและดึงอักขระจากเทอร์มินัลโฮสต์

    แหล่ง

    น่าเสียดายที่ไม่ได้เปิดตัวในแล็ปท็อปที่ทันสมัยที่สุด แต่เป็นวิธีการทั่วไปในการพัฒนาบอร์ดดูตัวอย่าง ARM ด้านล่าง

    นี่คือจริงๆอัปยศตั้งแต่การเชื่อมต่อดังกล่าวมีประโยชน์จริงๆที่จะแก้ปัญหาเคอร์เนลตัวอย่างเช่น

  • ใช้คุณสมบัติการดีบักของชิป ARM เรียกพวกเขาsemihostingตัวอย่างเช่น สำหรับฮาร์ดแวร์จริงต้องใช้การสนับสนุนฮาร์ดแวร์และซอฟต์แวร์เพิ่มเติม แต่สำหรับตัวจำลองอาจเป็นตัวเลือกที่สะดวกสบายฟรี ตัวอย่าง

ที่นี่เราจะทำตัวอย่าง BIOS เพราะมันง่ายกว่าบน x86 แต่โปรดทราบว่ามันไม่ใช่วิธีที่แข็งแกร่งที่สุด

main.S

.code16
    mov $msg, %si
    mov $0x0e, %ah
loop:
    lodsb
    or %al, %al
    jz halt
    int $0x10
    jmp loop
halt:
    hlt
msg:
    .asciz "hello world"

link.ld

SECTIONS
{
    . = 0x7c00;
    .text :
    {
        __start = .;
        *(.text)
        . = 0x1FE;
        SHORT(0xAA55)
    }
}

รวบรวมและเชื่อมโยงกับ:

gcc -c -g -o main.o main.S
ld --oformat binary -o main.img -T linker.ld main.o

ผล:

ป้อนคำอธิบายรูปภาพที่นี่

ทดสอบกับ: Lenovo Thinkpad T430, UEFI BIOS 1.16 ดิสก์สร้างขึ้นบนโฮสต์ Ubuntu 18.04

นอกจากคำแนะนำในการประกอบมาตรฐาน userland แล้วเรายังมี:

  • .code16: บอก GAS ให้รับรหัส 16 บิต

  • cli: ปิดการใช้งานซอฟต์แวร์ขัดจังหวะ สิ่งเหล่านี้อาจทำให้ตัวประมวลผลเริ่มทำงานอีกครั้งหลังจากนั้นhlt

  • int $0x10: ทำการเรียก BIOS นี่คือสิ่งที่พิมพ์อักขระทีละตัว

ธงเชื่อมโยงที่สำคัญคือ:

  • --oformat binary: เอาท์พุทรหัสแอสเซมบลีไบนารี่ดิบอย่าบิดมันเข้าไปในไฟล์ ELF ดังที่เป็นกรณีของไฟล์เอ็กซีคิวต์ที่รันได้ปกติ

ใช้ C แทนการชุมนุม

เนื่องจาก C คอมไพล์เป็นแอสเซมบลีการใช้ C โดยไม่มีไลบรารี่มาตรฐานค่อนข้างง่ายคุณจำเป็นเพียงแค่:

  • สคริปต์ linker ที่จะนำสิ่งต่าง ๆ ในหน่วยความจำในสถานที่ที่เหมาะสม
  • ค่าสถานะที่บอก GCC ว่าจะไม่ใช้ไลบรารีมาตรฐาน
  • จุดเริ่มต้นของแอสเซมบลีขนาดเล็กที่ตั้งค่าสถานะ C ที่จำเป็นสำหรับmainสะดุดตา:
    • กองซ้อน
    • ไม่มีศูนย์ BSS

สิ่งที่ต้องทำ: เชื่อมโยงดังนั้นบางตัวอย่าง x86 ใน GitHub นี่คือ ARM หนึ่งที่ฉันได้สร้างไว้

สิ่งที่สนุกมากขึ้นถ้าคุณต้องการใช้ไลบรารีมาตรฐานเนื่องจากเราไม่มีเคอร์เนล Linux ซึ่งใช้การทำงานของไลบรารี่มาตรฐาน C ผ่าน POSIX

ความเป็นไปได้บางประการโดยไม่ต้องใช้ระบบปฏิบัติการที่เต็มรูปแบบเช่น Linux รวมถึง:

  • Newlib

    ตัวอย่างโดยละเอียดที่: https://electronics.stackexchange.com/questions/223929/c-standard-l ไลบรารี-on-bare-metal/223931

    ใน Newlib คุณจะต้องติดตั้ง syscalls ด้วยตัวคุณเอง แต่คุณจะได้รับระบบที่น้อยที่สุดและง่ายต่อการติดตั้ง

    ตัวอย่างเช่นคุณสามารถเปลี่ยนเส้นทางprintfไปยัง UART หรือ ARM ระบบหรือดำเนินการexit()กับsemihosting

  • ฝังตัวระบบปฏิบัติการเช่นFreeRTOSและZephyr

    โดยทั่วไประบบปฏิบัติการดังกล่าวจะช่วยให้คุณสามารถปิดการกำหนดเวลาล่วงหน้าได้ดังนั้นคุณจึงสามารถควบคุมการทำงานของโปรแกรมได้อย่างสมบูรณ์

    พวกเขาสามารถมองเห็นเป็น Newlib ก่อนดำเนินการ

แขน

ใน ARM ความคิดทั่วไปนั้นเหมือนกัน ฉันอัพโหลดแล้ว:

สำหรับ Raspberry Pi https://github.com/dwelch67/raspberrypiดูเหมือนว่าจะมีการสอนที่ได้รับความนิยมมากที่สุดในปัจจุบัน

ความแตกต่างบางอย่างจาก x86 รวมถึง:

  • IO ทำโดยการเขียนไปยังที่อยู่เวทย์โดยตรงไม่มีinและoutคำแนะนำ

    นี้เรียกว่าหน่วยความจำที่แมป IO

  • สำหรับฮาร์ดแวร์จริงบางอย่างเช่น Raspberry Pi คุณสามารถเพิ่มเฟิร์มแวร์ (BIOS) เข้ากับภาพดิสก์ได้

    นั่นเป็นสิ่งที่ดีเพราะทำให้การอัปเดตเฟิร์มแวร์นั้นโปร่งใสยิ่งขึ้น

เฟิร์มแว

อันที่จริงบูตเซกเตอร์ของคุณไม่ใช่ซอฟต์แวร์ตัวแรกที่ทำงานบน CPU ของระบบ

สิ่งที่ทำงานก่อนจริง ๆ คือเฟิร์มแวร์ที่เรียกว่าซึ่งเป็นซอฟต์แวร์:

  • ทำโดยผู้ผลิตฮาร์ดแวร์
  • โดยทั่วไปแล้วจะปิดแหล่งที่มา แต่มีแนวโน้มว่า C-based
  • เก็บไว้ในหน่วยความจำแบบอ่านอย่างเดียวและยากที่จะแก้ไขโดยไม่ได้รับอนุญาตจากผู้ขาย

เฟิร์มแวร์ที่รู้จักกันดี ได้แก่ :

  • ไบออส : เฟิร์มแวร์ x86 ปัจจุบันทั้งหมด SeaBIOS เป็นการใช้งานโอเพ่นซอร์สเริ่มต้นที่ใช้โดย QEMU
  • UEFI : ตัวตายตัวแทน BIOS มาตรฐานที่ดีกว่า แต่มีความสามารถมากกว่าและป่องอย่างไม่น่าเชื่อ
  • Coreboot : ความพยายามเปิดโอเพนซอร์สอันสูงส่ง

เฟิร์มแวร์ทำสิ่งต่าง ๆ เช่น:

  • วนรอบฮาร์ดดิสก์แต่ละอัน, USB, เครือข่าย ฯลฯ จนกว่าคุณจะพบสิ่งที่สามารถบู๊ตได้

    เมื่อเราเรียกใช้ QEMU -hdaกล่าวว่าmain.imgเป็นฮาร์ดดิสก์ที่เชื่อมต่อกับฮาร์ดแวร์และ

    hda เป็นคนแรกที่จะลองและมีการใช้

  • โหลด 512 ไบต์แรกไปยังที่อยู่หน่วยความจำ RAM 0x7c00วาง RIP ของ CPU ที่นั่นและปล่อยให้ทำงาน

  • แสดงสิ่งต่าง ๆ เช่นเมนูการบูตหรือการเรียกพิมพ์ BIOS บนหน้าจอ

เฟิร์มแวร์มีฟังก์ชั่นคล้ายกับระบบปฏิบัติการที่ OS-es ส่วนใหญ่พึ่งพา เช่นชุดย่อย Python ได้รับการพอร์ตเพื่อให้ทำงานบน BIOS / UEFI: https://www.youtube.com/watch?v=bYQ_lq5dcvM

เป็นที่ถกเถียงกันอยู่ว่าเฟิร์มแวร์นั้นแยกไม่ออกจากระบบปฏิบัติการและเฟิร์มแวร์นั้นเป็นโปรแกรมโลหะเปลือยที่ "จริง" เท่านั้นที่สามารถทำได้

เช่นนี้dev CoreOS ทำให้มัน :

ส่วนที่แข็ง

เมื่อคุณเปิดเครื่องคอมพิวเตอร์ชิปที่ประกอบขึ้นเป็นชิปเซ็ต (Northbridge, Southbridge และ SuperIO) จะยังไม่เริ่มต้นอย่างถูกต้อง แม้ว่า BIOS ROM นั้นจะถูกลบออกไปจากซีพียูเท่าที่จะเป็นไปได้ แต่ซีพียูนี้สามารถเข้าถึงได้เพราะจะต้องมีมิฉะนั้น CPU จะไม่มีคำแนะนำในการดำเนินการ นี่ไม่ได้หมายความว่า BIOS ROM ถูกแมปอย่างสมบูรณ์โดยปกติจะไม่ แต่มีการแมปพอที่จะทำให้กระบวนการบูตดำเนินต่อไป อุปกรณ์อื่น ๆ เพียงแค่ลืมมัน

เมื่อคุณรัน Coreboot ภายใต้ QEMU คุณสามารถทดลองกับ Coreboot ที่สูงขึ้นและ payloads ได้ แต่ QEMU ให้โอกาสเล็กน้อยในการทดสอบด้วยรหัสเริ่มต้นระดับต่ำ สำหรับสิ่งหนึ่ง RAM ทำงานได้ตั้งแต่เริ่มต้น

โพสต์สถานะเริ่มต้น BIOS

เช่นเดียวกับหลาย ๆ สิ่งในฮาร์ดแวร์การสร้างมาตรฐานนั้นอ่อนแอและสิ่งหนึ่งที่คุณไม่ควรพึ่งพาคือสถานะเริ่มต้นของการลงทะเบียนเมื่อรหัสของคุณเริ่มทำงานหลังจาก BIOS

ดังนั้นโปรดทำด้วยตนเองและใช้รหัสเริ่มต้นบางอย่างดังต่อไปนี้: https://stackoverflow.com/a/32509555/895245

การลงทะเบียนที่ชอบ%dsและ%esมีผลข้างเคียงที่สำคัญดังนั้นคุณควรเป็นศูนย์ถึงแม้ว่าคุณจะไม่ได้ใช้พวกเขาอย่างชัดเจน

โปรดทราบว่าอีมูเลเตอร์บางตัวนั้นดีกว่าฮาร์ดแวร์จริงและให้สถานะเริ่มต้นที่ดีแก่คุณ จากนั้นเมื่อคุณทำงานบนฮาร์ดแวร์จริงทุกอย่างจะแตก

GNU GRUB Multiboot

บูตเซกเตอร์นั้นง่าย แต่ก็ไม่สะดวก:

  • คุณสามารถมีหนึ่งระบบปฏิบัติการต่อดิสก์
  • รหัสการโหลดจะต้องมีขนาดเล็กมากและพอดีกับ 512 ไบต์ นี้สามารถแก้ไขได้ด้วยการโทร BIOS int 0x13
  • คุณต้องเริ่มต้นด้วยตัวเองบ่อยครั้งเช่นเข้าสู่โหมดที่ได้รับการป้องกัน

มันเป็นเพราะเหตุผลที่GNU GRUBสร้างรูปแบบไฟล์ที่สะดวกกว่าที่เรียกว่า multiboot

ตัวอย่างการทำงานขั้นต่ำ: https://github.com/cirosantilli/x86-bare-metal-examples/tree/d217b180be4220a0b4a453f31275d38e697a99e0/multiboot/hello-world

ฉันยังใช้มันบนrepo ตัวอย่าง GitHubของฉันเพื่อให้สามารถเรียกใช้ตัวอย่างทั้งหมดบนฮาร์ดแวร์จริงได้อย่างง่ายดายโดยไม่ต้องเผา USB เป็นล้านครั้ง ใน QEMU ดูเหมือนว่า:

ป้อนคำอธิบายรูปภาพที่นี่

หากคุณเตรียม OS ของคุณเป็นไฟล์มัลติบูต GRUB สามารถค้นหาได้ในระบบไฟล์ปกติ

นี่คือสิ่งที่ distros ทำส่วนใหญ่วางภาพ OS ไว้ด้าน/bootล่าง

ไฟล์มัลติบูตเป็นไฟล์เอลฟ์ที่มีส่วนหัวพิเศษ มีการระบุไว้โดย GRUB ที่: https://www.gnu.org/software/grub/manual/multiboot/multiboot.html

คุณสามารถเปิดไฟล์ multiboot grub-mkrescueเป็นบูตดิสก์ด้วย

เอลโตริโต

รูปแบบที่สามารถเขียนลงซีดีได้: https://en.wikipedia.org/wiki/El_Torito_%28CD-ROM_standard%29

นอกจากนี้ยังสามารถสร้างภาพไฮบริดที่ทำงานได้ทั้ง ISO หรือ USB นี้จะสามารถทำได้ด้วยgrub-mkrescue( ตัวอย่าง ) และจะทำยังโดยเคอร์เนลในการใช้make isoimageisohybrid

ทรัพยากร

  • http://wiki.osdev.orgเป็นแหล่งข้อมูลที่ดีสำหรับเรื่องเหล่านั้น
  • https://github.com/scanlime/metalkitเป็นระบบรวบรวมโลหะอัตโนมัติ / ทั่วไปที่ให้ API แบบกำหนดเองขนาดเล็ก
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.