Beste antwoord
Het hangt ervan af wat je bedoelt met besturingssysteem. Ik heb ooit een eenvoudig wachtrijsysteem geschreven dat meerdere protocolsessies op een round-robin-manier zou uitvoeren. Maar het draaide onder een standaard besturingssysteem. Toen microcontrollers voor het eerst uitkwamen voor embedded systemen, schreven ingenieurs doorgaans hun eigen rudimentaire besturingssysteem, zoals aangegeven in een van de andere antwoorden.
Het kleinste bruikbare besturingssysteem dat ik heb gebruikt met de basisfuncties van een multitasking-besturingssysteem -the-shelf-systeem heette QNX. Het was een gekapt Unix-systeem en draaide op de eerste IBM-pc. Het had geen mooie graphics, maar ik kon er gemakkelijk software op ontwikkelen. In feite was het enige echte verschil met een moderne machine de gebruikersinterface met kleur en afbeeldingen. Dus in feite zette IBMs introductie van DOS de computerindustrie minstens 10 jaar terug. Er waren in die tijd een aantal superieure besturingssystemen (die hadden kunnen worden aangepast) of in ontwikkeling waren, waarbij natuurlijk Unix de norm zette.
Antwoord
Ik ben net klaar met ontwikkelen een kernel voor een klas ( CS-4284 Systems & Networking Capstone ) tijdens mijn laatste semester op school. Eerder volgde ik een OS-les die als doel heeft om met het besturingssysteem te werken vanuit het perspectief van de programmeur, en niet vanuit het perspectief van een OS-ontwerper. De afgelopen anderhalf jaar betrokken zijn bij OS- en kernelontwikkeling (het is niet een lange tijd, maar ik “heb veel geleerd), dit is wat ik aanbeveel:
1. Master C Ik kan dit niet meer benadrukken. Nee echt, meester het. OS-ontwikkeling is moeilijk. Het bevat veel concepten die je echt nodig hebt om C onder de knie te krijgen, dus het staat je niet in de weg. Neem bijvoorbeeld de Unix-pipe (getypt | in een shell). Om een pipe in uw OS te ontwikkelen, moet u het OS-bestandssysteem en de bestandsstructuur goed begrijpen. Het is een typisch probleem met begrensde buffer (consument / producent) en zal te maken hebben met alle synchronisatie. Je moet je bewust zijn van het virtuele geheugen tijdens het schrijven. Bovendien is Unix typisch BYOB (neem je eigen buffer mee). zal de buffer die de gebruiker heeft aangeleverd correct moeten beheren enz … Het laatste dat u hier “zou willen doen is om te gaan met elementaire C-problemen zoals verwijzingen en geheugenbeheer (opmerking: geheugenbeheer in het besturingssysteem is 10x moeilijker dan C-geheugenbeheer: je moet op de hoogte zijn van adresruimten tussen gebruikers en kernel)
2. Kernel vs. OS U moet het verschil begrijpen tussen een kernel en een OS. Een kernel is in wezen het brein van het besturingssysteem. Het besturingssysteem is een reeks toepassingen die samen zijn gebundeld. Mac OS X omvat bijvoorbeeld: een kernel, de interface (GUI), ingebouwde standaardtoepassingen (Finder – wat slechts een abstractie is van visualiseer het bestandssysteem, TextEdit, een shell enz …)
3. Duik er niet meteen in Het is onmogelijk om te starten kernelontwikkeling doen in een kwestie van dagen of weken. Ik stel voor dat u begint met het volgende:
- Maak uzelf vertrouwd met de GCC-compilatiestappen (wat gebeurt er als u gcc uitvoert, hoe een uitvoerbaar bestand wordt geproduceerd en gebeurt wanneer u het programma uitvoert). U kunt ook een eenvoudige assembler in C schrijven (neem assembly-code als invoer- en uitvoermachinecode. Dit vereist dat u begrijpt welke .data-, .text- en .bss-secties zijn bij het assembleren de weg om het virtuele geheugen van het besturingssysteem te begrijpen). Je begrijpt ook de adressering op machineniveau en hoe vertakkingen worden opgelost.
- Maak jezelf vertrouwd met mach tools en programmas op intern niveau. Ik stel voor om het bommenlaboratorium te doen, omdat er veel educatief materiaal voor is. Gewoon Google Bomb Lab.
- Maak uzelf vertrouwd met elementaire OS-aanvallen. Ik stel voor om naar de bufferoverloop te kijken om dezelfde reden als punt 1 (google bufferoverflow lab).
- Meer informatie over systeemaanroepen, threads en processen in C. Ontwikkel van daaruit je eigen shell in C.
- Leer meer over geheugentoewijzing en implementeer malloc en gratis in C. Leer meer over de ontwerpafwegingen, toewijzingsstrategieën, vrijmakingsstrategieën enz …
- Leer over multi-threading en multi-verwerking in C. Duik van daaruit in synchronisatiemechanismen (locks, mutexes, semaforen) en ontwikkel een threadpool in C, die andere programmas kunnen gebruiken.
4. Nu kunt u beginnen met echte maar vereenvoudigde OS-kernelontwikkeling Op dit punt kunt u beginnen met het ontwikkelen op een echt OS als OS-ontwerper. Google Stanford Pintos en je krijgt toegang tot een kleine educatieve kernel ontwikkeld op Stanford. Het wordt geleverd met documentatie en een set van 4 projecten. U kunt googlen naar sommige scholen die presentatiedias voor Pintos hebben. Ik stel voor om Operating System Concepts te kopen ( Amazon.com: Operating System Concepts (9781118063330): Abraham Silberschatz, Peter B.Galvin, Greg Gagne: Books ). De documentatie is redelijk goed en de projecten worden goed uitgelegd. Het besturingssysteem wordt ook geleverd met tests die u kunt uitvoeren door `make check` uit te voeren, zodat u kunt zien of u” dingen goed hebt gedaan of niet.
5. Je kunt beginnen bij te dragen aan Linux . Het zal veel moeite kosten om de broncode en Linux-ontwerpbeslissingen te onderzoeken (die veel gecompliceerder zijn dan die van Pintos), maar ik denk dat je op dit punt in staat zijn om op zijn minst te beginnen. Met meer oefenen en lezen, zul je het kunnen oppikken.
Ik heb zojuist stap # 4 voltooid. Ik hield van stap 1 tot en met 3, maar eerlijk gezegd realiseerde ik me halverwege 4 dat ik niet zo geïnteresseerd ben in OS-ontwikkeling. Ik vond het erg leuk om als programmeur met het besturingssysteem te werken (vanuit het perspectief van een programmeur), maar vond het niet zo leuk om dieper te graven. Ik heb echter veel geleerd van de ontwikkeling van de kernel, en het stelt je aan veel dingen bloot. Bovendien, als je een kernel kunt schrijven, schrijf je elk stukje software dat er is. Ik raad ten zeerste aan om ten minste de eerste 3 stappen uit te voeren, omdat dit u een goed inzicht in het besturingssysteem geeft. Je zult in het algemeen letterlijk een betere software-engineer worden. Je zult talen op hoog niveau meer leren waarderen en ook leren hoe je de juiste tool / taal / technologie voor de juiste baan kunt gebruiken.
Ik heb veel materiaal over OS-ontwikkeling, projecten, tests enz … Als mensen geïnteresseerd zijn, laat het me weten door te reageren en ik kan misschien een online eBook / tutorial / gids samenstellen met een testomgeving die beginners zal begeleiden bij het ontwikkelen van OS en geef projecten en feedback om aan te werken.