
|
ROMOS je samostatný strojový kód x86, který umožňuje spouštět vlastní binární kód
nebo binární kód třetích stran. Využívá pouze funkcí BIOSu, takže je nezávislý na operačním systému. Hlavním
účelem je jeho umístění do ROM, odkud může během POSTu při bootování počítače (Power-On Self Test) spouštět další
programy, např. bootmanažera, diagnostiku či speciální řídicí software. Mimo jiné může také nabootovat operační
systémy založené na DOSu (možná i jiné) jako třeba FreeDOS, uložené v ROM
spolu s ROMOSem. Z toho plyne, že není potřeba žádná disková mechanika, což může být velmi výhodné v případě
různých kompaktních bezdiskových PC systémů. Dobře také poslouží jako rezervní operační systém v případě, že se něco stane
a počítač přestane bootovat. Další využití je na vás. Jsou dvě možnosti kam lze ROMOS umístit. Jednak může být vložen jako ISA ROM modul do systémového BIOSu, který je ve FlashROM na základní desce. Pak není potřeba žádný další hardware, ale jsme limitováni volným místem ve flešce. Nebo lze ROMOS vypálit do paměti EPROM, kterou zastrčíme do speciální ISA karty. Levnější je ale použít jakoukoliv síťovku s paticí na BootROM. Pak bude možná potřeba ještě BootROM povolit v nastavení pomocí konfigurační utility od výrobce síťové karty. Tyto nastavění (jako např. MAC a další) se ukládají do malé paměti EEPROM na kartě. Tady jsou požadavky na systém: -PC s BIOSem uloženým ve FlashROM (EPROM nelze [snadno] modifikovat) -operační systém MS-DOS 7.0 a vyšší (ten z Win9X) nebo FreeDOS -dostatek volného místa ve FlashROM (min. 2 kB pro samotný ROMOS + další kód) (přeložený ROMOS s FreeDOSem potřebuje 64 kB), jak uvolnit více místa je popsáno níže. -Award BIOS 4.51/6.00 (AMI BIOS jsem nezkoušel, ale nové verze už neporporují ISA ROM moduly) -soubor s BIOSem pro vaši základní deskou (lze ho dumpnout z flešky pomocí awdflash.exe) -programy cbrom.exe a awdflash.exe umožňující vložení ROMOSu do image BIOSu a jeho flashnutí. Pokud chcete používat ROMOS na samostatné ISA kartě, stačí jen: -ISA karta podporující paměťové čipy do velikosti 64 kB -Programátor FlashROM nebo EPROM pamětí Pokud si chcete udělat vlastní ROMOS build, bude ještě třeba: -disketová mechanika 1,44 MB a jedna disketa (na modifikaci image virtuálního ROM disku) -překladač assembleru NASM -romchk.exe a zalign.exe na výrobu ROM image souboru -fdimg.exe na práci s image souborem virtuálního ROM disku (všechny potřebné programy jsou v ZIP balíčku zde)
Před instalací je potřeba nejdříve získat soubor s image vašeho BIOSu. Můžete si ho stáhnout z webu výrobce vaší desky nebo ho dumpnout pomocí awdflash.exe /pn /sy bios.bin. Přesuňte soubor bios.bin do adresáře, kam jste rozbalili ZIP balíček s ROMOSem a udělejte si záložní kopii. Pokud chcete modifikovat obsah virtuálního ROM disku, vložte 1,44MB disketu bez vadných sektorů do mechaniky A: (pokud ji máte jako B:, je třeba upravit cesty v dávkových souborech) a spusťte putimg.bat (z DOSu, ne z Windows). Program FDIMG přenese image soubor romdisk.img na disketu. Díky specifickému formátu diskety (63 kB s jednou FATkou) s ní lze pracovat jen v novější verzi MS-DOS 7.0+ nebo FreeDOS. Potom už lze jednoduše na disketě kopírovat/mazat soubory, přenášet systém příkazem sys, prostě stejně jako s jinými disketami. Taky lze z diskety zkusit nabootovat a otestovat, zdali vše správně funguje. Když je disketa odladěná, stačí spustit getimg.bat (předtím si zálohujte původní romdisk.img) a FDIMG vytvoří image soubor diskety. Pak můžete zeditovat zdroják romos.asm. Je zde pár důležitých nastavení: řádka 15 odkomentováním definice MAKE_PCI_MODULE se do ROM modulu vloží PCIR a $PnP hlavička nutná pro tvorbu PCI ROM modulu. Některé hodnoty v těchto hlavičkách je třeba po překladu nakonfigurovat pomocí přiloženého programu bromcfg.exe. řádka 16 odkomentováním definice HOOK_INT19H se povolí pověšení na INT 19h. řádka 17 definuje velikost ROM modulu v kB (včetně romdisk.img), minimální velikost je 2 kB. řádka 18 definuje kterou jednotku bude ROMOS emulovat. Pokud jednotka v systému existuje, bude přístup k ní znemožněn. Pokud máte jednu disketovou jednotku vyberte B:, pokud žádnou vyberte A:. řádky 19-21 definují formát diskety použité pro virtuální ROM disk. Pokud použijete dodávaný image soubor romdisk.img není potřeba nic editovat. řádka 22 definuje offset v bootsektoru, kde se nachází byte udávající číslo bootovací jednotky. V případě operačních systémů typu DOS není třeba editovat, neb je tento byte vždy na offsetu 24h a ROMOS ho automaticky přepíše podle hodnoty ROMDISK_DRIVE nastavené na řádku 14. řádky 23-24 definují adresu, kam bude bootsektor nahrán před jeho spuštěním. BIOS tak obvykle činí na 0000:07C00h. řádka 25 definuje dobu zobrazení hlášky o bootování ROMOSu v 55ms ticích časovače. řádka 26 definuje horkou klávesu, kterou se ROMOS aktivuje (ScrollLock/NumLock/CapsLock). Po editaci romos.asm spusťte rcompile.bat pro přeložení do strojového kódu. Soubor romdisk.img je automaticky inkludován. Také je upraven kontrolní součet (offset 0Dh) a velikost romos.bin je zarovnána na celočíselný násobek 512B. Výsledkem je tedy image soubor ISA ROM, který lze přímo napálit do EPROMky, zastrčit do ISA karty a bootovat. Nebo ho lze jako ISA ROM modul vložit do systémového BIOSu. Pokud jste váš soubor s BIOSem nakopírovali jako bios.bin do adresáře ROMOSu, stačí spustit insromos.bat a CBROM vloží ROMOS na adresu D000:0000h (pokud jste vybrali jinou adresu, upravte parametr v dávkovém souboru). Nyní se podívejte na výpis CBROMu, jestli se modul správně vložil. Pokud napíše něco jako 'not enough space', přečtěte si sekci technické detaily, jak nějaké místo ve flešce uvolnit vyjmutím nepotřebných modulů BIOSu. Nakonec stačí váš modifikovaný bios.bin naflashovat pomocí awdflash.exe bios.bin a restartovat počítač. Pokud používáte ROMOS PCI jako náhradu BOOTROM onboard síťové karty nezapomeňte v SETUPu aktivovat její BOOTROM a popř. povolit hook INT 19h pokud je tam taková volba. Po restartu a poté, co BIOS provede POST, by se měla na horním řádku obrazovky zobrazit bíle hláška 'Press [ScrollLock] to boot ROMOS !'. Defaultně se zobrazí po dobu 1,6 vteřiny. Pokud nic neprovedete, BIOS bude pokračovat v bootování z diskových jednotek jako normálně a uvolní oblast ROM pro jiné využití (např. UMB paměť, rámec EMS paměti, apod.). Pokud zmáčknete ScrollLock (můžete ho stisknout i před zobrazením hlášky), ROMOS vypíše nějaká debugovací hlášení, nainstaluje vlastní obsluhu přerušení INT 13h (která zprostředkuje přístup k virtuálnímu ROM disku), překopíruje bootsektor z virtuálního ROM disku na danou adresu a předá mu řízení. Ten pak natáhne z ROM disku operační systém. Nadále pak budete mít k virtuálnímu ROM disku přístup pouze pro čtení pod jmenovkou definovanou proměnnou ROMDISK_DRIVE. Zde si můžete stáhnout poslední verzi ROMOSu. Je to volně šiřitelný software a můžete ho modifikovat podle libosti, ale nechte mi tam prosím copyright. Jakýkoliv software založený na ROMOSu by měl být dán též volně k dispozici i se zdrojáky. Pokud vytvoříte nějakou podstatnou modifikaci nebo narazíte na chybu, dejte mi laskavě vědět. romos.asm [32 kB] - ROMOS 1.04 ISA/PCI zdrojový kód v assembleru, poslední modifikace 22.6.2009 romos.101 [28 kB] - ROMOS 1.01 zdrojový kód, starší verze romos.094 [14 kB] - ROMOS 0.94 zdrojový kód, starší verze romos.001 [7 kB] - ROMOS 0.01 zdrojový kód, ještě starší verze ;-) romos.bin [64 kB], romospci.bin [64 kB] - ROMOS 1.04 ISA a PCI přeložený modul (k umístění na adresu D000:0000h, emulující jednotku B:) obsahující FreeDOS jádro 2035, Mikro Manažer 1.0 eng. (nyní po rekompresi ~ o 2 kB menší), Dynaload pro dynamické zavádění ovladačů, SeeMem na prohlížení paměti a pár dalších drobností. PCI verzi je třeba před použitím nakonfigurovat pomocí bromcfg.exe (součást zip balíčku). romos16k.bin [16 kB] - ROMOS 1.02 PCI přeložený modul (k umístění na adresu D000 - DC00:0000h, nakonfigurovaný pro PCI síťovou kartu Realtek 8029, emulující jednotku A:) obsahující DF-DOS 0.04b - http://www.dftech.cwc.net/osdev, prohlížeč paměti a pár demíček. romos.zip [421 kB] - ROMOS 1.04 vývojový balíček se vším potřebným včetně překladače NASM. rjdos.zip [12 kB] - RJDOS 0.01a od Richarda L. Jamese je malá náhrada za command.com (9746 bytes), kterou lze vložit do romdisku. Pokud se chcete právě teď na vlastní oči podívat, jak to funguje, tady je animace bootujícího ROMOSu na mém PC od Borg Number One, která by snad vašemu počítači neměla ublížit ;-)
22.2.2004 Verze 0.95 byla výrazně přepracována. Hlavní kód ROMOSu je nyní jako obslužná funkce INT 19h. V první fázi během POSTu, kdy BIOS provádí ROM-scan, se pouze zobrazí dotaz, zdali spustit ROMOS. V kladném případě nainstaluje obsluhu INT 13h a na hlavní kód nasměruje vektor INT 19h. Pak předá ROMOS řízení zpět BIOSu, který korektně dokončí POST. Po kompletní inicializaci BIOS zavolá INT 19h, čímž se znovu spustí ROMOS (pokud byl INT 19h přesměrován), který tentokrát provede zavedení systému z virtuálního ROM disku. 4.3.2004 byl updatován FreeDOS kernel na verzi 2033 (obsažený v romos.bin a romos.zip), který přeložil Luchezar Georgiev pomocí BC pro 386, čímž se zmenšila jeho velikost na 42518 B. Díky tomu je nyní v ROM disk image o 1 kB více místa pro uživatelské programy. 22.9.2004 Nová verze 0.97 obsahuje četné změny a optimalizace kódu. Nejpodstatnější změnou je uložení pár potřebných permanentních dat do volných míst v tabulce vektorů přerušení místo do segmentu ROMOSu. Tím je umožněn běh z pamětí skutečně pouze pro čtení (EPROM na kartě bez shadowingu) a v PC emulátoru BOCHS, kde lze ROMOS pohodlně ladit. Nyní není kód vázán na konkrétní segment, v praxi ale v PC stejně nemáme moc na výběr, buď D000h nebo E000h (jen u starších PC). Dále byla přepracována struktura obsluhy INT 13h tak, aby šly jednoduše přidávat nové podslužby. Byla přidána podslužba 03 (zapisuj sektor), která vrací chybový kód. Pro rychlou orientaci jsem na konec zdojového kódu přidal i stručný vývojový diagram. Pak jsem ještě na image ROM disku nahrál nový kernel 2035. 23.10.2004 Verze 1.00 obsahuje další optimalizace kódu a obsluha INT 13h byla rozšířena o podporu funkce 15h. Dále jsem se zabýval úpravou zdrojáků a překladem FreeDOS kernelu 2035. Díky odebrání některých nepotřebných částí kódu (fdconfig.sys - jen config.sys, break, numlock, echo, switches, country, menus), optimalizaci překladače a packeru se mi podařilo dosáhnout velikosti jen 39390 B pro kernel s podporou FAT32. Díky tomu se na ROMDISK vejde i USB ovladač pro mass-storage zařízení (flashdisky a pod.), odkud lze tahat další soubory. Např. pomocí loadlin.exe by bylo možno natáhnout z flashdisku Linux - bohužel nemám na čem vyzkoušet. ROMDISK image s USB driverem je obsažen v zip balíčku jako romdusb.img spolu se standardním romdisk.img. 18.3.2006 Hlavní novinkou verze 1.02 je přidaná podpora Plug&Play PCI ROM. Většina nových základních desek bez ISA slotů má totiž BIOS ochuzen o podporu ISA ROM modulů a proto tam ROMOS nefungoval. Nyní lze tedy ROMOS přeložit i jako PCI ROM modul (PCI ROM lze použít i jako ISA ROM, nikoliv naopak). PCI ROM ve své hlavičce obsahuje ID výrobce, ID zařízení a třídu zařízení která musí odpovídat skutečným hodnotám nějakého PCI zařízení přítomného v systému, jinak se ROM nespustí. Některé BIOSy navíc dovolují PCI ROM přiřadit pouze PCI zařízením, která skutečně disponují nějakou ROM nebo paticí (např. síťová karta). Alespoň v mojem systému to fungovalo pouze s ID síťové karty (zkoušel jsem např. PIIX4, PCI-PCI můstek, USB řadič...). Pro toto nastavení přeloženého PCI ROM modulu slouží program bromcfg.exe od Arneho, který je v zip balíčku. 15.7.2007 Ve verzi 1.03 je jen pár drobnějších změn, nyní lze ve zdrojovém kódu pomocí definice HOOK_INT19H vypnout/zapnou pověšení na INT 19h. Pokud je definice zakomentovaná, tak se ROMOS spustí ihned po dotazu a stisku klávesy (s tím, že se případně nedokončí POST, ale někdy se to může hodit). Dále byly obměněny některé programy na ROMDISKu. ROMOS jsem úspěšně otestoval na AMI BIOSu desky Asus P5LD2 a pro AMI BIOSy přikládám v zip balíčku potřebný program AMI MMTool 3.12 pro vložení ROMOS modulu do BIOS image. 22.6.2009 Verze 1.04 obsahuje pouze jedno vylepšení zdrojového kódu - optimalizace rutiny pro výpis hexadecimálních čísel a úpravu souvisejících rutin, čímž jsem ušetřil 17 B strojového kódu. Technické detaily (hákování BIOSu, ROM moduly, ASM...)Od čtenáře budu předpokládat určité znalosti ohledně hardwéru PC, BIOSu (implicitně se vše vztahuje k AWARD BIOSu), DOSu a assembleru. Pokud jste windouzácký klikálek, běžte si raději hrát s panem Sponkou z M$ Mordu... :)Dobrá, shrňme si pár faktů o BIOSu (Basic Input Output System). Je to základní software (měli bychom říkat firmware) uložený v permanentní paměti na základní desce, poskytující základní funkce jako třeba přístup k diskům, obrazovce, klávesnici, portům, časovači, atd. Operační systém pak může nebo nemusí těchto funkcí využívat. Operační systémy založené na DOSu je vždy využívají. BIOS přebírá řízení pokaždé, když zapneme (nebo tvrdě resetujeme) počítač, na své vstupní adrese F000:FFFEh. Pak provede POST (Power-On Self Test) - různé inicializace a testy (např. nastavení registrů chipsetu, rychlosti CPU [přes PLL], test operační paměti, hledání diskových jednotek, hledání dalších ROM a spoustu dalších věcí). BIOS také obsahuje program SETUP, který umožní uživateli provést různé hardwarové nastavení, které posléze uloží do paměti CMOS zálohované baterkou. Dříve byl BIOS uložen v jednom nebo dvou paměťových čipech EPROM. 486tky používaly obvykle jednu paměť typu 27C512 (64 kB) a 286tky a 386tky dvě paměti typu 27C256 (32 kB) - sudá a lichá část (dáno 16-bitovým adresováním). Poznamenejme, že paměti typu EPROM je možno vymazat pouze ozářením UV světlem - proudem vysokoenergetických fotonů. Pro tento účel mají keramická pouzdra pamětí nahoře okénko z křemičitého skla, které je obvykle přelepeno nějakou samolepkou. Ovšem existují i levné verze EPROM pamětí bez okénka (ano, ty v epoxidových pouzdrech), které lze vymazat pouze rentgenovým zářením, ale nedoporučuji to zkoušet doma :). Díky tomu je aktualizace BIOSu dosti obtížná, pokud nemáte náhodou mazačku a programátor EPROM. V pamětech byl uložen přímo binární kód BIOSu, který byl celý vidět v adresovém rozsahu F0000 - FFFFFh. Systémy s Pentiem (a také některé moderní 486 a 5x86) přinesly podstatné vylepšení tím, že pro uložení BIOSu byla použita paměť typu Flash EPROM. To umožnilo uživateli elektricky vymazat a přeprogramovat kód BIOSu bez nutnosti vyjmutí čipu ze základní desky. První FlashROM paměti jako třeba 28F001 vyžadovaly zvlášť 12V napájení pro mazání a programování. Novější, jako třeba 29F020, si už vystačí s jediným napájením 5V. Nyní se prosazují různé LV varianty na 3,3 V, které jsou k vidění zejména na grafických kartách. Nejstarší základní desky podporovaly pouze 12V FlashROM paměti, novější měly jumper pro výběr 5 / 12 V a nejnovější už zas podporují jen 5V nebo 3,3V čipy. Kapacita paměti se zvětšovala od 128 kB přes 256 kB po 512 kB a zřejmě dál poroste. Na některých nejnovějších motherboardech je k vidění paměť v pouzdru SMD PLLC místo klasického DIL. V extrémních případech je pak PLLC čip připájen přímo na plošný spoj, takže ho v případě problémů nelze snadno vyjmout a přeprogramovat v programátoru. Myslím, že to není nejlepší trend. Jistě, pro výrobce desek je to jednodušší a levnější řešení a některé HW servisy si na tom pak snadno namastí kapsu. K ochraně před nechtěným přepsáním BIOSu bývá v okolí FlashROM na desce jumper s nápisem 'programming enable' nebo 'write protect'. Tak ho nyní přepněme. Také struktura kódu BIOSu se změnila. Místo formy jednoho binárního kódu došlo k rozdělení na dvě části - 8kB nekomprimovaný bootblock a modul(y) komprimované LHA. Bootblock dostane řízení jako první a postará se o překontrolování a rozbalení LHA komprimovaných modulů na dané adresy RAM. Pokud je vše v pořádku, předá řízení hlavnímu modulu. Avšak je-li nějaký modul poškozen a nesedí jeho kontrolní součet, bootblock akorát vydá chybové zapípání. Ale zachovejte paniku :), pokud je bootblock v pořádku umožní vám přeflešovat BIOS pomocí DOSové bootovací diskety s funkčním BIOS image souborem, flashovacím programem a správně napsaným souborem autoexec.bat. Pravděpodobně na obrazovce nic neuvidíte, protože bootblock neinicializuje PCI a AGP. A tak můžete aspoň sledovat LED na disketové mechanice. Pokud použijete starší ISA VGA kartu, měly by být výpisy BIOSu normálně vidět. Jednoduše strčte disketu do mechaniky a restartujte. Bootblock z ní nabootuje DOS a autoexec.bat zavolá awdflash.exe, který přeflešuje BIOS funkční verzí a mělo by to být OK :). Pokud všechny ostatní snahy selžou, je třeba čip vytáhnout z patice a nechat ho přeprogramovat v programátoru. Nebo můžete vyzkoušet metodu hotflash, pokud ovšem máte po ruce záložní FlashROM čip. Já jsem vždy používal tuhle metodu, protože programátory pamětí jsou kur..... drahý. Ale je zde větší či menší riziko odpálení paměti nebo rovnou celé desky. To záleží, jak moc věříte Murphyho zákonům ;-). Já jsem na svojí desce dělal asi 50 hotflashů a podařilo se mi odkouřit jednu paměť. To je 98% úspěšnost - to jde ne? Ale nová fleška mě pak stála asi dvě kila. Hotflash je v podstatě velmi jednoduchá záležitost. Pro vytvoření zálohy nejprve potřebujeme paměť stejné kapacity (může být od jiného výrobce). Vypneme počítač, vytáhneme stávající čip a znovu ho vložíme zlehka do patice. Vyndáme nepotřebné karty, kabely a další harampádí, které nám brání ve snadném přístupu k patici s čipem. Zapnem počítač a nabootujem čistý DOS. Pak opatrně vytáhneme čip z patice (pokud jste ho předtím vyndali a zandali, jak jsem vám radil, nebudete nyní muset použít příliš násilí) a vložíme prázdný. Systém nespadne, protože BIOS je stínovaný v RAM. Naflashujeme funkční soubor BIOSu do paměti a restartujeme počítač. Nyní máme k dispozici záložní čip. Pokud se něco těžce zesere, stačí čipy prohodit a udělat postup znovu. Nyní něco ohledně modulů BIOSu. Lze je prohlížet/přidávat/odebírat pomocí programu cbrom.exe. Nebo je lze taky všechny najednou vyextrahovat pomocí awarddec.exe. Pro AMI BIOSy existuje podobný nástroj amibcp.exe pro DOS & Windows a mmtool.exe pro Windows. Tady je listing mojeho BIOS fajlu:
a zde jak to vypadá v případě nového AMI BIOSu:
Hlavní modul je original.tmp (na řádce 0.). Obsahuje rezidentní kód, program SETUP a POST rutiny. Je vždy dlouhý 128 kB. Prvních 64 kB original.tmp se nahraje dočasně na adresy E000:0000 - E000:FFFFh. Po proběhnutí POSTu se tato paměť uvolní. Druhých 64 kB original.tmp je permanentně umístěno na F000:0000 - F000:FFFFh a po POSTu se uzamkne proti zápisu. CBROM neumožňuje extrahovat/vkládat hlavní modul original.tmp. To lze udělat pomocí awarddec.exe (pouze extrakce) nebo modbin.exe. Modifikace original.tmp není žádná legrace, protože je chráněn dvěma kontrolními součty. Naštěstí je MODBIN umí spočítat. Také vložení modifikovaného souboru zpět do BIOS image není snadné a já sám nemám zaručený postup. Ale podařilo se mi to pomocí prográmku awdhack.exe. Díky tomu, že se BIOS stává čím dál více komplexnější a větší, tak se už celý nevejde do original.tmp a proto byl rozdělen na víc částí - XGROUP a YGROUP CODE moduly. Můj BIOS je už relativně starý a tak obsahuje pouze XGROUP code reprezentovaný awardext.rom. Tento modul se obvykle rozbaluje na adresu 4100:0000h. Lze ho snadno modifikovat, ale po jeho vložení do BIOS image souboru je třeba nechat MODBINem přepočítat kontrolní součet (načíst soubor a zvolit update). Dále můžeme v listu vidět CPU micro code modul jako cpucode.bin. To je aktualizace mikrokódu pokročilých instrukcí CPU (mám na mysli např. MMX, SSE, SSE2 a pod., pokud o tom někdo ví více, nechť mi dá vědět). Cpucode.bin se skládá z několika 2 - 8kB bloků jednoduše poskládaných za sebe do jednoho souboru (s výjimkou ASUS BIOSů). Každý blok mikrokódu má svoji hlavičku:
ACPI table modul má co dočinění s ACPI, ale nemám bližší informace. VRS ROM modul je potřeba pro vestavěný antivir, který mám stejně vypnutý. Myslím, že může být klidně odstraněn, pokud tuto funkci nepoužíváte. EPA LOGO je Energy Star logo zobrazované v pravém horním rohu během POSTu. Ve starších BIOSech je pouze dvoubarevné (EPA 1.0), v novějších pak 16-ti barevné (EPA 2.0, signatura "AWBM" na začátku souboru). Logo si můžete přehrát svým výtvorem. Pro tento účel jsem napsal vlastní BMP -> EPA convertor, kde jsem využil poznatky získané při hackování EPA 2.0 formátu (V té době jsem nikde na Internetu žádnou specifikaci nenašel). V AMI BIOSech, se kterými se můžeme setkat třeba na novějších deskách P4/C2D od Asusu se používá 16-ti barevný formát intel GRFX. Pro něj jsem napsal též vlastní BMP -> GRFX convertor. Můžete si je stáhnout tady, viz: /PROGRAMOVÁNÍ. OEM LOGO modul je velké celoobrazovkové bitmapové logo zobrazované místo klasického výpisu POSTu. Lze ho najít na některých počítačích compaq, intel, aj. velkých firem. Jeho smazáním lze uvolnit ve FlashROM hodně místa. Pak taky můžeme vidět malé modré logo 'Award medal' v levém horním rohu, které není uloženo v žádném samostatném modulu, ale nejspíš v original.tmp. Zatím jsem nepřišel na to kde. Dále zde můžou být další moduly, jako třeba VGA videobios integrované grafické karty (tuto možnost lze použít v případě, že špatně naflashujete BIOS na VGA kartě), bootrom síťové karty, BIOS IDE/SCSI raid řadiče a další... Také jsem našel jeden podobný projekt ATA Security eXtension BIOS, který rozšiřuje BIOS o modul zabezpečení haddisku heslem. Moderní disky totiž už dobu podporují ATA příkazy pro nastavení uživatelského a administrátorského hesla, kterými lze účinně ochránit obsah disku, ale programátoři BIOSů toho zatím moc nevyužívají (vyjma notebooků). Pokud chcete spustit vlastní kód během POSTu, můžete snadno vytvořit ISA ROM modul a vložit ho do BIOS image souboru. Musíte přitom vybrat adresu pro váš modul tak, aby nekolidovala s ostatními ROM, nebo kódem BIOSu. Na obrázku níže je mapa obsazení paměti dolního megabajtu v typickém PC: ![]() Obvykle máme k dispozici volnou oblast paměti na D0000 - DFFFFh (64 kB), kterou lze použít pro náš ISA ROM modul. Během POSTu provádí BIOS tzv. ROM-scan, kdy hledá v paměti externí ROMky. ISA ROM musí začínat prvními dvěma bajty 55 AAh následované třetím bajtem určujícím velikost ROM v 512B blocích. Avšak minimální velikost ISA ROM modulu je 2 kB. Protože BIOS hledá hlavičku ROM po adresovém kroku 2 kB, tak ROMka musí začínat na adrese, jenž je celistvým násobkem 2048 (800h). ISA ROM modul má svůj kontrolní součet. Ten spočítáme tak, že do proměnné typu byte posčítáme všechny bajty ROM modulu včetně hlavičky 55 AA (o přetečení se nestaráme). Tato hodnota pak musí být nulová. Pokud kontrolní součet nesedí, tak BIOS danou 2kB oblast přeskočí a pokračuje v hledání dále. Jinak začne provádět kód ROM počínaje čtvrtým bajtem. Sem můžeme vložit náš strojový kód, který vypadl z překladače NASM. Program musí být ukončen instrukcí RETF. Soubor s výsledným ISA ROM modulem by měl být zarovnán nulami na celočíselný násobek 512-ti na velikost danou třetím bajtem. Tady je šablona ROM:
ROMOS poskytuje pár základních funkcí: DELAY počká AH*55ms, GOTOXY nastaví kurzor na pozici dle DL,DH, WHEREXY načte pozici kurzoru do DL,DH, WRITE vypíše na aktuální pozici kurzoru nulou ukončený řetězec z adresy CS:SI atributem daným v BL, WCRLF vytiskne CR,LF, čímž odřádkuje, WHEXW vytiskne hexa slovo z DX, WHEXB vytiskne hexa bajt z AL, WREGS vytiskne hexa obsah registrů F, CS, SS, ES, DS, DI, SI, BP, SP na jednu řádku, SET_KBD_FAST nastaví rychlost klávesnice na 30 CPS a prodlevu opakování po prvním znaku na 250 ms, INSTALL_NEW_INT13 nastaví vektor přerušení INT 13h na novou obsluhu NEW_INT13 a uloží starý vektor INT 13h. Hlavní část programu je mezi labely BOOT a EXIT. Obsluha NEW_INT13 podporuje pouze funkci 02 - čti sektory. Ale mělo by to stačit na úspěšné nabootování a přístup pouze ke čtení k virtuálnímu ROM disku umístěnému na labelu IMG_BEGIN (za kódem ROMOSu). NEW_INT13 odchytí každé volání INT 13h, ověří pokud číslo disku odpovídá našemu virtuálnímu ROM disku a jestli číslo funkce je 02. Pak vypočítá lineární adresu v paměti podle daných diskových parametrů CHS a překopíruje požadovaný počet sektorů (512B bloků) z virtuálního image disku (RAM) do daného bufferu na ES:BX. Taky pro vizuální kontrolu, zda-li bylo přerušení řádně obslouženo, vypíše znak * do pravého horního rohu. Pokud je přerušení voláno s číslem jiného disku či jinou funkcí, je předáno původní obsluze INT 13h (pokud číslo disku sedí, ale neodpovídá funkce, tak je vypsán znak !). Nebyl by asi velký problém udělat přístup k ROM disku i pro zápis, možná v některé další verzi ROMOSu. Pokud opustíme kód ROM pomocí RETF aniž bychom smazali hlavičku 55 AA, tak paměť zůstane zaplácaná nevyužitým kódem. Přitom by mohla být využita jako oblast HMA, nebo okno EMS, a pod. pro zvětšení volné konvenční paměti DOSu. To je důvod, proč normálně ROMOS před svým ukončením zapíše DW 0 přes hlavičku. Pokud ji tam však schválně necháme (kód ROM tak zůstane v paměti) a přenastavíme vektor přerušení INT 18h nebo INT 19h na ROMOS, pak můžeme ROMOS spustit i po bootu zavoláním tohoto přerušení. Pokud chcete této možnosti využít, stačí odkomentovat řádku %define HOOK_INT18_BY_ROMOS. A jak funguje virtuální ROM disk? Účelem bylo maximálně využít 64 kB prostor pro uživatelská data na ROM disku. Standardní 1,44MB disketa je naformátovaná takto: 80 cylindrů, 2 hlavy, 18 sektorů na stopu a 512 B na sektor. Jednoduše vyjádřeno CHS = 80 / 2 / 18. Pokud vynásobíme všechna tato čísla, dostaneme 1474560 bajtů. A tak jsem si hrál se zmenšováním počtu cylindrů a hlav, abych dostal optimální velikost disku a došel jsem k tomuto: CHS = 7 / 1 / 18 (126 sektorů) to jest 64512 bajtů. Zbývá 1 kB pro kód ROMOSu. Pro efektivní využití disku jsem zvolil 1 sektor na cluster a 16 záznamů v kořenovém adresáři. Ze 126 sektorů je první použit na bootsektor, druhý a třetí na dvě kopie FAT tabulky a čtvrtý pro kořenový adresář. Zbývá tedy 62464 bajtů (122 sektorů) pro uživatelské soubory. Abych ještě trochu zvětšil využitelné místo na disku, odstranil jsem nadbytečnou kopii FAT pomocí DISKEDITORu a opravil údaje v bootsektoru. Tak jsem získal 62976 bajtů (123 sektorů) pro uživatelská data. Nevýhodou je, že takový disk je pak čitelný pouze v novějších verzích MS-DOSu (>6.22), proto je třeba použít DOS z Win9X nebo FreeDOS. A nezapomeňte, že i když váš soubůrek je velký jen jeden bajt, tak zabere na disku celý sektor. Doufám, že se mi to podařilo popsat dostatečně srozumitelně. Mohl bych napsat ještě mnoho detailů (to snad necháme někam k pivu ;), ale myslím, že by se pak hlavní myšlenky ztratily v moři slov. Snad to pomohlo lidem, kteří se o tuto problematiku vážně zajímají, nováčkům asi moc ne. Ale nic si z toho nedělejte, pokud jste zde něčemu nerozuměli. Já jsem to taky nepochopil za jediný den. Sháním tyto informace už několik let z různých internetových zdrojů a stále je zde co objevovat. Moje poděkování si zaslouží vyhledávač Google, Darmawan Mappatutu Salihun - Award BIOS Reverse Engineering, Jan Steunebrink, Daemorhedron, Sunil Shrestha, Luchezar Georgiev, Eric Auer, Jakub Chalupník, komunita FreeDOS, Miroslav Němeček (MikroManažer), Datalight, Rebels Haven BIOS modding fórum. FAQ, poznámky pod čarouQ: Proč nefunguje ROMOS v PC emulátoru BOCHS?A: Je to způsobeno tím, že BOCHS (resp. jeho BIOS) nepodporuje ROM shadowing (kopírování obsahu ROM do RAM) a oblast ROM, kam si ROMOS při startu ukládá původní vektor INT 13h, INT 19h a SS:SP, je přístupná pouze pro čtení. Při obnově SS:SP či volání starých vektorů tedy dojde ke skoku na neplatnou adresu a fatální chybě. Není problém tyto důležitá data uložit do oblasti RAM (00000 - 9FFFFh), ale nevím jakou pro ně vybrat bezpečnou adresu, aby je následně nahraný operační systém, ovladače nebo aplikace nepřemazaly. Nově od verze 0.97 bylo změněno ukládání těchto dat na volná místa v tabulce vektorů přerušení a tím padla nutnost zapisovat do ROM segmentu. Nyní ROMOS funguje v emulátoru BOCHS. Q: Je možno zvětšit kapacitu ROM disku na více než 62 kB? A: Možné to je. Celkem jednoduše by se dalo [EDIT:] nedalo získat dalších 32 kB rozdělením image ROM disku na dvě části s využitím prázdné ROM díry na adrese B0000 - B7FFFh. S tím počítám v další verzi ROMOSu. Další zvětšování by bylo asi možné jen tím způsobem, že by ROMOS při startu nahrál image ROM disku (složený z několika ROM modulů-kvůli omezení max. 64 kB / modul) někam na vyšší adresy nad 1 MB a pak by právě potřebné sektory stránkoval v okně na nižších adresách pod 1 MB. To by ale vyžadovalo progamování v chráněném módu a s tím nemám v assembleru žádné zkušenosti. Otázka je, zdali by se to vůbec vyplatilo, protože stejně zůstáváme omezeni relativně malým volným prostorem ve FlashROM. Pro náročnější aplikace je vhodnější použít např. paměťovou kartu CompactFlash s redukcí na IDE. Q: Lze tedy použít adresy B0000 - B7FFFh nebo ne? A: Bohužel jsem zjistil že nikoliv! Když jsem nahrál prázdnou 4kB ROM (jedinou instrukcí bylo RETF) na adresu B000:0000h (zkoušel jsem i B400h), tak při POSTu PC zatuhlo a musel jsem provést hotflash. Takže jediný použitelný rozsah je D0000 - DFFFFh (64 kB), nic víc. |