要約:CrashkernelはRAMのアドレス512 MBから始まりますkexec -e/-l
が、そうではありませんkexec -p
。なぜですか?
Marvell Armada XP(MV78460)(4コアARMv7)および1 GB RAMを使用する組み込みプラットフォーム。
kexec-tools
(2.0.10)を使用しています。
履歴:kexec -l
3.4.91カーネルと--atags
)のRAMディスクとコマンドライン引数を使用すると、リカバリカーネルが正しく起動され、設定されたものkexec -e
に関係なく(に従って)RAMの先頭に配置されているように見えます。/proc/iomem
RAMスペースを予約するために起動オプションを使用するときは、高いメモリアドレスを使用する必要があります。それ以外の場合は、要求された領域がすでに使用中であるというメッセージが表示されます。だから私たちは設定しました。カーネルでは使用されません。--mem-min
--mem-max
crashkernel
crashkernel=128M@512M
kexec -p
CONFIG_AUTO_ZRELADDR=y
現在の状態:再配置可能なカーネル()は上位128 MB以内になければならないことがわかっていますが、これは私たちにとって不可能です。だから私は標準のカーネル構成を中心に作業していCONFIG_ARM_PATCH_PHYS_VIRT
ますno
。私が設定したマシンに1つを追加する必要があります。これで、カーネルを正常に使用して起動できます。サイズが512MBであることがわかります。しかし、それを構成してパニックを起こすと、コンソールは話し、永遠に沈黙を維持します。CONFIG_PHYS_OFFSET
0x20000000
Makefile.boot
zreladdr-y := 0x20008000, params_phys-y := 0x20000100, initrd_phys-y := 0x20800000
kexec -l
kexec -e
--mem-min
-p
Loading crashdump kernel... Bye!
すべてのファイルとすべてはRAMにのみあります。
私は何を間違えることができましたか? (良い状況でも)解凍エラーを心配する必要がありますか?
From dmesg:
Reserving 128MB of memory at 512MB for crashkernel (System RAM: 760MB)
root@host:~# cat /proc/iomem
00000000-3bff9fff : System RAM
00008000-00724f43 : Kernel code
0076e000-0087553f : Kernel data
20000000-27ffffff : Crash kernel
(some RAM at the end is reserved for persistent storage, that's why it doesn't add up to 1GB)
成功事例:
root@host:~# kexec -l -t zImage --command-line="console=ttyS0,38400 earlyprintk=ttyS0 root=/dev/ram rdinit=/sbin/init rw irqpoll maxcpus=1 reset_devices" --atags --initrd=./initramfs.cpio.gz -d --mem-min=0x20000000 --mem-max=0x28000000 ./zImage_fixed_addr
Try gzip decompression.
Try LZMA decompression.
lzma_decompress_file: read on ./zImage_fixed_addr of 65536 bytes failed
kernel: 0xb6c06008 kernel_size: 0x3db659
kexec_load: entry = 0x20008000 flags = 0x280000
nr_segments = 3
segment[0].buf = 0x40e98
segment[0].bufsz = 0x3f0
segment[0].mem = 0x20001000
segment[0].memsz = 0x1000
segment[1].buf = 0xb6c06008
segment[1].bufsz = 0x3db659
segment[1].mem = 0x20008000
segment[1].memsz = 0x3dc000
segment[2].buf = 0xb5ade008
segment[2].bufsz = 0x1127516
segment[2].mem = 0x20f6e000
segment[2].memsz = 0x1128000
root@host:~# kexec -e
Starting new kernel
Booting Linux on physical CPU 0x0
...
起動後:
root@vanilla:~# cat /proc/iomem
20000000-3fffffff : System RAM
20008000-206dd237 : Kernel code
20720000-2078f54f : Kernel data
失敗したケース:
root@host:~# kexec -p -t zImage --command-line="console=ttyS0,38400 earlyprintk=ttyS0 root=/dev/ram rdinit=/sbin/init rw irqpoll maxcpus=1 reset_devices" --atags --initrd=./initramfs.cpio.gz -d ./zImage_fixed_addr
Try gzip decompression
Try LZMA decompression.
lzma_decompress_file: read on ./zImage_fixed_addr of 65536 bytes failed
kernel: 0xb6b69008 kernel_size: 0x3db659
phys_offset: 0
kernel symbol _stext vaddr = c0008240
page_offset is set to c0000000
get_crash_notes_per_cpu: crash_notes addr = 10f525c, size = 1024
Elf header: p_type = 4, p_offset = 0x10f525c p_paddr = 0x10f525c p_vaddr = 0x0 p_filesz = 0x400 p_memsz = 0x400
get_crash_notes_per_cpu: crash_notes addr = 10ff25c, size = 1024
Elf header: p_type = 4, p_offset = 0x10ff25c p_paddr = 0x10ff25c p_vaddr = 0x0 p_filesz = 0x400 p_memsz = 0x400
get_crash_notes_per_cpu: crash_notes addr = 110925c, size = 1024
Elf header: p_type = 4, p_offset = 0x110925c p_paddr = 0x110925c p_vaddr = 0x0 p_filesz = 0x400 p_memsz = 0x400
get_crash_notes_per_cpu: crash_notes addr = 111325c, size = 1024
Elf header: p_type = 4, p_offset = 0x111325c p_paddr = 0x111325c p_vaddr = 0x0 p_filesz = 0x400 p_memsz = 0x400
vmcoreinfo header: p_type = 4, p_offset = 0x7f1330 p_paddr = 0x7f1330 p_vaddr = 0x0 p_filesz = 0x1000 p_memsz = 0x1000
Elf header: p_type = 1, p_offset = 0x0 p_paddr = 0x0 p_vaddr = 0xc0000000 p_filesz = 0x20000000 p_memsz = 0x20000000
Elf header: p_type = 1, p_offset = 0x28000000 p_paddr = 0x28000000 p_vaddr = 0xe8000000 p_filesz = 0x13ffa000 p_memsz = 0x13ffa000
elfcorehdr: 0x27f00000
crashkernel: [0x20000000 - 0x27ffffff] (128M)
memory range: [0 - 0x1fffffff] (512M)
memory range: [0x28000000 - 0x3bff9fff] (319M)
kernel command line: "console=ttyS0,38400 earlyprintk=ttyS0 root=/dev/ram rdinit=/sbin/init rw irqpoll maxcpus=1 reset_devices elfcorehdr=0x27f00000 mem=130048K"
kexec_load: entry = 0x20008000 flags = 0x280001
nr_segments = 4
segment[0].buf = 0x416e0
segment[0].bufsz = 0x410
segment[0].mem = 0x20001000
segment[0].memsz = 0x1000
segment[1].buf = 0xb6b69008
segment[1].bufsz = 0x3db659
segment[1].mem = 0x20008000
segment[1].memsz = 0x3dc000
segment[2].buf = 0xb5a41008
segment[2].bufsz = 0x1127516
segment[2].mem = 0x20f6e000
segment[2].memsz = 0x1128000
segment[3].buf = 0x412a0
segment[3].bufsz = 0x400
segment[3].mem = 0x27f00000
segment[3].memsz = 0x1000
<cause crash via SysRq>
Loading crashdump kernel...
Bye!