e-mail    Debatní kniha    Mapa stránek    Hlavní  
 perličky 
 

Boot z mechaniky B:?...nič jednoduchšie!

Autor neznámý

Väčšina našich stolných spoločníkov (286,386,486,...) má v konfigurácii dve disketové mechaniky, a to 5.25" a 3.5". Ak aj vášho priteža kŕmite obidvoma typmi diskiet, tak práve vám sú určené nasledujúce riadky.

Na tieto dve disketové mechaniky sa spravidla odvolávame cez jednopísmenové označenie, tj. A: alebo B:. To, ktorá disketová mechanika bude počúvať na A: a ktorá na B: je dané technickými prostriedkami počítača (hardware), v tomto prípade umiestnením na plochom kábli idúcom z radiča. Mechanika na konci kábla (za prekrútenou časťou) počúva na meno A: a tá bližšia k radiču zas na meno B:. V súlade s uvedeným sú jednotlivé typy mechaník nastavené aj v CMOS (Setup). Pri zavádzaní sytému (boot) sa BIOS podža všetkých historických zvyklostí zaujíma len (a len) o disketovú mechaniku A:. Ak sa BIOSu nepodarí zaviesť systém z A: (napr. disketa nie je vložená do mechaniky), tak potom sa obráti na pevný disk C:. Ak ani tu neuspeje, systém spravidla končí hlásením:

NO ROM BASIC - SYSTEM HALTED

To znamená, že nie je možné zaviesť ani z A:, C:, ROM-BASIC.
Pozn. -- Niektoré verzie AMI-BIOS umožňujú stanoviť poradie bootovania, (tzv. System Boot Up sequence -- C:, A: alebo A:, C:), ale zaviesť systém z B: aj tak neumožňujú.

;**************************************************************** ;* 20.8.1993 (c) Boot Floppy Swapper A: <-> B: by R. Puskajler* ;**************************************************************** SectorSize equ 200h ; vežkosť BootSektora na diskete Cr equ 0dh Lf equ 0ah BootSignature equ 0aa55h ; značka označujúca platný BootSector ;---------------; ; BIOS data ; ;---------------; FreeMem equ 0413h ; adresa XXX KB základnej RAM /640/ ; interrupts DiskIO equ 013h ; sulžby pre prácu s diskami BootStrap equ 019h ; zavedenie systému Video equ 010h ; služby pre prácu s obrazovkou ; services GetDrvParams equ 08h ; služba vráti info o disku CharTTY equ 0Eh ; služba zapíše znak /emuluj TTY/ ; --------------------------------------------------------------- ; zavádzač /LOADER/ pre zavedenie jadra do horného 1kB RAM, ; presmerovanie potrebných vektorov a výpis textu o aktivovaní ; programu ; --------------------------------------------------------------- assume cs:LOADER LOADER segment ORG 07C00h Start:jmp short cont ; preskoč OEM info a pokračuj ... db 0 db '-Boot B-' ; OEM info /pre PC-Tools, NDD, .../ cont: cli ; zakáž prerušenie počas práce s SP xor ax,ax ; znuluj segmentové registre mov ss,ax ; SS <- 0000 mov ds,ax ; DS <- 0000 mov es,ax ; ES <- 0000 mov ax,offset Start ; a nastav SP na začiatok programu mov sp,ax ; pretože SP rastie smerom dolu sti ; povol prerušenie cld ; increment v reťazcových operáciach ; mov si, DiskIO*4 ; adresu /segment:offset/ originálneho mov di, offset LOADER:OldDiskIO ; DiskIO presuň do [OldDiskIO] lodsw ; AX <- offset stosw ; [OldDiskIO] <- AX lodsw ; AX <- segment stosw ; [OldDiskIO+2] <- AX ; mov ax,ds:[ FreeMem ] ; výkonne jadro bude presunuté do dec ax ; posledného kB v základnej RAM preto mov ds:[ FreeMem ],ax ; vožná RAM zmenšená o 1 kB a ; vypočítame mov cl,6 ; adresu kam presunuť výkonné jadro shl ax,cl ; 1024/16=64=2^6 takže 6 rotácií pre ; výpočet seg. xor di,di ; a offset = 0 mov es,ax ; ciežová adresa pre presun je /ES:DI/ ; mov ax,es ; a to je aj adresa nového DiskIO, tak ; nastav mov ds:[ DiskIO * 4 ],di ; offset a mov ds:[ DiskIO*4+2 ],ax ; segment do tabužky Int vektorov ; mov si,offset LOADER:Kernel ; zdrojová adresa /DS:SI/, ; ciežová /ES:DI/ mov cx,KernelSize ; vežkosť jadra je počet presúvaných ; bytes rep movsb ; presun výkonného bloku na svoje ; miesto ; text: ; a výpis správy o aktivovaní programu mov si, offset info ; ukazatež na text zakončený 00h mov bl,0ffh ; attr. mov ah,CharTTY ; služba emuluj TeleType text_loop: ; opakuj pre všetky znaky reťazca lodsb ; znak reťazca do al or al,al ; koniec reťazca ? jz boot ; áno: skoč na návestie boot int Video ; nie: vytlač znak reťazca na obrazovku jmp short text_loop ; opakuj v slučke ; boot: int BootStrap ; volaj zavedenie systému /BIOS/ jmp short text ; ... ak by náhodou, tak skoč ; info: db Cr, Lf, Lf db ' Boot Floppy Swapper ACTIV ... ', Cr, Lf db Cr, Lf

