先简单说明下 vmlinux 和 vmlinuz 的关系
vmlinux是一个包含linux kernel的静态链接的可执行文件,文件类型是linux接受的可执行文件格式之一(ELF、COFF或a.out)。
vmlinuz是可引导的,压缩的linux内核,“vm”代表的“virtual memory”。vmlinuz是vmlinux经过gzip和objcopy(*)制作出来的压缩文件。vmlinuz不仅是一个压缩文件,而且在文件的开头部分内嵌有gzip解压缩代码。所以你不能用gunzip 或 gzip –dc解包vmlinuz。
拿到一个 vmlinuz 后解压缩的方法如下
[root@centos boot]# od -t x1 -A d vmlinuz | grep "1f 8b 08"
0013408 ff e0 1f 8b 08 00 ea 80 b9 52 02 03 ec 5b 7f 74
[root@centos boot]# dd if=vmlinuz bs=1 skip=0013410 | zcat > vmlinux
gzip: stdin: decompression OK, trailing garbage ignored
记录了9195934+0 的读入
记录了9195934+0 的写出
9195934字节(9.2 MB)已复制,51.5023 秒,179 kB/秒
这里特别解释一下 skip=0013410 这个数的计算方法,就是0013408这个数
+ 0013408与1f 8b 08 00之间间隔的数字个数
= 得出的结果
示例中间隔了2个数字 ff e0
,所以是 0013408+2=0013410
再举一个例子
[root@centos boot]# od -t x1 -A d vmlinuz-2.6.32-358.el6.x86_64 | grep "1f 8b 08"
0014432 48 8d 83 e0 3e 3d 00 ff e0 1f 8b 08 00 78 bc 26
根据输出可以得出 skip=0014432+9=001441=0014441
(END)