浅析pc机上如何将vmlinuz-2.6.31-14-generic解压出vmlinux
luther@gliethttp:~$ vim /boot/grub/grub.cfg
可以看到我们进入的系统的内核为
linux    /boot/vmlinuz-2.6.31-14-generic
查找1F 8B 08这是gzip的标志头
我找到的内容为
0000 366C: 1F 8B 08 00 8C 80 D8 4A  02 03 EC 3A 7F 74 53 55
0x0000366c等于13932
luther@gliethttp:~$ dd bs=1 skip=13932 if=/boot/vmlinuz-2.6.31-14-generic of=vmlinux.gz
luther@gliethttp:~$ file vmlinux.gz
vmlinux.gz: gzip compressed data, from Unix, last modified: Fri Oct 16 22:17:48 2009, max compression
luther@gliethttp:~$ gunzip vmlinux.gz
luther@gliethttp:~$ ll vmlinux
-rw-r--r-- 1 luther luther 7.9M 2010-05-16 12:06 vmlinux
luther@gliethttp:~$ vim linux-2.6.33.4/arch/x86/kernel/vmlinux_32.lds.S
// vim arch/x86/configs/i386_defconfig 我们获取的参数[luther.gliethttp]
// CONFIG_PAGE_OFFSET=0xC0000000
// CONFIG_PHYSICAL_START=0x100000
// #define __PAGE_OFFSET        _AC(CONFIG_PAGE_OFFSET, UL)
#define LOAD_OFFSET __PAGE_OFFSET 其值为0xC0000000
/* Physical address where kernel should be loaded. */
#define LOAD_PHYSICAL_ADDR ((CONFIG_PHYSICAL_START \
                + (CONFIG_PHYSICAL_ALIGN - 1)) \
                & ~(CONFIG_PHYSICAL_ALIGN - 1))
SECTIONS
{
  . = LOAD_OFFSET + LOAD_PHYSICAL_ADDR; // 0xC0000000 + 0x100000 = 0xc0100000是最终的地址
  phys_startup_32 = startup_32 - LOAD_OFFSET;
luther@gliethttp:~$ objdump -DS vmlinux |more
vmlinux:     file format elf32-i386
Disassembly of section .text.head:
c0100000 <.text.head>:
c0100000:    f6 86 11 02 00 00 40     testb  $0x40,0x211(%esi)
c0100007:    75 14                    jne    0xc010001d
c0100009:    0f 01 15 22 8e 74 00     lgdtl  0x748e22
c0100010:    b8 18 00 00 00           mov    $0x18,%eax
c0100015:    8e d8                    mov    %eax,%ds
c0100017:    8e c0                    mov    %eax,%es
c0100019:    8e e0                    mov    %eax,%fs
c010001b:    8e e8                    mov    %eax,%gs
c010001d:    fc                       cld   
c010001e:    31 c0                    xor    %eax,%eax
c0100020:    bf 00 a0 81 00           mov    $0x81a000,%edi
luther@gliethttp:~$ vbindiff vmlinux
0000 1000: F6 86 11 02 00 00 40 75  14 0F 01 15 22 8E 74 00  ......@u ....".t.  
0000 1010: B8 18 00 00 00 8E D8 8E  C0 8E E0 8E E8 FC 31 C0  ........ ......1.  
0000 1020: BF 00 A0 81 00 B9 A0 80  8A 00 29 F9 C1 E9 02 F3  ........ ..).....  
0000 1030: AB BF C0 56 7C 00 B9 00  04 00 00 FC F3 A5 8B 35  ...V|... .......5  
0000 1040: E8 58 7C 00 21 F6 74 0C  BF E0 2A 7C 00 B9 00 02  .X|.!.t. ..*|....  
0000 1050: 00 00 F3 A5 66 81 3D C6  58 7C 00 07 02 72 1C A1  ....f.=. X|...r..
0000 1060: FC 58 7C 00 3D 03 00 00  00 73 0E 8B 04 85 80 22  .X|.=... .s....."  
0000 1070: 7C 00 2D 00 00 00 C0 FF  E0 0F 0B BF 00 90 8A 00  |.-..... ........  
0000 1080: BA 00 A0 81 00 B8 03 00  00 00 8D 4F 67 89 0A 89  ........ ...Og...  
0000 1090: 8A 00 0C 00 00 83 C2 04  B9 00 04 00 00 AB 05 00  ........ ........  
0000 10A0: 10 00 00 E2 F8 BD 03 90  A4 00 39 E8 72 DC 81 C7  ........ ..9.r...  
0000 10B0: 00 00 00 C0 89 3D 80 A5  74 00 C1 E8 0C A3 84 F0  .....=.. t.......  
0000 10C0: 81 00 B8 67 B0 81 00 A3  FC AF 81 00 E9 6D 6B 46  ...g.... .....mkF  
而vmlinux的前0x1000字节为ELF标志头数据,真正的有效kernel数据从0x1000开始
luther@gliethttp:~$ vim linux-2.6.33.4/arch/x86/boot/compressed/vmlinux_32.lds
OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
OUTPUT_ARCH(i386)
ENTRY(startup_32)
SECTIONS
{
    /* Be careful parts of head_32.S assume startup_32 is at
     * address 0.
     */
    . = 0;
    .text.head : {
        _head = . ;
        *(.text.head) // 文件头信息
        _ehead = . ;
    }
    .rodata.compressed : {
        *(.rodata.compressed)
    }
    .text :    {
        _text = .;     /* Text */ // 从0x1000开始的kernel有效执行code机器码
        *(.text)
        *(.text.*)
        _etext = . ;
    }
    ......
}
让我们实际演练演练,我们读取释放到内存中的kernel代码
luther@gliethttp:~$ cat /proc/iomem |grep code
  00100000-00575553 : Kernel code