Takže keď obdržíte program, ktorý je nutné "nabootovať", práve na inom type diskiet, ako idú do vašej mechaniky A:, strávite radostné chvíle pri jednej z možností:

  • zohnať (prehrať) daný program na požadovaný typ diskiet
  • "dohovoriť" počítaču manuálne, tj. otvoriť ho, nájsť kábel idúci z radiča na disketovej mechaniky, prehodiť poradie mechaník na kábli, možno aj konektorov (niekedy treba aj mechanicky uvožniť mechaniky, je ak kábel dostatočne krátky), zodpovedajúco prepísať hodnoty v CMOS podža typov mechaník (Setup)

Ak ste už druhý bod niekedy absolvovali, viete o čom je práve reč. Do tejto situácie sa dostal aj môj kolega s MS-DOSom 6.0, ktorý mal na disketách 3.5" a jeho A: je samozrejme 5.25" (Murphyho zákony...).

Mojím opisom podža druhého bodu nebol moc nadšený (veď je predsa lekár), a tak vznikol nasledujúci program, ktorý vám umožní "bootovať" z mechaniky B: (z A: nabootujete aj bez neho) bez zasahovania do útrob vášho spoločníka. Jedinou podmienkou je zasunutá špeciálna disketa v A:.

Samotný program je úžasne jednoduchý. Celá pointa je nasledovná:

  • umiestni sa rezidentne do RAM (posledný 1 KB)
  • presmeruj DiskIO (Int13h) na seba
  • programovo prehadzuj mechaniky A: a B: (register DL)
  • po návrate obnov označenie mechaník (reg. DL), ale s jednou výnimkou: keď je v registri DX iná užitočná informácia (služba GetDrivePars (= vráť informácie o požadovanom drive))

Musíme si však uvedomiť, že v čase zavádzania sytému nemáme k dispozícii služby DOSu (ten predsa ešte odpočíva niekde na disku), ale môžeme použiť len služby BIOSu.

Celý program je umiestnený v tzv. boot sektore na diskete v mechanike A:. Tu čaká na na zavádzanie systému. BIOS zavedie boot sektor do RAM na 0000:7C00 a predá mu riadenie. Na tento okamih program čakal. Umiestni sa do horného 1 KB v základnej RAM (obyčajne 640 KB) a zmenší vožnú RAM o tento 1 KB, čím sa chráni proti prepísaniu. Presmeruje na seba DiskIO, čím získa kontrolu nad diskovými operáciami. Vypíše text o tom, čo bude bude až do nasledujúceho bootovania vykonávať (A: $<->$ B:) a zavolá zavedenie systému z A:. Potom už len čaká a požiadavky na disk A: premení na požiadavky na disk B: (a naopak). Tým oklame celý počítač a od tohoto okamihu je to to isté, ako by ste práve prehodili káble podža druhého bodu.

