Bästa svaret
Det beror på vad du menar med operativsystemet. Jag skrev en gång ett enkelt kösystem som skulle utföra flera protokollsessioner på ett rund-robin-sätt. Men det kördes under ett standardoperativsystem. När mikrokontroller först kom ut för inbäddade system skrev ingenjörer vanligtvis sitt eget rudimentära operativsystem som anges i ett av de andra svaren.
Det minsta användbara operativsystem jag har använt som hade de grundläggande funktionerna i en multitasking som fungerar – hyllsystemet kallades QNX. Det var ett avskuren Unix-system och kördes på den första IBM-datorn. Den hade ingen snygg grafik men jag kunde bekvämt göra programutveckling på den. I själva verket var den enda verkliga skillnaden för en modern maskin användargränssnittet med färg och grafik. Så i grund och botten införde IBMs introduktion av DOS datorindustrin åtminstone tio år. Det fanns ett antal överlägsna operativsystem runt (som kunde ha anpassats) eller utvecklats vid den tiden, naturligtvis, Unix satte standarden.
Svar
Jag har precis avslutat utvecklingen en kärna för en klass ( CS-4284 Systems & Networking Capstone ) under min sista termin i skolan. Tidigare tog jag en OS-klass som syftar till att arbeta med operativsystemet ur programmerarens perspektiv, och inte ur ett OS-designers perspektiv. Att vara involverad i OS- och kärnutveckling under det senaste halvåret (det är inte länge, men jag har lärt mig mycket), här rekommenderar jag:
1. Master C Jag kan inte betona detta längre. Nej egentligen, behärska det. OS-utveckling är tuff. Den innehåller många koncept som du verkligen behöver för att behärska C, så det står inte i vägen. Ta till exempel Unix-röret (skrivit | i ett skal). För att utveckla ett rör i ditt operativsystem måste du förstå OS-filsystemet och filstrukturen riktigt bra. Det är ett typiskt begränsat buffertproblem (konsument / producent) och måste hantera all synkronisering. Du måste vara medveten om det virtuella minnet när du skriver det. Dessutom är Unix vanligtvis BYOB (ta med din egen buffert). måste hantera bufferten som användaren har tillhandahållit ordentligt osv … Det sista du vill göra här är att hantera grundläggande C-problem som pekare och minneshantering (Obs: minneshantering i operativsystemet är 10 gånger svårare än C-minneshantering: du måste vara medveten om användarutrymme kontra kärnadressutrymmen)
2. Kernel vs. OS Du måste förstå skillnaden mellan en kärna och ett OS. En kärna är i huvudsak operativsystemets hjärna. Operativsystemet är en uppsättning applikationer som samlas ihop. Exempelvis innehåller Mac OS X: en kärna, gränssnittet (GUI), inbyggda standardapplikationer (Finder – vilket bara är en abstraktion till visualisera filsystemet, TextEdit, ett skal etc …)
3. Dyk inte rakt in Det är omöjligt att starta gör kärnutveckling på några dagar eller veckor. Jag föreslår att du börjar med följande:
- Bekanta dig med GCC-sammanställningssteg (vad händer när du kör gcc, hur en körbar produceras och vad händer när du kör programmet. Du kan också skriva en enkel samlare i C (ta församlingskod som in- och utmatningskod för maskin. Detta kräver att du förstår vad .data-, .text- och .bss-sektionerna är i montering (mycket hjälpsamt ner vägen för att förstå OS virtuellt minne). Du kommer också att förstå adressering på maskinnivå och hur filialer löses.
- Bekanta dig med mach verktyg och program på ine-nivå. Jag föreslår att jag gör bomblaboratoriet, för det finns många läromedel för det. Bara google bomb lab.
- Bekanta dig med grundläggande OS-attacker. Jag föreslår att du tittar på buffertöverflödet av samma anledning som punkt 1 (google buffertöverflödeslaboratorium).
- Lär dig mer om systemanrop, trådar och processer i C. Därifrån utvecklar du ditt eget skal i C.
- Lär dig mer om minnesallokering och implementera malloc och gratis i C. Lär dig mer om designavvägningar, fördelningsstrategier, frigöringsstrategier etc …
- Lär dig mer om multitrådning och multibearbetning i C. Därifrån kan du dyka in i synkroniseringsmekanismer (lås, mutexes, semaforer) och utveckla en trådpool i C som andra program kan använda.
4. Nu kan du starta riktig men förenklad OS-kärnutveckling Vid denna tidpunkt kan du börja utveckla på ett riktigt OS som OS-designer. Google Stanford Pintos och du får tillgång till en liten pedagogisk kärna utvecklad i Stanford. Den levereras med dokumentation och en uppsättning av fyra projekt. Du kan google för vissa skolor som har föreläsningsbilder för Pintos. Jag föreslår att du köper operativsystemkoncept ( Amazon.com: Operativsystemkoncept (9781118063330): Abraham Silberschatz, Peter B.Galvin, Greg Gagne: Böcker ). Dokumentationen är ganska bra och projekten förklaras väl. Operativsystemet kommer också med tester som du kan köra genom att köra ”make check”, så att du kan se om du ”har gjort saker ordentligt eller inte.
5. Du kan börja bidra till Linux Det kommer att krävas en hel del ansträngningar för att undersöka källkoden och Linux-designbeslut (som är mycket mer komplicerade än Pintos), men jag tror att nu kommer du kunna åtminstone börja. Med mer övning och läsning kan du plocka upp det.
Jag har precis slutfört steg 4. Jag älskade steg 1 till 3, men uppriktigt sagt, halvvägs genom 4, insåg jag att jag inte är så intresserad av OS-utveckling. Jag tyckte mycket om att arbeta med operativsystemet som programmerare (ur ett programmerares perspektiv), men tyckte inte att gräva djupare lika mycket. Jag lärde mig mycket av kärnutvecklingen men det utsätter dig för många saker. Dessutom, om du kan skriva en kärna, skriver du vilken programvara som helst där ute. Jag rekommenderar starkt att du gör åtminstone de första 3 stegen, eftersom det ger dig god inblick i operativsystemet. Du kommer bokstavligen att bli en bättre mjukvaruutvecklare totalt sett. Du kommer att lära dig att uppskatta språk på hög nivå mer och lära dig hur du använder rätt verktyg / språk / teknik för rätt jobb också.
Jag har mycket material om OS-utveckling, projekt, test etc … Om folk är intresserade, låt mig veta genom att kommentera och jag kan kanske sätta ihop en online-e-bok / handledning / guide med en testmiljö som kommer att vägleda nybörjare till OS-utveckling och ge projekt och feedback att arbeta med.