0x00100000等于1048576
0x00575553等于5723475
luther@gliethttp:~$ sudo dd bs=1 skip=1048576 count=208 if=/dev/mem 2>/dev/null | xxd -g 1
0000000: f6 86 11 02 00 00 40 75 14 0f 01 15 22 8e 74 00  ......@u....".t.
0000010: b8 18 00 00 00 8e d8 8e c0 8e e0 8e e8 fc 31 c0  ..............1.
0000020: bf 00 a0 81 00 b9 a0 80 8a 00 29 f9 c1 e9 02 f3  ..........).....
0000030: ab bf c0 56 7c 00 b9 00 04 00 00 fc f3 a5 8b 35  ...V|..........5
0000040: e8 58 7c 00 21 f6 74 0c bf e0 2a 7c 00 b9 00 02  .X|.!.t...*|....
0000050: 00 00 f3 a5 66 81 3d c6 58 7c 00 07 02 72 1c a1  ....f.=.X|...r..
0000060: fc 58 7c 00 3d 03 00 00 00 73 0e 8b 04 85 80 22  .X|.=....s....."
0000070: 7c 00 2d 00 00 00 c0 ff e0 0f 0b bf 00 90 8a 00  |.-.............
0000080: ba 00 a0 81 00 b8 03 00 00 00 8d 4f 67 89 0a 89  ...........Og...
0000090: 8a 00 0c 00 00 83 c2 04 b9 00 04 00 00 ab 05 00  ................
00000a0: 10 00 00 e2 f8 bd 03 90 a4 00 39 e8 72 dc 81 c7  ..........9.r...
00000b0: 00 00 00 c0 89 3d 80 a5 74 00 c1 e8 0c a3 84 f0  .....=..t.......
00000c0: 81 00 b8 67 b0 81 00 a3 fc af 81 00 e9 6d 6b 46  ...g.........mkF

