hibernace linuxu

Mikulas Patocka mikulas na artax.karlin.mff.cuni.cz
Neděle Únor 20 23:17:27 CET 2000


>Bylo by potreba napsat aplikaci, ktera by ulozila obraz RAM, swapu a
>stav
>registru (jeste neceho?) do souboru.

To neni tak jednoduche - tim, ze ukladas na disk (nebo dokonce do
souboru) modifikujes spoustu veci v pameti - a pokud ukladas pamet,
kterou soucasne modifikujes, vyjde z toho mismas.

Jiz zminovany swsusp to resi tak, ze vyswapuje co se da a pak udela
kopie vsech stanek a ty kopie uklada.

>Bootovani by probehlo normalne,
>modifikoval by se init. Bootovani kernelu nemuzeme preskocit,
>inicializuje
>se pri nem hardware.

Zachovani stavu hardware pri hibernaci nemuze fungovat. Dejme tomu, ze
se nejaka karta po inicializaci nachazi ve stavu S. Pak ji nejak
pouzivas a driver ji nastavi do stavu P. Pak hibernujes a po bootu
bude karta nastavena do stavu S, ale driver (nacteny z disku) si bude
myslet, ze je ve stavu P.

Nekdy by to fungovat mohlo, ale neni na to zadna zaruka. Treba SCSI
jim pry v swsusp nefunguje, IDE funguje.

>Prvnim krokem initu by byl skript na uspani. Ten
>by se podival treba do /var/lib po souboru treba hibernace.bin. Pokud by
>ho nenasel, skript by skoncil a init by normalne bootoval. Ale pokud by
>ho
>nalezl, musela by se ulozena data nejak nahrat.
>
>Tady jsou dva problemy -
>
>1\ pokud bychom pouzili nejakou jednoduchou smycku, nacti data z disku -
>zkopiruj do RAM, tak bychom prepsali tuto smycku a byli bychom v tezkych
>potizich
>
>Prvni problem se da obejit. Hibernacni program by nasel dostatecne velky
>blok volne pameti v RAM a zapsal by jeji adresu do hlavicky dumpu.
>Skript
>by po precteni hlavicky nahral inicializacni proceduru na toto misto. A
>pri kopirovani dat by dany usek preskocil.

Nacitani dat z disku neni jedna smycka. Vola se tam spousta funkci.
(muzes si v kernelu najit ll_rw_block - a pak se podivat, jake funkce
ze z ni volaji - a jake funkce se volaji z tech funkci atd..) Reseni
je opet - data nacitat do pameti na jina mista a pak to prekopirovat
bez hrabnuti na disk.

>Posloupnost akci
>
>1\ uzivatel spusti hibernaci (H)
>
>1a\ v tuto chvili se musi nejak zastavit vsechny ostatni procesy
>
>2\ hibernace najde volnou RAM pro probouzeci proceduru (PP). pokud neni
>volne misto, tak jadro holt bude muset neco odswapovat
>
>3\ kontrola, zda je na disku dost mista :-)
>
>4\ ulozi se hlavicka logu, ktera obsahuje napriklad registry a informace
>o
>umisteni a velikosti diry pro PP
>
>5\ ulozi se virtualni pamet

Nemas na mysli spis fyzickou pamet?

>6\ vypocte se obsah (asi) registru, aby po probuzeni presla
>kontrola na bod 14
>
>7\ vypne se pocitac
>
>8\ zapne se pocitac, nabootuje kernel
>
>9\ prvnim krokem initu je probouzeci skript (PS)
>
>10\ PS najde /var/lib/hibernace.bin a precte hlavicku
>
>11\ umisti PP do oznacene diry v RAM
>
>12\ PS zacne cist hibernace.bin a kopiruje data do RAM a swap s vyjimkou
>diry
>
>13\ PS nastavi registry a mozna i VFS tabulky jadra tak, aby procesor
>vykonal 14\
>
>14\ vykonava se opet hibernace, presneji jeji zaverecny kod, ten smaze
>/var/lib/hibernace.bin a program skonci. Pocitac je ve stavu, kde byl
>pred
>spustenim H
>
>
>
>Co vy na to? Ja jsem bohuzel jen obycejny user space programator a
>vnitrnostem linuxu moc nerozumim. Jinak bych to asi zkusil napsat. Tuto
>konferenci ale cte nekolik vybornych kernelovych vyvojaru (od USB, pres
>PCI az po port na Sparc). Nestalo by to za pokus?

Jediny zpusob, jak zajistit, aby vsechna zarizeni po probuzeni
fungovala, je dat podporu pro hibernaci do vsech driveru. A to jde
udelat jen tezko (vetsinou nesezeneme nikoho, kdo danou kartu ma, aby
vyzkousel, zda kod funguje).


Dalsi moznosti je hibernovat jen userspace procesy a ne cely kernel -
ale pak se nam zase muzou stracet spojeni mezi temi procesy.

Mikulas


Další informace o konferenci Linux