[linux-pm] [RFC][PATCH 0/2 -mm] kexec based hibernation -v3

huang ying huang.ying.caritas at gmail.com
Fri Sep 21 09:44:57 EDT 2007


On 9/21/07, Mika Penttilä <mika.penttila at kolumbus.fi> wrote:
>
> > Usage:
> >
> > 1. Compile kernel with following options selected:
> >
> > CONFIG_X86_32=y
> > CONFIG_RELOCATABLE=y # not needed strictly, but it is more convenient with it
> > CONFIG_KEXEC=y
> > CONFIG_CRASH_DUMP=y # only needed by kexeced kernel to save/restore memory image
> > CONFIG_PM=y
> > CONFIG_KEXEC_JUMP=y
> >
> > 2. Download the kexec-tools-testing git tree, apply the kexec-tools
> >    kjump patches (or download the source tar ball directly) and
> >    compile.
> >
> > 3. Download and compile the krestore tool.
> >
> > 4. Prepare 2 root partition used by kernel A and kernel B/C, referred
> >    as /dev/hda, /dev/hdb in following text. This is not strictly
> >    necessary, I use this scheme for testing during development.
> >
> > 5. Boot kernel compiled for normal usage (kernal A).
> >
> > 6. Load kernel compiled for hibernating/restore usage (kernel B) with
> >    kexec, the same kernel as that of 5 can be used if
> >    CONFIG_RELOCATABLE=y and CONFIG_CRASH_DUMP=y are selected.
> >
> >    The --elf64-core-headers should be specified in command line of
> >    kexec, because only the 64bit ELF is supported by krestore tool.
> >
> >    For example, the shell command line can be as follow:
> >
> >    kexec -p -n /boot/bzImage --mem-min=0x100000 --mem-max=0xffffff
> >        --elf64-core-headers --append="root=/dev/hdb single"
> >
> > 7. Jump to the hibernating kernel (kernel B) with following shell
> >    command line:
> >
> >    kexec -j
> >
> > 8. In the hibernating kernel (kernel B), the memory image of
> >    hibernated kernel (kernel A) can be saved as follow:
> >
> >    cp /proc/vmcore .
> >    cp /sys/kernel/kexec_jump_back_entry .
> >
> Here we save also kernel B's pages.

No, the kernel B's pages will not be saved. Because when we build the
elfcore (/proc/vmcore) header, we exclude memory area used by kernel
B. The details can be found in kexec-tools patches.

> > 9. Shutdown or reboot in hibernating kernel (kernel B).
> >
> > 10. Boot kernel (kernel C) compiled for hibernating/restore usage on
> >     the root file system /dev/hdb in memory range of kernel B.
> >
> >     For example, the following kernel command line parameters can be
> >     used:
> >
> >     root=/dev/hdb single memmap=exactmap memmap=640K at 0K memmap=15M at 1M
> >
> 0-640K from kernel A overrides 0-640K of kernel C at restore time.

No. The 0-640K is not in the memory image of kernel A. It is excluded
from memory image of kernel A in /sbin/kexec. Not very strictly, there
is one backup page for each page in 0-640K, after jump back, the
backup page will be swapped with the target page (in 0-640K). No
information is lost. So you can jump back and forth, for arbitrary
times.

> > 11. In restore kernel (kernel C), the memory image of kernel A can be
> >     restored as follow:
> >
> >     cp kexec_jump_back_entry /sys/kernel/kexec_jump_back_entry
> >     krestore vmcore
> >
> >
> This steps replaces kernel C's pages with kernel B's (at least 15m-16m),
> saved at step 8, so these kernels should be equal? Or they must be
> physically located in non-overlapping regions such that C is in B's
> memory range but non-overlapping. The proposed setup doesn't guaratee
> this afaics.

No. These pages are excluded from /proc/vmcore. These kernels need not
to be equal.

> > 12. Jump back to hibernated kernel (kernel A)
> >
> >     kexec -b
> >

Best Regards,
Huang Ying


More information about the kexec mailing list