db ' ... drive A: is B: and B: is A:', Cr, Lf db ' (c) 1993 version 1.1 by R. Puskajler', Cr, Lf db Cr, Lf db Lf, 0 LoaderSize equ ($ - Start +15)/16*16 ; vežkosť zavádzacej časti zarovnaná ; na ďalší paragraf LOADER ends ; --------------------------------------------------------------- ; výkonné jadro /KERNEL/ na prehadzovanie A: <-> B:, sedí v ; hornom 1kB základnej RAM a ostane v pamati aktívne až do nového ; zavedenia systému ; --------------------------------------------------------------- assume cs:NewDiskInt NewDiskInt segment Kernel: ; nový DiskIO intr cmp ah,GetDrvParams ; má služba modifikovať dx ? jz GetDrvPars ; áno: skok na GetDrvPars ; nie: pokračuj push dx ; uchovaj dx test dl,0FEh ; disk A: alebo B: ? jnz NoAB ; nie: skok na NaAB xor dl,01h ; áno: vymeň A: <-> B: NoAB: pushf ; priprav Flags do zásobníka /pre IRET/ call dword ptr cs:[OldDiskIO] ; call far originálny DiskIO ; /končí IRET/ pop dx ; obnov dx retf 2 ; odstráň Flags zo zásobníka /po Int13h/ GetDrvPars: ; služba vráti výsledok v dx test dl,0FEh ; disk A: alebo B: ? jnz NoAB2 ; nie: skok na NoAB2 xor dl,01 ; áno: vymeň A: <-> B: NoAB2: ; pokračuj skokom do originálnej DiskIO jmp dword ptr cs:[OldDiskIO] ; rutiny /končí IRET/ OldDiskIO dw ? ; offset originálnej DiskIO rutiny dw ? ; segment ... KernelSize equ $ - Kernel ; vežkosť jadra db (SectorSize - LoaderSize - KernelSize - 2) dup (88h) ; doplň znakmi 88h tak, aby značka bola ; presne na konci BOOT sektora dw BootSignature ; značka NewDiskInt ends END

Samotný program pozostáva z dvoch častí:

  • LOADER -- vypočíta polohu pre Kernel, zavedie Kernel do RAM, presmeruje DiskIO, vypíše text a zavolá zavedenie systému
  • KERNEL - je volaný pri každom DiskIO, prehadzuje len mechaniky A: <-> B:

    Preklad je napr.:

    ...>tasm bootb.asm<ENTER> ...>tlink bootb.obj<ENTER> Ignorujeme Warning: No Stack a tým získame bootb.exe.

    Posledným krokom je zapísanie bootb.exe do boot sektora na disketu v mechanike A:. Tým z nej získame špeciálnu "prehadzovaciu" disketu. To docielime napr. s debugom. Vložíme do A: disketu (najlepšie nesystémovú) a zadáme:

    ...>debug bootb.exe<ENTER> -W7C00 0 0 1<ENTER> -q<ENTER>

    Tým je dielo dokončené, špeciálna disketa vygenerovaná (je to tá, ktorá je práve teraz v A:)...a človek opäť zvíťazil nad počítačom.

    Všetky data na diskete v A: ostanú nepoškodené, prepíše sa len boot sektor, avšak nie je možné zaviesť systém z tejto diskety (toto obmedzenie sa uplatní, len ak disketa bola predtým systémová).

    Ak váš AMI-BIOS má System Boot Up Sequence, nastavte ho na A:, C:, inak sa program nemá ako aktivovať a boot B: sa nekoná.




  • Pascal - hlavní
    Překladače
    Vlastní články
    Převzaté články
    Věci na stáhnutí
    Odkazy k tématu
    BP7 buglist
    Chyba Run-time 200

    BASIC