浅析pc机上如何将vmlinuz-2.6.31-14-generic解压出vmlinux的更多相关文章

  1. 解压vmlinuz和解压initrd(initramfs)

    有时就算只得到一个Linux kernel的rpm包或者直接是编译后的vmlinuz和initrd的binary文件,也需要了解其中的一些细节,可能需要去查找这些binary有没有将我想要的patch ...

  2. 浅析PC机串口通讯流控制

    转自浅析PC机串口通讯流控制 我们在串行通讯处理中,常常看到RTS/CTS和XON/XOFF这两个选项,这就是两个流控制的选项,目前流控制主要应用于调制解调器的数据通讯中,但对普通RS232编程,了解 ...

  3. 十年前,女:“对不起,我不会喜欢你的,你不要再坚持了,就好比让 Linux 和 Windows 同时运行在一台PC机上,可能吗?

    1.十年前,女:“对不起,我不会喜欢你的,你不要再坚持了,就好比让 Linux 和 Windows 同时运行在一台PC机上,可能吗?”男生听后默默走开, 十年后,在一次虚拟技术大会上,我听到一名虚拟技 ...

  4. 在PC机上,如何用Chrome浏览器模拟查看和调试手机的HTML5页面?

    如题,如何用PC机上的Chrome浏览器模拟查看和调试手机HTML5页面? 参考操作步骤如下: 第一步.用Chrome打开要调试的页面: 第二步.按F12,打开“开发者工具”,点击其右上角的“Dock ...

  5. [转帖]PC虚拟化主流:KVM、XEN、OpenVZ详解

    PC虚拟化主流:KVM.XEN.OpenVZ详解 https://zhuanlan.zhihu.com/p/90920566 1.pc虚拟化——KVM KVM是完整的硬件虚拟化,可以在Windows ...

  6. PC机上的COM1口和COM2口

    现在PC机一般有两个串行口COM1和COM2. 串口叫串行接口 串口与并口不同之处:数据和控制信息时一位接一位地传送出去的,虽然速度慢,但传送距离较并口会更长,因此若要进行较长距离的通行时,应该使用串 ...

  7. emWin(ucGUI)在PC机上模拟的按键响应多次解决办法 worldsing

    emWin(ucgui) 在PC端的模拟器,默认的按键机制是"按抬都Msg",当在按下键盘时,会收到一个key值-1,在按键没有离开时一直维持,当按键松开时还发送一个key值-0的 ...

  8. uc/os学习入门:在32位pc机上搭建编译环境

    由于学习ucos的入门资料中所使用的编译器大多都是Borland c ++ 3.1或者Borland c++4.5,为了降低学习的难度最好所用的编译器与书本上的一致.由于4.5版本稍高,所以最终决定用 ...

  9. 通过/dev/mem只能访问高端内存以下的内核线性地址空间

    http://blog.chinaunix.net/uid-20564848-id-74706.html   </proc/iomem和/proc /ioports对应的fops> < ...

随机推荐

  1. android.animation(1) - ValueAnimator的ofInt(), ofFloat(), addUpdateListener(), addListener()(转)

    一.概述 long long ago,我写过几篇有关Animation的文章,讲解了传统的alpha.scale.translate.rotate的用法及代码生成方法.其实这三篇文章讲的所有动画效果叫 ...

  2. Qt学习过程中遇到的问题

    由于工作需要,开始使用Qt,由于在网上找的教程文档时针对qt3的,所以在学习的过程遇到了许多由于版本不一致造成的问题,因此记录下来. 参考的文档是:Qt入门教程 详细讲解版 本机Qt版本为:Qt5.3 ...

  3. 卡特兰数 catalan number

    作者:阿凡卢 出处:http://www.cnblogs.com/luxiaoxun/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留 ...

  4. H3C路由器和交换机的一些记录

    一.模拟器安装需要先安装winpcap,模拟器的脚本是tcl,使用脚本根据拓扑图可以配置模拟器模拟实际的网路线路和设备.二.和模拟器的连接可以使用超级终端,但是超级终端使用的是双字符,这里使用的是Se ...

  5. svn:ignore 的用处

    用svn管理代码,一直以来都受到一件不爽事情的困扰: 1)有些文件或文件夹不想在commit的时候看到,虽然他们是non-versioned,比如*.bak.*.class,*.scc(vss文件), ...

  6. Lua中的table函数库

    table.concat(table, sep,  start, end) concat是concatenate(连锁, 连接)的缩写. table.concat()函数列出参数中指定table的数组 ...

  7. 一个美国人对"智能制造"的思考!

    世界上制造业最强的国家仍然是美国!如今,国内工业4.0概念讨论日益喧嚣,中德合作如火如荼,但我们不能否认这个事实. “ 当下,美国似乎失去了世界第一制造大国的称号,而中国的企业也正面临产值下滑.利润下 ...

  8. 基于Unity5的TPS整理

    1.游戏管理器 游戏管理器负责管理游戏的整体流程,还可以系统管理用于游戏的全局数据以及游戏中判断胜败的条件.游戏管理器并不是单一的模块,更像是能控制游戏的功能集合.1)怪兽出现逻辑:专门设置一些位置用 ...

  9. 360破解大赛crackme分析--之3DES解密附加数据

    具体的分析这里有.本人仅仅是对这里面有趣的算法进行了一些学习 分析链接 这次是逆向的使用3DES解密的过程中的内容: 使用微软的crypt库 使用3DES解密程序中的附加数据 代码: VOID enc ...

  10. Amazon(vpc)对等网络

    对等连接测试 1.1 东京账户A创建对等连接 注意,双方的vpc网段不能重复,如果重复会造成无法配置路由表 输入双方信息 账户ID和VPC 1.2 东京账户A查看 查看连接信息 显示正在处理接受,需要 ...