On 9/21/07, Mika Penttilä <mika.penttila@xxxxxxxxxxx> 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@0K memmap=15M@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 _______________________________________________ linux-pm mailing list linux-pm@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linux-foundation.org/mailman/listinfo/linux-pm