U.K. flag click here for English version

Co je ROMOS?    Požadavky    Instalace    Download    Technické detaily    FAQ

Projekt ROMOS


logo


      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)

NO LAMERZ
VAROVÁNÍ PRO LAMY:
Buďte si jisti, že víte přesně co děláte! Experimentováním se zde popisovanými programy si totiž můžete snadno zmrvit BIOS tak, že vaše PC už nenabootuje. Pokud k tomu dojde, bude potřeba vyndat FlashROM čip a přeflashovat ho v programátoru nebo zkusit hotflash. Takže mějte při ruce zálohu!
ROMOS je poskytován tak jak je, bez žádných záruk. Zkoušel jsem ho pouze na svém počítači takže nemůžu zaručit, že bude fungovat i na ostatních počítačích.
Doporučuji si přečíst sekci technické detaily. U nových Award BIOSů může dojít k nečekaným komplikacím, viz moje zkušenosti se základní deskou Gigabyte GA-P31-DS3L.
NO LAMERZ

      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 ;-)

Bootovací proces s ROMOSem na mojem PC

      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:

 No. Item-Name         Original-Size   Compressed-Size Original-File-Name
================================================================================
  0. System BIOS       20000h(128.00K) 14E93h(83.64K)  original.tmp
  1. XGROUP CODE       082F0h(32.73K)  05877h(22.12K)  awardext.rom
  2. ACPI table        02214h(8.52K)   00E51h(3.58K)   ACPITBL.BIN
  3. VRS ROM           02280h(8.62K)   014BBh(5.18K)   ANTI_VIR.BIN
  4. EPA LOGO          0279Ch(9.90K)   0132Ah(4.79K)   SKULL4.EPA
  5. CPU micro code    0A800h(42.00K)  060D8h(24.21K)  cpucode.bin
  6. ISA ROM[A]        10000h(64.00K)  0F437h(61.05K)  romos.bin

  Total compress code space  = 34E93h(211.64K)
  Total compressed code size = 3324Fh(204.58K)
  Remain compress code space = 01C44h(7.07K)

                          ** Micro Code Information **
Update ID  CPUID  |  Update ID  CPUID  |  Update ID  CPUID  |  Update ID  CPUID
------------------+--------------------+--------------------+-------------------
SLOT1  13   0630  |  SLOT1  20   0632  |  SLOT1  36   0633  |  SLOT1  37   0634
SLOT1  40   0650  |  SLOT1  40   0651  |  MOBILE 2D   0652  |  SLOT1  10   0653
SLOT1  0A   0660  |  PPGA   03   0665  |  MOBILE 07   0670  |  SLOT1  03   0671
SLOT1  10   0672  |  SLOT1  0E   0673  |  SLOT1  14   0680  |  PPGA   14   0681
PPGA   14   0683  |  PPGA   08   0686  |  PPGA   01   068A  |  SLOT1  07   06B0
SLOT1  1D   06B1  |

a zde jak to vypadá v případě nového AMI BIOSu:
AMI MMTool BIOS modules listing

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:

dd 000000001h ; Header Version
dd 000000013h ; BIOS Update ID
dd 008271996h ; Date (BCD)
dd 000000630h ; CPUID of target processor
dd 0f316fc3bh ; Checksum (zero-align to DWord sum)
dd 000000001h ; Loader Version
dd 000000010h ; CPU Flags
dd 000000000h ; Size of pure microcode data (for >2048 B only)
dd 000000000h ; Total size (for >2048 B only)
dd 000000000h ; reserved
dd 000000000h ; reserved
dd 000000000h ; reserved
V BIOSu stačí mít pouze mikrokód pro váš stávající CPU (číslo CPUID). Zde je tedy jedna možnost, jak ve FlashROM uvolnit nějaké místo. Po vložení upraveného cpucode.bin pomocí CBROM není třeba dále provádět žádné opravy kontrolních součtů. Pro práci s mikrokódy jsem napsal dva programy. CPU Microcode Loader vypíše aktuální ID mikrokódu nahraného v CPU a umožní za běhu nahrát mikrokód ze souboru do CPU (tato změna má účinnost pouze do vypnutí nebo studeného restartu PC). Mikrokód se do CPU nahrává následující sekvencí: do EAX se vloží lineární adresa ukazující na začátek dat mikrokódu (včetně hlavičky), do ECX se vloží konstanta 00000079h, do EDX se vloží 0 a nakonec se provede privilegovaná instrukce WRMSR. Některé BIOSy také podporují rozšířenou službu INT 15h (funkce D042h), která umožňuje mikrokód zapsat/přečíst přímo do/z FlashROM, podrobnosti viz: Pentium Pro Processor BIOS Writer’s Guide. Druhý program Binary CPU Microcode file info umožňuje prohlížet informace o mikrokódech a rozdělit soubor cpucode.bin na 2kB soubory pojmenované podle odpovídajícího CPUID. Codemake.bat pak spojí vybrané soubory s mikrokódy do jednoho, který lze použít jako nový cpucode.bin.
      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:

memory map

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:
	
DB 55		; header 1st byte
DB AA		; header 2nd byte
DB xx		; size in 512B blocks
JMP xxxx	; jump to our code
DB 0		; reserved byte for checksum
xxxx		; our code
.
.
.
RETF 		; return from ROM code
      Pro jistotu je dobré si hned na začátku uložit všechny registry CPU. Zásobník má obvykle nastavenou malou hloubku, proto jsem si ho přenastavil na 4000:FFFFh. Je třeba mít na paměti, že pokud se v kódu dopustíme chyby, která způsobí zatuhnutí nebo restart počítače, tak není způsob, jak spuštění ROM kódu zabránit. Pak je třeba přeflešovat BIOS v programátoru nebo použít hotflash! Takových chyb jsem se taky dopustil, neb je kód téměř nemožné debugovat. Proto jsem jako první napsal část kódu (label BEGIN), která mi dá na výběr, jestli pokračovat dál v provádění ROM kódu nebo ho ukončit. K tomu jsem využil testování vlajky klávesy ScrollLock na adrese 0000:0417h bit 4. Pokud ScrollLock nebyl stisknut, ROMOS obnoví uložené registry a vrátí kontrolu zpět BIOSu. Jinak pokračuje v provádění kódu ROM. Pokud se tak v dalším kódu vyskytne chyba (za labelem BOOT), jednoduše stačí PC restartovat a chybu opravit.
      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 čarou

Q: 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.



rayer^seznam*cz

zpět na hlavní stránku

aktualizováno 19.12.2009 v 23:18