คอสมอส (ระบบปฏิบัติการ)
| จักรวาล | |
|---|---|
ภาพหน้าจอของระบบปฏิบัติการที่สร้างด้วย Cosmos ชื่อAuraOSซึ่งแสดงให้เห็นถึงความเป็นไปได้ในการสร้าง GUI | |
| นักพัฒนา | โครงการคอสมอส |
| เขียนเป็น | ซี# , เอ็กซ์# |
| สถานะการทำงาน | คล่องแคล่ว |
| แบบจำลองแหล่งที่มา | โอเพนซอร์ส |
| รุ่นล่าสุด | เผยแพร่เมื่อ 21 พฤศจิกายน 2022 |
| ที่เก็บข้อมูล | github.com/CosmosOS |
| มีจำหน่ายใน | ภาษาอังกฤษ |
| แพลตฟอร์มที่รองรับ | x86 |
| ประเภทเคอร์เนล | โมโนลิธิก |
| ใบอนุญาต | บีเอสดี |
| เว็บไซต์อย่างเป็นทางการ | www.gocosmos.org |
C# Open Source Managed Operating System ( Cosmos ) เป็นชุดเครื่องมือสำหรับการสร้างระบบปฏิบัติการ แบบ GUIและแบบบรรทัดคำสั่งซึ่งเขียนขึ้นส่วนใหญ่ด้วยภาษาโปรแกรมC# และ ภาษาแอสเซมบลีระดับสูงชื่อ X# ในปริมาณเล็กน้อย Cosmosเป็นคำย่อที่มาจากคำก่อนหน้า [ 1 ] ซึ่งคำย่อ นี้ ถูกเลือกก่อนความหมาย เป็นซอฟต์แวร์โอเพนซอร์ส ที่ เผยแพร่ภายใต้ใบอนุญาต BSD
ข้อมูล ณ ปี 2022Cosmos ประกอบด้วย คอมไพเลอร์แบบ Ahead-of-Time (AOT) ชื่อIL2CPUเพื่อแปลงCommon Intermediate Language (CIL) เป็นคำสั่งเนทีฟ Cosmos คอมไพล์โปรแกรมที่ผู้ใช้สร้างขึ้นและไลบรารี ที่เกี่ยวข้อง โดยใช้ IL2CPU เพื่อสร้าง ไฟล์ปฏิบัติการเนทีฟที่สามารถ บูตได้และทำงานได้อย่างอิสระ ผลลัพธ์ที่ได้สามารถบูตได้จากแฟลชไดรฟ์ USB , CD-ROM , ผ่านเครือข่ายโดยใช้Preboot Execution Environment (PXE) หรือภายในเครื่องเสมือนเวอร์ชันล่าสุดยังอนุญาตให้ใช้งานบน อุปกรณ์ฝังตัว x86 บางรุ่น ผ่าน Universal Serial Bus ( USB ) ได้อีกด้วย แม้ว่า C# จะเป็นภาษาหลักที่นักพัฒนาใช้ (ทั้งในส่วนแบ็กเอนด์และผู้ใช้ปลายทางของ Cosmos) แต่ก็สามารถใช้ ภาษา CLI ได้หลายภาษา ตราบใดที่ภาษาเหล่านั้นคอมไพล์เป็น CIL บริสุทธิ์โดยไม่ต้องใช้Platform Invocation Services (P/Invokes) Cosmos มีจุดประสงค์หลักในการใช้งานร่วมกับ. NET
Cosmos ไม่ได้มุ่งหวังที่จะเป็นระบบปฏิบัติการที่สมบูรณ์แบบ แต่เป็นชุดเครื่องมือที่จะช่วยให้นักพัฒนาคนอื่นๆ สามารถสร้างระบบปฏิบัติการของตนเองได้อย่างง่ายดายโดยใช้ .NET นอกจากนี้ยังทำหน้าที่เป็นเลเยอร์นามธรรมซ่อนการทำงานภายในของฮาร์ดแวร์ส่วนใหญ่จากนักพัฒนาที่จะใช้งานในภายหลัง
Cosmos เวอร์ชันเก่าๆ ถูกปล่อยออกมาในรูปแบบ Milestoneโดยเวอร์ชันสุดท้ายคือ Milestone 5 (เผยแพร่เมื่อเดือนสิงหาคม 2010) ส่วนเวอร์ชันหลังๆ โครงการได้เปลี่ยนมาตั้งชื่อเวอร์ชันใหม่ตามหมายเลข commit ล่าสุดแทน
การเผยแพร่ Cosmos แบ่งออกเป็นสองประเภท ได้แก่UserkitและDevkit Userkit เป็นเวอร์ชันที่บรรจุไว้ล่วงหน้าซึ่งจะได้รับการอัปเดตเป็นระยะ ๆ เมื่อมีการเพิ่มคุณสมบัติใหม่และปรับปรุง Userkit โดยทั่วไปถือว่ามีความเสถียร แต่จะไม่รวมการเปลี่ยนแปลงล่าสุดและอาจขาดคุณสมบัติบางอย่าง Devkit ซึ่งหมายถึงซอร์สโค้ดของ Cosmos มักจะมีความเสถียร แต่อาจมีข้อบกพร่องอยู่บ้าง สามารถดาวน์โหลดได้จากGitHubและต้องสร้างด้วยตนเอง[ 1 ] Git ใช้สำหรับการจัดการการควบคุมซอร์สโค้ด
งานส่วนใหญ่ใน Cosmos ในปัจจุบันมุ่งเน้นไปที่การปรับปรุง ฟังก์ชันการทำงาน ของดีบักเกอร์และการรวมเข้ากับMicrosoft Visual Studio งาน ด้านเคอร์เนลมุ่งเน้นไปที่การใช้งานระบบไฟล์การจัดการหน่วยความจำและการพัฒนาอินเทอร์เฟซเครือข่ายที่เชื่อถือได้Limine ทำหน้าที่เป็น บูตโหลดเดอร์ของโครงการในเวอร์ชันเก่าของชุดเครื่องมือจะใช้GRUB แทน [ 2 ]
ต้นทาง
แนวคิดสำหรับ Cosmos เกิดขึ้นจาก Chad Hower และได้รับการพัฒนาร่วมกันในขั้นต้นโดย Hower และMatthijs ter Woordเมื่อเวลาผ่านไป Cosmos ได้รับการดูแลและปรับปรุงโดยบุคคลอื่น ๆ อีกมากมาย
การพัฒนาด้วย Cosmos
Cosmos มีสิ่งอำนวยความสะดวกมากมายเพื่อปรับปรุงประสบการณ์ในการพัฒนาระบบปฏิบัติการ และได้รับการออกแบบมาเพื่อให้กระบวนการนั้นรวดเร็วและราบรื่นที่สุดเท่าที่จะเป็นไปได้ ความรู้เกี่ยวกับภาษาแอสเซมบลีไม่จำเป็นสำหรับการใช้งาน Cosmos
การผสานรวม Visual Studio
คุณสมบัติสำคัญอย่างหนึ่งของ Cosmos ซึ่งทำให้แตกต่างจากระบบปฏิบัติการประเภทเดียวกันอื่นๆ คือการผสานรวมอย่างแน่นแฟ้นกับMicrosoft Visual Studioสามารถเขียนโค้ดคอมไพล์ดีบักและรันได้ทั้งหมดผ่านVisual Studioโดยใช้เพียงไม่กี่ปุ่มเท่านั้น Cosmos ไม่รองรับVisual Studio 2015 , Visual Studio 2017หรือVisual Studio 2019 อีกต่อไปแล้ว รองรับเฉพาะVisual Studio 2022เท่านั้น
การดีบัก
Cosmos สามารถดีบักได้อย่างราบรื่นผ่านVisual Studioเมื่อทำงานผ่าน PXE หรือในเครื่องเสมือน มีฟีเจอร์ การดีบักมาตรฐานมากมายเช่น เบรกพอยต์ การติดตาม และการบันทึกข้อมูล นอกจากนี้ยังสามารถดีบักผ่านสายเคเบิลอนุกรมได้หากทำงานบนฮาร์ดแวร์จริง เมื่อทำงานในVMWare Cosmos รองรับการก้าวทีละขั้นและเบรกพอยต์ แม้ในขณะที่ระบบปฏิบัติการกำลังทำงานอยู่
วิ่ง
Cosmos ใช้เทคโนโลยีเวอร์ชวลไลเซชันเพื่อช่วยเร่งความเร็วในการพัฒนา โดยอนุญาตให้นักพัฒนาทดสอบระบบปฏิบัติการได้โดยไม่ต้องรีสตาร์ทคอมพิวเตอร์บ่อยๆ โดยค่าเริ่มต้นจะใช้ VMware Player เนื่องจากใช้งานง่ายและสามารถผสานรวมเข้ากับโปรเจ็กต์ได้ดี นอกจากนี้ยังรองรับสภาพแวดล้อมเวอร์ชวลไลเซชันอื่นๆ เช่นBochsและHyper-V ด้วย และยังสามารถสร้าง อิมเมจดิสก์ ISOเพื่อเขียนลงในแฟลชไดรฟ์ USB , CD-ROMหรือสื่ออื่นๆ ได้อีกด้วย
นอกจากนี้ยังรองรับการบูตผ่าน PXE ซึ่งช่วยให้เครื่องระยะไกลสามารถใช้งาน Cosmos ผ่านการเชื่อมต่อเครือข่ายได้
การสนับสนุน IDE
Cosmos ไม่จำเป็นต้องใช้ Visual Studio อย่างเคร่งครัด คุณสามารถสร้างโปรเจ็กต์ได้โดยเรียกใช้คำสั่งด้านล่างนี้ หากคุณได้ติดตั้งเทมเพลตไว้แล้ว:
dotnet new cosmosCSKernel -n MyCOSMOSProject สามารถเขียนโค้ดได้ในโปรแกรมแก้ไขโค้ดและIDE อื่นๆ เช่นJetBrains Rider , Visual Studio Code , Neovimและ GNU Nano ข้อเสียอย่างหนึ่งคือการดีบัก อาจทำได้ยากหากไม่มีตัวดีบักเกอร์ของ Visual Studio นอกจากนี้ COSMOS จะไม่เรียกใช้ซอฟต์แวร์เวอร์ ชวลไลเซชันของคุณโดยอัตโนมัติเมื่อทำการสร้าง หากคุณต้องการใช้QEMUเป็นต้น คุณสามารถเรียกใช้คำสั่งนี้หลังจากสร้างเสร็จ:
qemu-system-x86_64 -cdrom ./bin/Debug/net6.0/MyCOSMOSProject.iso กระบวนการคอมไพล์
IL2CPU
เพื่อคอมไพล์ .NET CIL ให้เป็นภาษาแอสเซมบลี นักพัฒนา Cosmos ได้สร้างคอม ไพเลอร์แบบ Ahead-of-Timeชื่อ IL2CPU ซึ่งออกแบบมาเพื่อแยกวิเคราะห์ CIL และส่งออกโอเปรนด์x86 (IL To CPU) เป็นคอมไพเลอร์ AOTที่เขียนขึ้นโดยใช้ ภาษาที่สอดคล้องกับ Common Intermediate Language ( C# ) โดยจะแปลงCommon Intermediate Languageเป็นรหัสเครื่อง
X#
X# เป็น ภาษาโปรแกรมระดับต่ำที่ออกแบบมาสำหรับ สถาปัตยกรรมโปรเซสเซอร์ x86ซึ่งเป็นส่วนหนึ่งของระบบปฏิบัติการ Cosmos จุดมุ่งหมายคือการลดความซับซ้อนในการพัฒนาระบบปฏิบัติการโดยการรวมไวยากรณ์ภาษาที่คล้ายกับภาษา C เข้ากับภาษาแอสเซมบลีในขั้นต้น X# ถูกใช้สำหรับบริการดีบักใน Cosmos คอมไพเลอร์ของ X# เป็น โปรแกรมแบบโอเพนซอร์สที่ ทำงานบนอินเทอร์เฟซบรรทัดคำสั่ง (คอนโซล) ซึ่งจะแยกวิเคราะห์บรรทัดโค้ดเป็นโทเค็น เปรียบเทียบกับรูปแบบ และแปลงรูปแบบที่ตรงกันเป็น ภาษา แอสเซมบลี x86 ตามไวยากรณ์ของ Intelโดยทั่วไปสำหรับแอสเซมเบลอร์ YASM เวอร์ชันแรกๆ ของ X# ทำงานแบบ 1:1 กับโค้ดแอสเซมบลีเป็นส่วนใหญ่ แต่ปัจจุบันไม่ใช่เช่นนั้นอีกต่อไป
ไวยากรณ์
ไวยากรณ์ของ X# นั้นตรงไปตรงมาแต่เข้มงวดกว่าเมื่อเทียบกับภาษาC
ความคิดเห็น
X# รองรับเฉพาะคอมเมนต์บรรทัดเดียวในรูปแบบ C++ โดยเริ่มต้นด้วย - //.
ค่าคงที่
X# อนุญาตให้กำหนดค่าคงที่ที่มีชื่อซึ่งประกาศไว้นอกฟังก์ชัน ค่าคงที่ตัวเลขถูกกำหนดในลักษณะเดียวกับC++ตัวอย่างเช่น:
const i = 0การอ้างอิงถึงสิ่งเหล่านี้ในที่อื่นต้องมีเครื่องหมาย * #นำหน้าชื่อ เช่น - "#i".
- ค่าคงที่ สตริงใช้เครื่องหมายอัญประกาศเดี่ยว (
'') หากต้องการใส่เครื่องหมายอัญประกาศเดี่ยวในค่าคงที่สตริง ให้ใช้เครื่องหมายแบ็กสแลช (เช่น'I\'m so happy') สตริง X# จะสิ้นสุดด้วยค่าว่าง - ค่าคงที่เลขฐานสิบหกจะมีเครื่องหมายดอลลาร์ (
$) นำหน้า ตามด้วยค่าคงที่ ($B8000) - ค่าคงที่ทศนิยมไม่มีคำนำหน้า แต่ไม่สามารถขึ้นต้นด้วย
0. ได้ - ค่าคงที่แบบไบนารีและฐานแปดยังไม่รองรับในขณะนี้
ป้ายกำกับ
ป้ายกำกับใน X# ทำงานคล้ายกับป้ายกำกับในภาษาแอสเซมบลีอื่นๆ โดยgotoใช้ตัวย่อ (mnemonic) เพื่อกระโดดไปยังป้ายกำกับ แทนที่จะใช้ตัวย่อjumpแบบ ทั่วไปjmp
CodeLabel1 : goto CodeLabel2 :เนมสเปซ
ไฟล์โปรแกรม X# ต้องเริ่มต้นด้วยคำสั่ง namespace X# ไม่มีลำดับชั้นของ namespace ดังนั้น namespace ปัจจุบันจะเปลี่ยนไปตามแต่ละคำสั่งจนกว่าจะสิ้นสุดไฟล์ ตัวแปรหรือค่าคงที่ใน namespace ที่แตกต่างกันสามารถมีชื่อเดียวกันได้ เนื่องจาก namespace จะถูกเพิ่มไว้ข้างหน้าชื่อของสมาชิกในเอาต์พุตแอสเซมบลี namespace ไม่สามารถอ้างอิงถึงกันและกันได้ ยกเว้นผ่านการดำเนินการระดับต่ำ
namespace FIRST // ชื่อตัวแปรหรือค่าคงที่ทุกอย่างจะขึ้นต้นด้วย FIRST และเครื่องหมายขีดล่าง ดังนั้นชื่อเต็มที่แท้จริงของตัวแปรด้านล่าง// คือ FIRST_aVar var aVarnamespace SECOND // การตั้งชื่อตัวแปรอีกตัวว่า aVar ไม่ใช่ปัญหา ชื่อจริงของมันคือ SECOND_aVar var aVarnamespace FIRST // โค้ดส่วนนี้จะกลับไปอยู่ใน namespace FIRST จนกว่าไฟล์จะสิ้นสุดฟังก์ชัน
โค้ดส่วนการทำงานทั้งหมดของ X# ควรอยู่ในฟังก์ชันที่กำหนดโดยคีย์เวิร์ด 'function' ต่างจากภาษา C X# ไม่รองรับการประกาศพารามิเตอร์อย่างเป็นทางการในส่วนหัวของฟังก์ชัน ดังนั้นจึงละเว้นวงเล็บหลังชื่อฟังก์ชันตามธรรมเนียม เนื่องจากรูปแบบคงที่ของบรรทัดถูกกำหนดไว้ในไวยากรณ์ที่ใช้ในตัวแยกวิเคราะห์โค้ด วงเล็บปีกกาเปิดจึงไม่สามารถอยู่บนบรรทัดถัดไปได้ ต่างจากภาษาอื่นๆ ที่มีรูปแบบคล้าย C
ฟังก์ชันxSharpFunction { // โค้ดของฟังก์ชัน}เนื่องจาก X# เป็นภาษาโปรแกรมระดับต่ำ จึงไม่มี การแทรก เฟรมสแต็กดังนั้นโดยค่าเริ่มต้น ที่อยู่ EIP ที่ส่งคืนควรอยู่บนสุดของสแต็ก การเรียกใช้ฟังก์ชันใน X# จะมีอาร์กิวเมนต์ที่อยู่ในวงเล็บ ซึ่งแตกต่างจากในส่วนหัวของฟังก์ชัน อาร์กิวเมนต์ที่ส่งไปยังฟังก์ชันอาจเป็นรีจิสเตอร์ ที่อยู่ หรือค่าคงที่ อาร์กิวเมนต์เหล่านี้จะถูกผลักลงบนสแต็กในลำดับย้อนกลับ โปรดทราบว่าสแต็กบนแพลตฟอร์ม x86 ไม่สามารถผลักหรือดึงรีจิสเตอร์ขนาดหนึ่งไบต์ได้
ฟังก์ชันxSharpFunction { EAX = $10 anotherFunction ( EAX ); return }ฟังก์ชันanotherFunction { //โค้ดของฟังก์ชัน}คีย์เวิร์ด นี้returnจะส่งการทำงานกลับไปยังที่อยู่ EIP สำหรับส่งคืนที่บันทึกไว้ในสแต็ก
การดำเนินการทางคณิตศาสตร์และบิต
ภาษา X# สามารถทำงานกับโครงสร้างข้อมูลระดับต่ำสามแบบ ได้แก่รีจิสเตอร์สแต็กและหน่วยความจำบนพอร์ตที่แตกต่างกัน รีจิสเตอร์เป็นพื้นฐานของการดำเนินการปกติทั้งหมดในภาษา X# สามารถคัดลอกรีจิสเตอร์ไปยังอีกรีจิสเตอร์หนึ่งได้โดยการเขียนDST = SRCแทนที่จะใช้movคำสั่งโหลด/จัดเก็บ รีจิสเตอร์สามารถเพิ่มหรือลดค่าได้ง่ายเช่นกัน การดำเนินการทางคณิตศาสตร์ (บวก ลบ คูณ หาร) เขียนได้เป็น โดยdest op srcที่srcเป็นค่าคงที่ ตัวแปร หรือรีจิสเตอร์ และdestเป็นทั้งตัวถูกดำเนินการและตำแหน่งที่เก็บผลลัพธ์
ตัวอย่างของการกำหนดค่าและการดำเนินการทางคณิตศาสตร์แสดงไว้ด้านล่าง
ESI = 12345 // กำหนดค่า 12345 ให้กับ ESI EDX = #constantForEDX // กำหนดค่า #ConstantForEDX ให้กับ EDX EAX = EBX // ย้าย EBX ไปยัง EAX => mov eax, ebx EAX -- // ลดค่า EAX => dec eax EAX ++ // เพิ่มค่า EAX => inc eax EAX + 2 // เพิ่ม 2 ให้กับ eax => add eax, 2 EAX - $ 80 // ลบ 0x80 ออกจาก eax => sub eax, 0x80 BX * CX // คูณ BX ด้วย CX => mul cx -- การหาร การคูณ และการหารเอาเศษ ควรคงค่ารีจิสเตอร์ไว้CX / BX // หาร CX ด้วย BX => div bx CX mod BX // เศษเหลือของ CX/BX ไปยัง BX => div bxการเลื่อนและการหมุนรีจิสเตอร์นั้นคล้ายคลึงกับภาษาซี
DX << 10 // เลื่อนไปทางซ้าย 10 บิตCX >> 8 // เลื่อนไปทางขวา 8 บิตEAX <~ 6 // หมุนไปทางซ้าย 6 บิตEAX ~> 4 // หมุนไปทางขวา 4 บิตการดำเนินการบิตไวส์อื่นๆ นั้นคล้ายกับการดำเนินการทางคณิตศาสตร์
DL & $ 08 // ดำเนินการ AND แบบบิตกับ DL และ 0x08 แล้วเก็บผลลัพธ์ไว้ใน DL CX | 1 // ตั้งค่าบิตต่ำสุดของ CX เป็น 1 (ทำให้เป็นเลขคี่) EAX = ~ ECX // ดำเนินการ NOT แบบบิตกับ ECX แล้วเก็บผลลัพธ์ไว้ใน EAX EAX ^ EAX // ลบ EAX โดยการดำเนินการ XOR กับตัวเองซ้อนกัน
การจัดการสแต็กใน X# ทำได้โดยใช้ คำสั่ง `push` +และ-`pop` โดย ` +push` จะผลักค่ารีจิสเตอร์ ค่าคงที่ หรือรีจิสเตอร์ทั้งหมดลงบนสแต็ก และ-`pop` จะดึงค่ากลับไปยังรีจิสเตอร์บางตัว ค่าคงที่ทั้งหมดจะถูกผลักลงบนสแต็กในรูปแบบดับเบิลเวิร์ด เว้นแต่จะระบุไว้เป็นอย่างอื่น (ไม่รองรับการผลักไบต์เดียว)
+ ESI // ผลัก esi - EDI // ป๊อปเข้า edi + All // บันทึกรีจิสเตอร์ทั้งหมด => pushad - All // โหลดรีจิสเตอร์ทั้งหมด => popad + $ 1 badboo2 // ผลัก 0x1badboo2 ลงบนสแต็ก+ $ cafe เป็นคำ// \/ + $ babe เป็นคำ// ผลัก 0xcafebabe + # VideoMemory // ผลักค่าคงที่ VideoMemoryตัวแปร
ตัวแปรถูกกำหนดภายในเนมสเปซโดยใช้varคีย์เวิร์ด `variable` อาร์เรย์ถูกกำหนดโดยการระบุชนิดและขนาด ตัวแปรและอาร์เรย์จะมีค่าเริ่มต้นเป็นศูนย์ หากต้องการอ้างอิงถึงค่าของตัวแปร ให้ใช้จุด ('.') และหากต้องการอ้างอิงถึงที่อยู่ของตัวแปร ให้ใช้เครื่องหมายจุด ('.' @)
namespace XSharpVariables var zeroVar // ตัวแปรจะถูกกำหนดค่าเป็นศูนย์var myVar1 = $ f000beef // ตัวแปรจะถูกกำหนดค่าเป็น 0xf000beef var someString = ' Hello XSharp ! ' // ตัวแปรจะถูกกำหนดค่าเป็น 'Hello XSharp!\0', var buffer byte [ 1024 ] // ตัวแปรขนาด 1024 ไบต์ จะถูกกำหนดค่าเป็นศูนย์ 1024 ไบต์... EAX = . myVar1 // ย้ายค่าของ myVar1 (0xf000beef) ไปยัง EAX ESI = @ . someString // ย้ายที่อยู่ของ someString ไปยัง ESI CL = . someString // ย้ายอักขระตัวแรกของ someString ('H') ไปยัง CL . zeroVar = EAX // กำหนดค่า zeroVar ให้กับค่าของ EAXX# สามารถเข้าถึงที่อยู่ที่มีค่าออฟเซ็ตที่ระบุโดยใช้วงเล็บเหลี่ยมได้:
var someString = ' Hello XSharp ! ' //ตัวแปรจะถูกกำหนดค่าเป็น 'Hello XSharp!\0' ... ESI = @ . someString // โหลดที่อยู่ของ someString ไปยัง ESI CL = 'B' // ตั้งค่า CL เป็น 'B' (เขียน 'H' ใหม่ไว้ที่จุดเริ่มต้น) CH = ESI [ 1 ] // ย้ายอักขระตัวที่สอง ('E') จากสตริงไปยัง CH ESI [ 4 ] = $ 00 // สิ้นสุดสตริง//ค่าของ someString จะเป็น 'Bell' (หรือ 'Bell\0 XSharp!\0')การเปรียบเทียบ
ใน X# มีสองวิธีในการเปรียบเทียบค่า ได้แก่ การเปรียบเทียบแบบบริสุทธิ์ และการเปรียบเทียบแบบมีเงื่อนไข (if-comparison)
- การเปรียบเทียบแบบบริสุทธิ์จะเก็บผลลัพธ์ไว้ในตัวแปร FLAGS ซึ่งสามารถนำไปใช้ในภาษาแอสเซมบลีแบบดั้งเดิม หรือใช้กับ
ifคีย์เวิร์ดโดยไม่ต้องระบุสมาชิกที่ใช้ในการเปรียบเทียบ - หากการเปรียบเทียบเป็นการเปรียบเทียบสมาชิกสองคนโดยตรงหลังจาก
ifคำหลัก
ต่อไปนี้เป็นสองวิธีในการเขียนฟังก์ชันหาความยาวสตริง X# (แบบช้าstrlen) :
// วิธีที่ 1: ใช้ฟังก์ชัน เปรียบเทียบแบบบริสุทธิ์ strlen { ESI = ESP [ 4 ] // รับพอยเตอร์ไปยังสตริงที่ส่งผ่านเป็นอาร์กิวเมนต์แรกECX ^ ECX // ล้าง ECX Loop : AL = ESI [ ECX ] // รับอักขระตัวถัดไปAL ?= 0 // เป็น 0 หรือไม่? บันทึกไปยัง FLAGS ถ้า= return // ถ้า ZF ถูกตั้งค่า ให้คืนค่า ECX ++ // มิฉะนั้น ให้เพิ่มค่า ECX ไปที่Loop // วนลูป...//วิธีที่ 2: ใช้ฟังก์ชัน if strlen { ESI = ESP [ 4 ] // รับพอยเตอร์ไปยังสตริงที่ส่งผ่านเป็นอาร์กิวเมนต์แรกECX ^ ECX // ล้าง ECX Loop : AL = ESI [ ECX ] if AL = 0 return // AL = 0? return ECX ++ goto Loop // วนลูป.... }มีตัวดำเนินการเปรียบเทียบให้เลือกใช้ 6 แบบ: ตัวดำเนินการเหล่านี้สามารถใช้ได้ทั้งในการเปรียบเทียบและในลูป โปรดทราบว่ายังมี ตัวดำเนินการ AND ระดับบิตซึ่งใช้ทดสอบบิตด้วย:< > = <= >= !=
AL ?& $ 80 // ทดสอบ AL MSB ถ้า= ส่งคืน// ถ้า ZF เป็น 0 คำสั่งทดสอบให้ผลลัพธ์เป็น 0 และ MSB ไม่ได้ถูกตั้งค่าการเขียนโค้ด Cosmos
ระบบปฏิบัติการที่สร้างด้วย Cosmos นั้นพัฒนาขึ้นในลักษณะเดียวกับโปรแกรมคอนโซล .NET C# ทั่วไป มีการเพิ่มการอ้างอิงเพิ่มเติมในตอนต้นของโปรแกรมเพื่อให้สามารถเข้าถึงไลบรารีของ Cosmos ได้
ชุดเครื่องมือผู้ใช้และ Visual Studio
Cosmos User Kit เป็นส่วนหนึ่งของ Cosmos ที่ออกแบบมาเพื่อให้ผู้พัฒนาใช้งาน Cosmos ได้ง่ายขึ้นโดยใช้Microsoft Visual Studioเมื่อติดตั้งแล้ว User Kit จะเพิ่มประเภทโปรเจ็กต์ใหม่ให้กับVisual Studioเรียกว่า Cosmos Project ซึ่งเป็นเวอร์ชันที่ดัดแปลงมาจากแอปพลิเคชันคอนโซล โดยมี การเพิ่ม คอมไพเลอร์ Cosmos และโค้ดเริ่มต้นการทำงานไว้แล้ว
การรวบรวมโครงการ
เมื่อเขียนโค้ดเสร็จแล้ว สามารถคอมไพล์ได้โดยใช้ Roslyn ซึ่ง เป็นคอมไพเลอร์ ของ .NETผ่านทางMicrosoft Visual Studioหรือเครื่องมือบรรทัดคำสั่งของ .NET (dotnet)
ขั้นตอนนี้จะแปลงแอปพลิเคชันจากซอร์สโค้ดต้นฉบับ ( C#หรือภาษาอื่นๆ) ไปเป็นCommon Intermediate Language (CIL) ซึ่งเป็นภาษาตัวกลางพื้นฐานของ .NET
จากนั้นกระบวนการสร้างจะเรียกใช้ คอมไพเลอร์ IL2CPUซึ่งจะสแกนโค้ด CIL ทั้งหมดของแอปพลิเคชันอย่างเป็นระบบ (ยกเว้นโค้ดคอมไพเลอร์ Cosmos) และแปลงเป็นภาษาแอสเซมบลีสำหรับสถาปัตยกรรมโปรเซสเซอร์ที่เลือกไว้(ณ ปี 2022)โดยรองรับเฉพาะ สถาปัตยกรรม x86 เท่านั้น จากนั้น Cosmos จะเรียกใช้แอสเซมเบลอร์ที่เลือกไว้เพื่อแปลงโค้ดภาษาแอสเซมบลีนี้ให้เป็น โอเปอเรชันโค้ดของหน่วยประมวลผล กลาง (CPU) สุดท้าย ตัวเลือกเอาต์พุตที่ต้องการจะถูกเปิดใช้งาน ไม่ว่าจะเป็นการเริ่มต้นเครื่องเสมือน การเริ่มต้น เอ็นจิ้น PXEหรือการสร้างไฟล์อิมเมจดิสก์ ISO
ตัวเลือกการดีบัก
Cosmos มีตัวเลือกหลายอย่างเกี่ยวกับวิธีการติดตั้งระบบปฏิบัติการที่ได้ และวิธีการแก้ไขข้อผิดพลาดของผลลัพธ์
เวอร์ชวลไลเซชัน

Cosmos ช่วยให้ผู้ใช้สามารถบูตระบบปฏิบัติการในสภาพแวดล้อมจำลองโดยใช้เครื่องเสมือนこれによりนักพัฒนาสามารถทดสอบระบบบนคอมพิวเตอร์ของตนเองได้โดยไม่ต้องรีบูตเครื่อง ซึ่งมีข้อดีคือไม่จำเป็นต้องใช้ฮาร์ดแวร์เพิ่มเติม หรือไม่ต้องออกจากสภาพแวดล้อมการพัฒนาแบบบูรณาการ (IDE) VMware เป็นวิธีการจำลองเสมือนหลัก แต่ก็รองรับวิธีการอื่นๆ เช่นQEMUและ Hyper-V ด้วย
อิมเมจดิสก์
ตัวเลือกนี้จะเขียนระบบปฏิบัติการลงใน ไฟล์ อิมเมจดิสก์ ( ไฟล์ ISO ) ซึ่งสามารถโหลดลงในโปรแกรมจำลองบางตัว (เช่นBochs , QEMUหรือที่พบได้ทั่วไปคือ VMware ) หรือเขียนลงในแฟลชไดรฟ์ USBและบูตบนฮาร์ดแวร์จริงได้
การบูตเครือข่าย PXE
ตัวเลือกนี้อนุญาตให้ระบบปฏิบัติการบูตบนฮาร์ดแวร์จริง ข้อมูลจะถูกส่งผ่านเครือข่ายท้องถิ่น (LAN) ไปยัง เครื่อง ไคลเอ็นต์ซึ่งต้องใช้คอมพิวเตอร์สองเครื่อง: เครื่องหนึ่งเป็นเครื่องไคลเอ็นต์ (ที่ใช้บูตระบบปฏิบัติการ) และอีกเครื่องหนึ่งเป็นเครื่องเซิร์ฟเวอร์ (โดยปกติจะเป็นเครื่องสำหรับพัฒนาซอฟต์แวร์) นอกจากนี้ยังต้องมีเครือข่ายเชื่อมต่อระหว่างคอมพิวเตอร์ทั้งสองเครื่อง เครื่องไคลเอ็นต์ที่มีการ์ดเครือข่ายและระบบอินพุต/เอาต์พุตพื้นฐาน ( BIOS ) ที่สามารถบูตด้วย PXE ได้ (ข้อมูลณ ปี 2022)การดีบักผ่านเครือข่ายไม่ได้รับการสนับสนุนอีกต่อไป
ดูเพิ่มเติม
ลิงก์ภายนอก
- เว็บไซต์อย่างเป็นทางการ
- CosmosOS บนGitHub
- บทความภาพรวม Cosmos ที่ CodeProject
- กลุ่ม Cosmos Dev บน Yahoo ถูกเก็บถาวรเมื่อวันที่ 8 มกราคม 2011 ที่Wayback Machine
- เพจแฟนคลับ Cosmos บน Facebook
การรายงานข่าว
- แมรี โจ โฟลีย์ จาก ZDNet - Cosmos: กำเนิดระบบปฏิบัติการไมโครเคอร์เนลแบบโอเพนซอร์สบน .Net
- สกอตต์ แฮนเซลแมน: ระบบปฏิบัติการขนาดเล็กแบบจัดการได้ รุ่นพิเศษ