( bzt | 2023. 07. 20., cs – 13:01 )

> Megkérdezhetem hogy miért ragaszkodsz a 256KB-hoz?

Mire gondolsz, milyen 256KB?

A verem mérete 256 BÁJT, és nem KILObájt. Ez azért van, mert a processzor valós módban mindössze 64KB-ot enged címezni egyszerre, és azt is csakis a fizikai memória első 640KB-jából (pontosabban 1M, csakhogy ide van leképezve a ROM meg a VGA MMIO is, azt a területet nem használhatod fel magadnak). A program 64 bites kódszegmensen, long módban fut ugyan, de ahhoz, hogy futás közben oda-vissza tudjak kapcsolgatni real mode és long mode között a BIOS hívásokhoz, úgy kell kialakítani a memóriát, hogy minden beleférjen és valós módból is elérhető legyen. Másra is szükség van, például a BIOS hívások által visszaadott adatokra, ezeknek is mind bele kell férnie a szűkös címtartományba. Ezen kívül a processzor és maga a BIOS is itt tárolja a belső változóit, amiket nem szabad felülírni (IVT, GDT, BDA). Ezért mindent levonunk a 64K-ból, akkor kb. 1K marad a teljes veremnek, amiből 256 bájtot engedélyezek a C kódnak, a többibe kerül, amit a hívott BIOS funkció visszaad (E820 memóriatérkép lista, VBE videómód lista, a beolvasott szektor tartalma, stb.)

Ezek olyan megszorítások, amikhez nem én ragaszkodom, hanem a hardware követeli meg (mind a címzésmódból eredő 64K korlát, mind a fix címterület, mind a rendszerváltozók rögzített címei). Sok trükközéssel maximum annyit tudnék elérni, hogy külön legyen a kód és adatszegmens, így a gépikódú rész kikerülhetne az első 64K-ból egy külön 64K-ba, összesen lehetővé téve 128K-t. Csakhogy nem éri meg, a komplett betöltő program ugyanis nem lehet nagyobb 64K-nál, mivel egy BIOS hívás egyszerre nem tud ennél több adatot betölteni (a boot.asm-ben). Ezért csinálom azt, hogy az első 64K-t használja a kombinált valós és long módú programrész. További 64K-t fenntartok kizárólag a long módú kódrész adatainak (COFF/PE inicializált adat és bss szegmenseinek), a "dinamikus" memória pedig 128K-tól, azaz 0x20000-tól indul, és 640K-ig, azaz pontosabban 0x9A000-ig tart (0x9FFFF lenne, csak néhány BIOS szeret adatokat pakolni 0x9A000 és 0x9FFFF közé, amiket ha átírnál, rendszerösszeomlás lenne a vége. Jobb biztosra menni.)