Cum sa iti construiesti propriul OS

Categorii: Programare

13-Mar-2014 17:42 - 1305 vizionari

OS este prescurtarea de la sistem de operare (operating system), adica un pachet de programe de calculator.

Fara un OS un calculator este inutilizabil: calculatorul porneste, face niste teste si afiseaza pe ecran detalii privind starea componentelor sale, apoi afiseaza un mesaj de atentionare sau de eroare informand utilizatorul ca nu a gasit nici un OS sau ca nu poate porni nici un OS.

Probabil cel mai popular OS este Unix si derivatele lui, dar cand este vorba de popularitate nu trebuie neglijat nici Windows cu toate varianele.
Dar in mod sigur cel mai bun sistem de operare este Unix-ul in toate variantele moderne.
Multics avea multitasking in 1964.
Unix este un sistem de operare multiuser si multitasking aparut prin anii 70.
Ca o comparatie, MS DOS suporta numai un singur utilzator, nu executa mai multe program in paralel si a aparut 10 ani mai tarziu, prin anii 1980.
Windows 2.1 a aparut in 1988 si avea un multitasking cooperativ (usor de implementat, robust si predictibil).
Iar MacOS pana in 2001 nu a avut multitasking, dar asta nu l-a impiedicat sa fie popular.

Orice calculator, de la calculator personal la server dedicat, necesita un OS.

De ce sa iti construiesti propriul OS cand exista deja sute de variante?
Pentru ca presupune un efort intelectual si o consider o provocare de programare (creierul trebuie antrenat permanent).
Pentru ca ajuta un utilizator de calculatoare sa isi repare singur calculatorul defect.
Ideea este ca jucand numai jocuri nu vei putea nici macar sa instalezi un sistem de operare si de reparat unul defect nici nu poate fi vorba.

Privind constructia unui OS exista suficiente resurse in Internet si in cateva zile am reusit sa construiesc cateva solutii functionale, nu numai concepte emise in scop didactic.

Prima solutie functionala este oferita de Brandon Friesen, am gasit-o la osdever.net si foloseste limbajul de asamblare + limbajul C.
Ironia sortii a facut ca exemplul de sistem de operare al lui Brandon Friesen sa fie compilat cu succes numai in MS DOS.
Consider ironic faptul ca am folosit un sistem de operare vechi de 20 de ani.
Prin 1995 aparea Microsoft Windows 95 si MS DOS-ul nu mai era folosit decat de nostalgici.
Orice alta solutie de sistem de operare (Windows sau Linux) si compilator (gcc), in afara de DOS, nu a reusit sa construisca exemplul de OS al lui Brandon Friesen.
Dupa cateva zile de teste am reusit si pe Linux, dar varianta in DOS a inceput sa functioneze in cateva ore datorita pregatirii contextului (am folosit dosbox in Windows 7 64 biti, pentru ca nu prea mai exista calculatoare moderne care sa mearga in DOS) si instalarii utilitarelor necesare (DJGPP si nasm).

A doua solutie care a functionat si am construit-o din surse relativ repede este Mike OS si foloseste 100% limbaj de asamblare, are un sistem de fisiere (FAT12 pe discheta) si un interpretor original de BASIC. Mike OS poate porni programe scrise in BASIC sau in asm, gasite pe discheta sistemului.
A trebuit sa adaptez un pic procedura de constructie a sistemului datorita lipsei unui program esential (PartCopy) pe care l-am inlocuit cu altul (dd).
Am gasit programul PartCopy, dar fiind o varianta mai noua, nu se potrivea cu programul de construire Mike OS.

Alta solutie interesanta se numeste blacklight-os si este bazata pe Mike OS, suporta FAT12 si FAT16 si vine cu ceva utilitare interesante, dar Mike OS este mai folositor avand aplicabilitate practica.

O solutie interesanta se numeste os-dev-16, care vine cu propriul sistem de fisiere si este util pentru incepatori.

Un sistem cu un singur kernel, pe care am reusit sa-l compilez, dar nu am reusit sa-l pornesc, este gasit cu Google: LowEST_Kern.
Contine idei interesante demne de toata admiratia.

Dar cel mai tare sistem de operare minimal este BareMetal de la http://www.returninfinity.com/
Este conceput 100% in asamblare pe 64 biti, suporta doua tipuri de placi de retea (Intel i8254x si Realtek rtl8169) si este singurul care are multitasking si care detecteaza si foloseste mai multe procesoare daca sunt prezente in calculator.

Exista doua variante privind constructia unui OS:
Prima varianta consta in 100% limbaj de asamblare si este preferata de programatori.
A doua varianta foloseste un program de incarcare a sistemului in asamblare, iar restul este scris in limbajul C.
Dintre variantele testate de mine, numai tutorialul lui Brandon Friesen foloseste asm + C.

Programatorii evita dezvoltarea in C a sistemului minimal datorita complexitatii proiectului.
La prima vedere programarea in C este simpla si rapida, dar asta este valabil numai intr-un sistem de operare deja existent.
In realitate, la constructia minimala a unui OS, nu ai suport C si trebuie sa adaptezi suportul C potrivit sistemului tau: un compilator C cu bibliotecile de functii necesare sau un compilator C fara nici o biblioteca de functii, dar la care trebuie sa creezi minimul de functii de sistem de la zero.

Pentru suportul in limbajul C sistemul minimal trebuie sa respecte standardul posix din motive de portabilitate, trebuie sa creeze Newlib specific sistemului construit si sa isi compileze propriul compilator de C bazat pe bibliotecile posix si Newlib implementate. Abea acum se pot dezvolta in mod firesc programe scrise in C pentru noul OS.

