Amikor valaki egy operációs rendszert ír, akkor azt hogyan tudja lefordítani?
Olyan fordítót honnan szerzek, ami az általam kitalált rendszerhívásokat ismeri?
"Én egyébként úgy képzelem, hogy első körben pl. az ilyen rendszerhívásokat kiszolgáló részeket kell megírni, utána implementálni az őket használó utasítások, és függvénykönyvtárként megadni a fordítónak. Csak azóta már a GNU eleve így adja pl. a Linux gcc-t. Jól gondolom?"
Jól bizony!
Kénytelen vagyok megállapitani, hogy akik neked válaszoltak, azok szorulnának rá a segitségre, nem te.
A rendszerhivásaidat is te irod meg. Mindent te irsz meg.
Az első függvénytől az utolsóig, mindent neked kell megcsinálnod. Gyakorlatilag a hardvert programozod, legyen az PIC, floppy meghajtó motor ki vagy bekapcsolása, képernyőre irás, scrollozás, kurzormozgatás, bill. kezelés, stb. Ha a keyen lenyomod pl. egy 'a' betű billentyűjét, akkor azt is neked kell leprogramoznod, hogy ez esetben mi is történjen.
Egy kis anekdota a MINIX-ről:
A MINIX egy nyílt forrású, ingyenes, Unix-szerű operációs rendszer, amely mikrokernel architektúrára épül. Szerzője, Andrew S. Tanenbaum az oktatásban kívánta felhasználni, de a későbbiekben a MINIX önálló rendszerré vált. A MINIX inspirálta Linus Torvalds-ot, hogy elkészítse a Linux rendszermagot. A MINIX név a minimal és Unix szavakból származik.
A hallgatók első házi feladata az volt, hogy írjanak floppy drivert az operációs rendszerükhöz. Ahogy az előttem szóló is mondta, ez konkrétan azt jelenti hogy rendszerszinten megírták, hogy a floppy meghajtó motorja feszültséget kapjon és a fej olvasson egyet. És így tovább.
Nyilván voltak már saját libraryk. De azokat Tanenbaum írta, vagy iratta meg. A minix forrása egyébként C nyelvű, minimális asm betétekkel.
A forditó semmi mást nem fordít csak pure gépi kódot készít a forrásból. Tehát az már lefut, nem igényel külön libeket, vagy ha mégis, akkor azok a saját libjeid lesznek. Nem függenek semmitől, csak az adott hadvertől.
Ha pl. egy olyan progit akarsz irni, amely kiir egy a betűt és ESC billentyúre kilép, akkor meg kell irj egy boot szektort (ezt szokták ASM-ben). A boot folyamat a köv.: a gép elmegy magától a floppy meghajtóig, ott a behelyezett lemez első (nulladik) szektorát beolvassa és ráadja a vezérlést. Te akár ebbe a boot szektorba is elhelyezheted a kódodat, amely lehet akármi. Jelen esetben a progi amely a betűt ir ki és ESC-re kilép.
Ekkor a c forrásod mást nem fog tartalmazni, csak azt hogy a képernyő memória le legyen kezelve és egy print_char függvényt, amely megjeleniti az a betűt. Ezen kivül egy rutint ami figyeli a billentyűzetet (ill. annak portját) (loop) és ha az ESC-nek megfelelő scan kódot olvas onnan be, akkor mondjuk egy far jamppal ujrainditja a gépet.
A bill kezelést is megirhatod többféleképpen, lehet megszakitásos, vagy polling is akár.
Egy a fontos, mindent te irsz meg. Standard függvények használata nélkül. Ha kellenek függvények (library) akkor azokat is neked kell megirnod.
Szerintem nézz körül az osdev.org-on és ott konkrét példákat is találsz. Például barebone C oprendszer kezdeményt. Az egész nem több 20-40 sornál. Ott majd látni fogod a lényeget. Sok sikert.
"Milyen fordítót használtak hozzá, esetleg assemblyben lehet csak megcsinálni?"
Nem csak asm-ben lehet megcsinálni. C forditó, megfelelően paraméterezve, std. libc használata nélkül.
Ekkor nem fog a forditó stub-ot (betöltőt) illeszteni a leforditott kódod elé, nem lesznek benne OS specifikus függvényhivások sem, csak pure gépi kód.
gcc -c kernel.c -o kernel.o -std=gnu99 -ffreestanding -O2 -Wall -Wextra
Itt egy részlet egy barebone C OS kódból, két saját függvény (putchar és writestring, érdemes észrevenni, hogy a witestring a putchar-t hivogatja (paraméterként átadva neki az aktuális karaktert), igy jelenit meg egy stringet (a putchar pedig egyetlen karakter megjelenitésére képes, értelemszerüen)):
void terminal_putchar(char c)
{
terminal_putentryat(c, terminal_color, terminal_column, terminal_row);
if ( ++terminal_column == VGA_WIDTH )
{
terminal_column = 0;
if ( ++terminal_row == VGA_HEIGHT )
{
terminal_row = 0;
}
}
}
void terminal_writestring(const char* data)
{
size_t datalen = strlen(data);
for ( size_t i = 0; i < datalen; i++ )
terminal_putchar(data[i]);
}
Asszem értem.
Korrekt válasz volt, köszönöm szépen!
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!