Kezdő lépések
On október 2, 2021 by adminElőször is, egy operációs rendszer fejlesztése valószínűleg az egyik legnagyobb kihívást jelentő dolog, amit egy számítógépen tehetsz (a Doom utolsó főnökének Nightmare nehézségi szinten való megölése mellett). Egy operációs rendszer összeállítása rengeteg tudást igényel az informatikán belül számos összetett területről. Meg kell értened, hogyan működik a hardver, és tudnod kell olvasni és írni az összetett assembly nyelvet, valamint egy magasabb szintű nyelvet (például C, C++ vagy Pascal). Az elmédnek képesnek kell lennie arra, hogy absztrakt elméletek köré fonódjon, és számtalan gondolatot tartson magában. Elbátortalanodtál már? Ne félj! Mert mindezek a dolgok azok is, amelyek szórakoztatóvá és szórakoztatóvá teszik az operációs rendszer programozását.
Nincs is jobb érzés, mint a beteljesülés érzése, amikor végre, órákig tartó küzdelem után megoldod a problémát. És egy idő után visszanézhetsz, és láthatod mindazt, amit a semmiből hoztál létre. A kézzel írt rendszered képes bootolni, varázsol a hardverrel szemben, és a felhasználónak felhasználói felületet és programokat ad, amelyekkel játszhat.
Nincs abszolút út, amelyen végig kell menni egy operációs rendszer létrehozásakor. Miután a kezdeti rendszeredet felállítod és működőképessé teszed (és ezt úgy teszed, hogy megfelelő oktatóprogramokat találsz), te választod meg az utat, amelyen a továbbiakban haladni szeretnél. A te operációs rendszered pontosan az – a tiéd. Öné a végső irányítás, és a határ a csillagos ég!
Intartalom
- 1 A kemény igazság
- 2 Felelősség
- 3 Szükséges tudás
- 4 Szervezd meg a terveidet
- 5 A fejlesztési környezet kiválasztása
- 5.1 GNU/Linux
- 5.2 Windows
- 5.3 MacOS
- 6 Az operációs rendszer tesztelése
- 7 A kód védelme
- 8 Közös kiindulási pontok
- 9 További ismeretek megszerzése
- 10 Lásd még
- 10.1 Cikkek
- 10.2 Szálak
- 10.3 Külső hivatkozások
A kemény igazság
Az alapvető tény, hogy az operációs rendszer fejlesztése bonyolult és folyamatos folyamat, remélhetőleg nem tántorít el. Az igazság az, hogy az operációs rendszerfejlesztés valóban páratlan, mivel a lehető legnagyobb türelmet és gondos kódtervezést igényli, és nagyon kevéssé vagy egyáltalán nem adja vissza az olyan dolgok, mint a játékok és a webes szkriptek fejlesztése során kapott “azonnali elégedettséget”.
Meglehetősen figyelmeztettünk az előtted álló nehéz munkára, de ha még mindig érdekel, akkor haladj tovább az operációs rendszerprogramozó birodalmába. Készülj fel az időnkénti zavarodottságra, csüggedésre, és néhányunk számára… átmeneti őrületre. Idővel és kellő elkötelezettséggel azon kevesek elitjébe fogsz tartozni, akik hozzájárultak egy működő operációs rendszerhez. Ha mégis elkedvetlenedne az út során, frissítse fel magát e könyv tartalmával. Remélhetőleg emlékeztetni fog arra, hogy miért is kezdett bele egy ilyen őrült utazásba.
Ebben a szakaszban érdemes elolvasni a Kezdők hibái oldalt is. A fórum felhasználói észrevették, hogy sok ilyen hiba ismétlődik idővel, és ezek elkerülése nagyszerű módja annak, hogy ne csinálj magadból hülyét.
Felelősség
Az emberek hajlamosak azt állítani, hogy nem baj, ha nem hatékony szoftvereket írsz, mondván, hogy a számítógépes rendszerek manapság olyan gyorsak, hogy nem fogod észrevenni a hatását. Ez a fajta mentalitás veszélyes az operációs rendszerek tervezésében. Lehet, hogy egy egyszerű alkalmazás készítésekor nem baj, ha hanyag kódot írunk, de ha olyan kritikus kódról van szó, amelyet másodpercenként több ezer alkalommal hívnak meg, akkor ki kell vennünk minden lehetséges rezsiköltséget. Az operációs rendszernek alapvető erőforrásként kell ellátnia a számítógépet a futó alkalmazások számára, a lehető legkevesebb bonyodalommal, absztrakcióval és overheaddel.
Az operációs rendszereket tervező emberek napjainkban és korunkban hajlamosak a “mindent, kivéve a konyhai mosogatót” mentalitásra. Vállalják, hogy mindent figyelembe vesznek, ami persze jó, de nem szabad, hogy ez a rosszul megírt programok virágzásának rovására menjen. Sok minden történik “a motorháztető alatt”, amikor programhibák fordulnak elő. A rosszul megírt programok értékes végrehajtási időbe kerülnek, és olyan feladatváltásokkal járnak, amelyek mind memóriában, mind frekvenciában drágák. Arra bátorítjuk, hogy a rosszul megírt szoftverek használatát akadályozza meg.
Szükséges ismeretek
Fő cikk: Szükséges tudás
Ha úgy gondolod, hogy ezt átugorhatod, akkor ez csak neked szól.
Ezt a részt külön oldalra helyeztük át, mert a fórumbeszélgetésekben olyan gyakran hivatkoznak rá.
Szervezd meg a terveidet
Mielőtt továbblépsz, gondold át, hogy mi az, amit szeretnél elérni egy operációs rendszer megírásával. Mi motiválja, hogy belevágjon ebbe a projektbe? Számos lehetséges oka lehet annak, hogy egy hobbi operációs rendszer projektet vállalj, és a legtöbb os-fejlesztőnek egynél több oka is van. Az is elég lehet, ha csak annyit mondasz, hogy “csak szeretném”, bár minél jobban átgondolod és tisztázod a céljaidat és a motivációidat, annál inkább arra tudsz összpontosítani, amit valóban akarsz.
Légy őszinte magaddal is. Nem szégyen, ha nagyobb ambícióid vannak a projekteddel kapcsolatban, még akkor sem (vagy különösen akkor nem, ha nem ez az elsődleges célod. Próbáld meg elismerni az összes célodat, ne csak azt, amelyikről úgy gondolod, hogy a fő célod.
Próbálj meg megállapodni abban, hogy az operációs rendszer tervezésének mely aspektusai érdekelnek leginkább, vagy melyeken látod szükségét, hogy dolgozz. Az operációs rendszerek fejlesztésének nagy része, különösen az elején, a kernel tervezése és fejlesztése, de maga a kernel a legtöbb operációs rendszernek csak egy kis része; ha az elsődleges érdeklődési köröd a UX, vagy a hálózatépítés, vagy a meghajtóprogramozás, akkor el kell gondolkodnod azon, hogy valóban szükséged van-e (most vagy a jövőben) arra, hogy egyáltalán saját operációs rendszert írj, vagy ugyanolyan elégedett lennél, ha ezeket a dolgokat egy meglévő kernelre fejlesztenéd. Nem kevés ember kezdett el OS-fejlesztésbe, amikor valójában egy asztali környezetet akartak tervezni, ezért ezt a kérdést nagyon fontos feltenned magadnak.
Próbálj meg gondolkodni olyan nem OS-projekteken, amelyeket először vagy ezzel egy időben szeretnél elvállalni, különösen olyanokon, amelyek gyakorlatként vagy felkészülésként szolgálhatnak az OS-projekthez. Általában nincs szükség arra, hogy most rögtön az OS-projekten dolgozz, és minél jobban felkészültél előre, annál jobban jársz (legalábbis egy bizonyos pontig – a felkészülés egy dolog, a halogatás valami más).
Hasonlóképpen, ha egy meglévő design forkolásán akarsz dolgozni, hogy kísérletezz vele, vagy hogy valamilyen konkrét célra módosítsd, akkor inkább erre koncentrálj, mint az általános fejlesztési kérdésekre. Gondold át, hogy a meglévő kódbázis mely részeire lesz szükséged, és melyeket szeretnéd megváltoztatni.
Próbáld meg kidolgozni néhány konkrét projektcélodat, és készülj fel arra, hogy külön projekteket tervezz, ha ez segít. Ha egyszerűen csak babrálni akarsz, és meglátod, hova vezet, az rendben van; ha az a szándékod, hogy megdöntsd a Microsoftot, az is rendben van (bár valószínűleg irreális). Ha már tudja, hogy mit akar tenni, akkor a részleteket konkrét célokra bonthatja, és kidolgozhatja, hogy mi szükséges ezek eléréséhez. Ne próbálj meg túl sok eltérő célt egy projektbe erőltetni – ha különböző dolgokat akarsz kipróbálni egymásnak ellentmondó célokkal, oszd szét őket különböző projektekre.
Segíthet, ha leírsz egy áttekintést a tervezett operációs rendszer tervéről, minden olyan konkrét követelménnyel vagy részlettel, amit figyelemre méltónak érzel, vagy ami tisztázhatja, hogy miben van szükséged segítségre, és ha tudod, add hozzá a nyilvános adattáradhoz. Ez nem csak megkönnyíti mások számára, hogy segítsenek neked, de segít rendszerezni és stabilizálni a terveidet, hasonlóan ahhoz, mintha vázlatot írnál egy történethez vagy dolgozathoz. Készülj fel arra, hogy a céljaid és terveid változása során karbantartod, de tarts meg egy másolatot a régebbi változatokról (vagy még jobb, ha a dokumentumot verziószabályozás alatt tartod), hogy láthasd, hogyan fejlődik a munkád az idő múlásával.
Végül nézd át, mennyi időt és erőforrást igényel majd a projekt, és döntsd el, hogy ezek megvalósíthatók-e! Ha tudja, hogy csak bizonyos mennyiségű időt tud a projektre fordítani, vegye ezt figyelembe, és bármit is tesz, ne vállaljon külső határidőt, még akkor sem, ha biztos benne, hogy el tudja érni. Az operációs rendszer fejlesztése időt vesz igénybe – sok időt -, és az, hogy egy teljes operációs rendszer projektet egy félév alatt próbálj meg befejezni, nem reális.
A fejlesztőkörnyezet kiválasztása
Szükséged van egy platformra, amelyen az új rendszeredet fejleszted. Az általános számítástechnikai trendeket követve a legnépszerűbb a GNU/Linux, de sokan használják a Windowst is. A GNU/Linux rendszert használó fejlesztők némi előnyt élveznek az eszközök elérhetőségében, de ez megoldható Windowson egy olyan rendszerrel, mint a Cygwin vagy a MinGW.
- Binutils: Alapvető eszközök az objektumfájlok manipulálásához.
- GCC: A GNU Compiler Collection. A GCC többek között C, C++, Fortran és Ada fordítóprogramokat tartalmaz.
- Make: A build folyamat automatizálására, ami akkor válik igazán hasznossá, ha több mint egy maréknyi fájlod van.
- Grep és sed: Erőteljesebb keresések és keresés-helyettesítések elvégzéséhez (hasznos, ha táblákat töltünk ki adatokkal).
- Diffutils: Hihetetlenül hasznos két fájl közötti különbségek kimutatására.
- Perl vagy Python: E két szkriptnyelv valamelyikét telepíteni kell. Hasznos többek között a karakterláncok manipulálásához. Régebben a Perl volt az ajánlás, de a Python már eléggé kiforrott, és talán könnyebb megtanulni. Mindkettőhöz több száz csomag/modul áll rendelkezésre különböző feladatok elvégzéséhez.
- Assembler: Például NASM vagy GAS. Ez a cél CPU architektúrától függően változik.
- Egy szerkesztő: Az Assembly, C és egyéb (kód)fájlok írásához.
Lehet, hogy nem használod mindezeket az eszközöket, de a legjobb, ha “a biztonság kedvéért” kéznél vannak, és tudod, hogyan kell használni őket, akár alapszinten is. De ha úgy döntöttél, hogy egy másik nyelvet használsz, akkor az eszközkészítés nagyrészt rajtad múlik, és lehet, hogy a fenti lista egyszerűen nem fog segíteni neked semmilyen módon. Az alábbiakban a főként a C/C++ vagy Assembly fejlesztőkre vonatkozó információk következnek.
GNU/Linux
Az operációs rendszerek fejlesztéséhez leginkább ajánlott rendszer a GNU/Linux. GNU/Linux használatakor a legtöbb GNU fejlesztőeszköz valószínűleg már jelen van. Ha nem, használd a disztribúciód csomagkezelő eszközeit (APT, RPM, Portage, Pacman, Apk stb.), hogy szükség szerint telepítsd őket. Ismét egy keresztkompiláló készítése szükséges, hogy ne linkelje be a fejlesztőrendszer futásidejű fájljait.
A gyakori szerkesztők a Vim, Emacs, KDevelop, Komodo Edit stb. Egyesek IDE helyett a könnyűszerkesztőket részesítik előnyben, mint például a gedit, a Geany és a SciTE. Sokan kedvelik a Midnight Commander-t, amely egy szöveges felhasználói felülettel és egy beépített szerkesztővel (mcedit) rendelkezik, ezért rendkívül könnyű és villámgyors.
Azzal kapcsolatban, hogy melyik disztribúciót érdemes használni, tekintse meg a Linux disztribúciók listáját. Mindenféle formában és méretben jöttek, és nem mindegyik alkalmas kernelfejlesztésre. Ne használjon olyan disztribúciót, amelynek konkrét célja van, mint például a biztonság (Kali, Qubes, BackTrack, Parrot stb.), tudományos alkalmazások (pl. Scientific), tűzfalak és útválasztás (pl. DD-WRT), rendszer helyreállítás vagy beágyazott környezet (Knoppix, Rescatux, TinyCore) vagy kifejezetten kezdőknek szóló (mint a Linux Mint, Nitrux stb.) Bár egy kezdőbarát Linux is megteszi, válasszon egy általános célú disztribúciót. Használj olyan disztribúciót is, amely naprakész csomagokkal rendelkezik, a legjobb, ha olyat választasz, amely rolling-release-t használ. A Debian könnyen használható, de gyakran szállítanak régi, és javított verziókat (az eszközök nem biztos, hogy a leírtak szerint viselkednek). Sok kezdő szereti az Ubuntut, ami rendben van, de a hírek szerint problémái vannak egyes eszközláncokkal és fordítási környezetekkel (ha saját cross-compilert fordítasz, ahelyett, hogy egy telepítettet használnál, ez nem probléma).
A legjobb disztrók kernelfejlesztéshez (de ne feledd, hogy ez is személyes ízlés kérdése, így ezek a disztrók nem kötelezőek inkább javasoltak, és általában némi tapasztalatot igényelnek): Arch, Gentoo, Solus, Slackware, void stb. még a Puppy is.
Ha bizonytalan vagy, próbáld ki az Ubuntut vagy a Manjaro-t.
Windows
A szükséges eszközökhöz érdemes telepíteni a Cygwin környezetet. A MinGW vagy a DJGPP alternatívák, de az MSYS2 erősen ajánlott, mivel ez a legteljesebb és legkompatibilisebb környezet, és csomagkezelőt is tartalmaz a könyvtárak és eszközök telepítéséhez.
A Microsoft nemrég (a cikk írásakor) kiadta a Windows Subsystem for Linuxot a Windows 10 opcionális funkciójaként. Ez lényegében egy valódi Ubuntu parancssoros disztribúció, amely a Windows tetején fut VM használata NÉLKÜL. A legújabb GCC és Binutils (6.1.0 és 2.27 a cikk írásakor) fordít és működik megfelelően ebben a környezetben. A Bash shell segítségével a /mnt/<drive letter>-n keresztül érheti el a Windows merevlemezeit. Ennek a megoldásnak az az előnye, hogy bármilyen Windows vagy Linux eszközzel dolgozhatsz, amire szükséged van, anélkül, hogy ki kellene derítened, hogy működnek-e a Cygwinben. Sok szükséges eszköz telepíthető az “apt-get” segítségével.
A fentiekhez erősen ajánlott keresztfordítót készíteni, nemcsak azért, mert az alapértelmezett fordítók különböző futtatható formátumokat céloznak meg, hanem mert ez általában jó ötlet. A részletekért és az utasításokért nézd meg a GCC Cross-Compiler oldalát.
Szükséged lesz egy szerkesztőre is. A Notepad használata is működik, de egyszerűbb, ha van egy teljesebb szerkesztője. Például a Notepad++ vagy a Notepad2 programot sokan használják. Ha otthonosan mozogsz a Unix-szerkesztőkkel, választhatsz egyet a Cygwin által biztosított választékból (amely tartalmazza pl. a Vim-et és az Emacs-et, amelyekhez némi megszokást igényel, de nagyon hatékonyak).
A Visual Studio vagy az ingyenesen letölthető Visual C++ Express Edition használata is lehetséges az operációs rendszer megírásához és lefordításához. Ehhez egy speciális konfigurációs fájlra lesz szükséged, és biztosan kisebbségben leszel, de elég jól működik. Még a Windows SDK-t is telepítheted rá, ami lehetővé teszi a 64 bites fejlesztést. Az egyetlen buktató, hogy ez nem támogatja az Inline Assembly-t.
Más eszközök, például a Watcom vagy a Borland is használható, de mindegyiknek sajátos követelményei vannak, és nem széles körben használják ilyen jellegű munkára.
MacOS
Mivel a motorháztető alatt a FreeBSD userlandjét használja, teljesen POSIX kompatibilis. Az összes szokásos eszköz rendelkezésre áll (vi, bash, dd, cat, sed, tar, cpio, stb.) Szinte minden oktatóprogram out-of-the-box működik. A hiányzó eszközök többnyire fájlrendszerrel kapcsolatosak: nincs loopback device, nincs fdisk, nincs mkfs.vfat és mtools. De ezekre a célokra használhatod a diskutil-t, vagy a brew vagy a macports segítségével telepítheted ezeket a hiányzó eszközöket.
A gcc beszerzéséhez a régebbi verziókhoz a 2. telepítő DVD-n volt egy mpkg. Az újabb MacOS verziók (10.13 és újabb) telepíthetik a parancssori XCode-ot (nem az IDE-t, csak az eszköztárat) az “xcode-select –install” futtatásával a Terminálból. Ez telepíti a gcc-t, a binutils-t és a make-t. Ez a gcc valójában egy masquaraded CLang, de elég gazdag ahhoz, hogy problémamentesen elkészíthesse a saját cross-compilerét. Előnyösebb a hivatalos fordítót használni a gcc bootolásához, mint telepíteni egyet a brew-ból vagy a macports-ból.
Az operációs rendszer tesztelése
Fő cikk: Tesztelés
A fenti cikk részletesen foglalkozik az operációs rendszer tesztelésének kiválasztásával és annak a fejlesztési folyamatba való integrálásával. Mind a fizikai, mind az emulált tesztelési környezeteket tárgyalja.
A kód védelme
A kódépítés során több száz, akár több ezer sornyi kódot fog írni. Kimondhatatlanul sok órát fogsz eltölteni, és késő éjjel is fenn fogsz ülni kódolni, amikor valójában ágyba kéne feküdnöd. Az utolsó dolog, amire szüksége van, az egy lemezösszeomlás, vagy egy rosszul megírt ‘rm’ vagy ‘format’ parancs, ami az összes munkáját eldobja.
Amire szüksége van, az egy verziókezelő rendszer. A CVS-t már évek óta használják, de az utóbbi időben nagy konkurenciát kapott a Subversion, a Bazaar, a Mercurial és a Git által. Ha van rá lehetőséged, érdemes egy távoli számítógépet vagy szervert beállítani verziókezelő szerverként, de ha nem áll rendelkezésedre ilyen gép, akkor a verziókezelő rendszert a helyi fejlesztőgépeden is elhelyezheted. Csak ne felejtsen el időnként biztonsági másolatot készíteni a kódjáról CD-re vagy FTP-re.
Nem tudjuk eléggé hangsúlyozni ezt a pontot: ha még nem használ forráskód-ellenőrzést, akkor azonnal kezdje el. Csak egyszer kell komoly hibát elkövetnie a kódjában ahhoz, hogy rájöjjön, milyen fontos, hogy a kódja biztonságosan verziózott és könnyen visszakereshető legyen. Bár egy kis, privát hobbiprojekt esetében túlzásnak tűnhet, ha egyszer megszokja a revíziós vezérlés használatát, csodálkozni fog, hogy valaha is boldogult nélküle.
A Githez létrehozhatja projektjét a GitHubon. A Bitbucket szintén jó alternatíva, mivel támogatja a Git-et és a Mercurial-t is. Mindkettőhöz ingyenes, privát adattár tartozik.
A hálózaton elérhető adattárban történő verziókezelő használatának további előnye, hogy sokkal könnyebbé teszi a másokkal való együttműködést és a másoktól való segítséget. Ez nagyon hasznos lehet, különösen a fórumokon, mivel így elkerülhető, hogy a kódod frissített verzióit folyamatosan egy üzenetszálba küldd – egyszerűen a beszélgetést az adattárad felé irányítod, és a témában résztvevőknek közvetlen hozzáférésük lesz a legfrissebb változtatásaidhoz. Ez akkor is kulcsfontosságú, ha a projekt növekedésével együtt kezdesz dolgozni más fejlesztőkkel a projektben (csak ne várd el, hogy ez egyik napról a másikra megtörténjen).
Közös kiindulópontok
A legegyszerűbb módja annak, hogy egy “hello world” kernel elinduljon, a Bare Bones bemutató. Egy másik megközelítés az lenne, ha megtanulnánk, hogyan indul el maga a számítógép, a Boot Sequence oldalon.
Még sok más oktatóanyag is elérhető.
További tudás megszerzése
Az interneten ma már elképesztő mennyiségű tudás érhető el az operációs rendszer fejlesztéséről. Csak meg kell találni. Először is ott van maga ez a wiki. Többek között rengeteg tutorial van benne. Ha már itt vagy, valószínűleg már megtaláltad. Szintén ezen az oldalon található a fórum, ahol sok fejlesztő lóg és tud segíteni neked (de előtte mindenképpen olvasd el a How To Ask Questions (Hogyan tegyél fel kérdéseket) című részt). Elég sok könyvet írtak az operációs rendszerfejlesztésről. Ezek közül számos megtalálható a Könyvek oldalunkon, és még több az osdever.net oldalon is.
Vélemény, hozzászólás?