Se pare ca BareMetal are sistemul de operare (nucleul sau kernelul) in asm si aplicatiile pot fi compilate in asm sau C, pentru ca am gasit definitia Newlib in sursele sale.
Posix este un standard recomandat, dar nu obligatoriu de implementat.

Am pierdut cateva zile fara succes ca sa construiesc un OS bazat pe C, insistand cu incapatanare ca, daca tutorialul lui Brandon Friesen functioneaza, trebuie sa reusesc si eu sa fac unul asemanator.
Am gasit cateva corectii la tutorialul lui Brandon Friesen si una din ele am intuit-o, dar am rezolvat-o prin alta metoda.

In concluzie studiul catorva sisteme minimale de operare mi-a dat idei cum sa imi construiesc propriul OS.
Nu ma astept sa inlocuiesc Unix, Linux, *BSD, dar pentru o vreme ma amagesc cu programarea OS.

Alte surse si resurse:
Tutorialul lui Brandon Friesen - http://www.osdever.net/tutorials/view/brans-kernel-development-tutorial – excelent pentru uz didactic, greu de extins in practica.
MikeOS - http://mikeos.berlios.de/
BareMetal OS - http://www.returninfinity.com/baremetal.html – cel mai bun sistem minimal
Menuet OS - http://www.menuetos.net/ – scris numnai in asm 32 si 64 biti, nu supoprta posix, are mod grafic, suport LAN si Internet.
Temple OS - http://www.templeos.org/ – un sistem probabil enervant
Blacklight OS - http://code.google.com/p/blacklight-os/source/browse/
Kryos (c) Michael Lazear – Google: Kryos Michael Lazear
Posibil un Mike OS pe 32 de biti la http://board.flatassembler.net/topic.php?t=12381 si http://mikegonta.com/MikeOS32.zip, dar pagina ofera numai gcc_x86_64_elf pentru Windows.
Haiku OS - http://www.haiku-os.org/ – kernel preemptibil, modular si compatibil posix cu mod grafic asemanator cu BeOS si multe aplicatii utile
Tutoriale - http://www.osdever.net/tutorials/
Tutoriale - http://www.codeproject.com/Articles/39027/Beginning-Operating-System-Development-Part-One
Tutoriale - http://wiki.osdev.org/
Multe multe proiecte la osdev.org -  http://wiki.osdev.org/Projects

Trebuie sa recunosc ca am recompilat Linux si OpenBSD de sute de ori si, de cateva ori, le-am schimbat un pic (avantajul open source) ca sa rezolve o problema existenta sau sa aflu mai multe informatii privind contextul de executie al sistemului, dar sa construiesc un sistem de la zero este ceva nou pentru mine.

As mai putea sa studiez Minix sau sursele Linux 1.0, deja am sursele Unix System 6

Ce am invatat din studiul sistemelor OS minimale sub Windows:

In Unix (Linux, Openbsd, etc.) dezvoltarea aplicatiilor functioneaza 99% perfect pentru ca solutiile sunt concepute si testate pe Unix, iar Unix-urile gratuite (open source) au compilatoare robuste si mature, iar programatorii se bazeaza pe asta.

Am invatat sa apreciez Qemu, pentru ca l-am folosit sa porneasca sistemele minimale. De obicei folosesc VirtualBox, dar Qemu este suficient de rapid pentru simulare pornire OS.

Am inteles mai bine logica de pornire din floppy si hdd folosind un program numit bootsector sau bootloader.

Am invatat sa folosesc imdisk din linia de comanda ca sa montez imagini de hard-diskuri si floppy.

Majoritatea compilatoarelor de C, din motive de simplitate, construiesc si presupun ca programul cu datele sunt in acelasi segment (segmenul de date = segmentul de cod = segmentul de stiva) si nu sunt potrivite pentru sisteme OS minimale.

Programarea in asm folosind blocuri si segmente de memorie este complicata, programatorii preferand sa foloseasca blocuri mari de memorie nesegmentate (flat memory) si asta presupune programare in asm pe 64 de biti.
Programarea fara segmente de memorie in 32 de biti merge pentru maxim 4 Giga RAM, dar calculatoarele moderne suporta mai multa memorie si, de aceea, este sugerata folosirea asm 64.
Se folosesc blocuri de 64k in 16 biti, blocuri de 4Giga in 32 biti si blocuri incredibil de mari (teoretic 16 milioane de tera = 16 exa ) si imposibil de atins cu echipamentele actuale in 64 de biti – vezi Activarea A20.

In facultate (prin 1995) am creat un sistem de multitasking cooperativ in DOS folosind un sistem simplu in care programele comutau de la un task la altul salvand contexul de executie printr-o functie comuna tuturor taskurilor, dar acum am invatat, din sugestiile privind sistemul OS minimal, sa pot face si un multitasking preemtiv.

Sistemul proiectat de Brandon Friesen este foarte robust: m-a infomat de toate greselile facute de mine in incercarea (nereusita pana acum) de extindere a sistemului cu functii noi.

Proiectarea unui sistem OS minimal este o experienta deosebita si reprezinta provocarea suprema pentru un programator.



Ultimele pagini: RSS

Alte adrese de Internet

Categorii

Istoric



Contorizari incepand cu 9 iunie 2014:
Flag Counter

Atentie: Continutul acestui server reprezinta ideile mele si acestea pot fi gresite.