hibernace linuxu

Leoš Literák literakl na seznam.cz
Neděle Únor 20 12:08:48 CET 2000


Cau,

nedavno jsem slysel chvalit W2K. Ze pry maji hibernaci a jak je to
uzasne.
Pokud nevite, co to je, tak napriklad na lepsich noteboocich se pri
zavreni vika nekam ulozi obraz pameti a notebook se vypne. Pri startu se
obraz nahraje a vy pokracujete v praci tam, kde jste skoncili. No a mne
napadlo, ze by nemuselo byt tak tezke udelat to same do linuxu.
Tento dopis berte spise jako namet pro diskusi.

Bylo by potreba napsat aplikaci, ktera by ulozila obraz RAM, swapu a
stav
registru (jeste neceho?) do souboru. Bootovani by probehlo normalne,
modifikoval by se init. Bootovani kernelu nemuzeme preskocit,
inicializuje
se pri nem hardware. 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

2\ pokud by se prvni krok uspesne povedl, system by se znovu automaticky
hibernoval, protoze by se v pameti znovu ocitl program na hibernaci.

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.

Problem dva ma taky teoreticke reseni. Hibernacni program by po
dokonceni
dumpu vypocetl oblast pameti, kterou zabira a modifikoval by ulozeny
dump
tak, aby po probuzeni se IP registr dostal na konec hibernacniho
programu.
Poslednim krokem hibernacniho programu by bylo smazani dumpu.


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

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?

			LL

-- Leos Literak   http://www.penguin.cz/~literakl/
-- Email          literakl na penguin.cz, literakl na seznam.cz
-- Linux Hardware http://hardware.penguin.cz/



Další informace o konferenci Linux