A jelen hello világ - összeszerelő, szerelő, cikkek, programozás - programozás c,
Hogyan kezdődik az új programozási nyelv (vagy környezet) tanulása? Egy egyszerű program írása, amely rövid üdvözlést mutat, mint a "Hello World!". Például a C számára ez a következőképpen néz ki:
Ez indikatív, de teljesen érdektelen. A program természetesen működik, üdvözli a hangját; de ez teljes operációs rendszert igényel! És mi lenne, ha olyan programot akarok írni, amelyre nincs szükség? Beszúrunk egy floppy lemezt a számítógépbe, indítunk belőle és. "Hello World"! Még üdvözölheti ezt a üdvözlést a védett módból ...
Amint mondtam, mint kész. Hol kezdjem. A tudás megszerzése természetesen. Ehhez nagyon könnyű megtalálni a Linux és a Thix forráskódját. Az első rendszer mindenki számára ismert, a második kevésbé ismert, de nem kevésbé hasznos.
Megvan? Most csináljuk. Nyilvánvaló, hogy az első lépés a boot operációs rendszer létrehozása mini-operációs rendszerünk számára (és ez lesz a mini operációs rendszer!). Mivel a processzor 16 bites módban van betöltve, a bin86 csomagból származó összeszerelő és kapcsoló létrehozza a boot szektort. Persze kereshetsz valami mást, de mindkét példánk felhasználja; és a tanárok nyomdokain is követni fogjuk. Az összeszerelő szintaxisa kissé furcsa, kombinálva mind az Intel, mind az ATT számára jellemző tulajdonságokkal, de néhány hetes kínzást követően rá lehet szokni.
Boot szektor (boot.S)
Tudatosan nem adok teljes programleírást. Tehát az alapvető ötletek világosabbá válnak, és sokkal kellemesebb leszel, ha magad írsz mindent.
Először határozzuk meg az alapvető konstansokat.
START_HEAD = 0 - A meghajtó fejét fogjuk használni.
START_TRACK = 0 - A sáv, ahonnan elkezdeni az olvasást.
START_SECTOR = 2 - Az a szektor, amelyről olvassuk nucleolusunkat.
SYSSIZE = 10 - A rendszermag nagysága ágazatokban (minden szektor 512 bájtot tartalmaz)
FLOPPY_ID = 0 - A meghajtó azonosítója. 0 az első, 1 a második
HEADS = 2 - A meghajtófejek száma.
SZEKTOROK = 18 - A hajlékonylemezen található műsorszámok száma. A 1,44 MB-os formátum esetében ez a szám 18.
Az első dolog, amit teszünk, egy elfogadhatóbb helyre költözünk.
Most be kell állítania a szegmenseket az adatok (es, ds) és a verem megfelelően. Természetesen kellemetlen, hogy mindent manuálisan kell elvégezni, de mit tehetsz? A mi és a BIOS mellett senki sem szerepel a számítógép memóriájában.
És az üzenet ilyen
Ekkor egy szerény "Booting data." Jelenik meg a számítógép képernyőjén. Ez alapvetően nem rosszabb, mint a "Hello World", de még egy kicsit. Menjünk be a védett módba, és a "Hello" programot már a C programban írt programból adjuk ki.
A rendszermag 32 bites. A csomagtartó szektortól elkülönítve helyezkedik el, és a gcc és a gáz segítségével már összegyűjtött. A gázszerelő szintaxisa megfelel az ATT követelményeinek, így minden itt egyszerűbb lesz. De először olvassuk el a rendszermagot. Ismételje meg a 0x2 befejezett művelet 0x13 megszakítását.
Az olvasás nagyon funkciója rendkívül egyszerű: hosszú és fáradságosan töltse ki a paramétereket, majd egy csapásra olvassa el a rendszermagot. Nehézségek kezdődnek, amikor a rendszermag 17 szektorban (vagyis 8,5KB-ban) megszűnik; de ez még mindig a jövőben, és most elég egy ilyen villámgyors olvasás
Jelenleg a "Booting data.done" felirat jelenik meg, és a hajlékonylemez meghajtó lámpája ki van kapcsolva. Minden halt meg, és készen állnak egy halálos számra - ugrás a védett módban.
Figyelmeztető üzenet jelenik meg -, hogy védett módba lépünk. Mindenkinek tudnia kell, mi vagyunk fontosak.
Miközben a BIOS-nal még élünk, ne felejtsük el a kurzor pozícióját, és mentse el egy ismert helyen (0000: 0x8000). A kernel később összegyűjti az összes adatot, és felhasználja a nyertes üzenet megjelenítésére.
Most figyeljük meg, megtiltjuk a megszakításokat (nincs semmi, amit elmozdítunk az ilyen munkák során), és betöltjük a leíró táblázatot
Van egy leíró táblázat, amely három leíróból áll: nulla (mindig jelen van), egy kódszegmens és egy adatszegmens.
A védett módra való áttérés legalább kétféle módon történhet, de a példában kiválasztott Linux operációs rendszerek (Linux és Thix) a lmsw parancsot használják a 286 processzorral való kompatibilitás érdekében. Ugyanígy fogunk cselekedni
Ez a boot szektor minden munkája - nem kevés, de nem sok. Most vele együtt búcsúzzunk, és a mag felé tartunk.
Az összeszerelő fájl végén célszerű hozzáadni a következő utasítást.
Ennek eredményeképpen a fordított kód pontosan 512 bájtot foglal el, ami nagyon kényelmes a rendszerindító lemez képének elkészítéséhez.
A kernel elsõ sóhajtása (head.S)
A rendszermag sajnos ismét a telepítési kóddal kezdődik. De most már elég lesz.
Valójában az adatok szegmenseinek megfelelő értékeket állítjuk be (ES, DS, FS, GS). Írja le a megfelelő adatleíró értékét.
Hívja fel a régóta várt funkciót, amelyet már írt a C-ben.
És itt semmi más nincs itt.
Beszéljünk magas szintű nyelven (start.c)
Most, hogy ne keverjük össze a glibc-be épített funkciókkal, megszüntetjük a definíciójukat
És végül írjon kódot magas szintű nyelven. bár kis összeszerelő betétekkel.
Ezért hoztuk ezt a "Hello World" -t a képernyőre. Mennyi munkát végeztek, és csak két sor a képernyőn
És mi a rossz. Egy új operációs rendszer kiáltott fel. A világ örömmel elfogadta. Ki tudja, talán ez az új Linux.
A rendszerindító kép előkészítése (floppy.img)
Most készítsd el rendszerki rendszerünk boot képét.
A 32 bites fejlécet vágjuk és egy tiszta bináris kódot kapunk.
És össze fogjuk kapcsolni a boot szektort és a rendszermagot
A kép készen áll. Mi írunk egy hajlékonylemezre (előkészítünk néhány kísérletezésre, három darabot fejezem be), újraindítom a számítógépet és élvezem ...
E-én, mit tettem ...: - []
Nagyszerű, nem igaz? Jó érezni a Torvalds jövőjét vagy valakit. Az első nyomvonal taposott, biztonságosan megy előre - fejezze be a rendszer írását és átírását! ...
Az eddig leírt eljárás megegyezik a különféle operációs rendszerekkel, legyen az UNIX vagy Windows. Mit írsz? senki sem tudja. Végül is a rendszered lesz ...