
说明:本文单纯为快捷记录 *** 作方法之用,没有解释技术细节,如果想了解具体原理请另寻其他资料。
内核是构成计算机 *** 作系统核心的程序。它是在计算机启动(即启动)时首先加载到内存(物理上由RAM芯片组成)的内容,并且在计算机运行的整个过程中它都保留在内存中。
Linux内核源码编译结束后生成的文件为vmlinux,这是一个ELF可执行文件,可以被反汇编。但不可以被引导。
vmlinuz是vmlinux经过压缩后生成的可引导可执行文件。可引导意味着它能够将 *** 作系统加载到内存中,以便计算机变得可用并且可以运行应用程序。
vmlinuz 不应与vmlinux混淆,后者是非压缩和不可引导形式的内核。vmlinux 通常只是生成 vmlinuz 的中间步骤。
以下 *** 作将vmlinuz转换为vmlinux,以达到查看内核函数源代码的目的。
实验环境为Ubuntu 12.04 32位3.13.0-32-generic内核。
调用内置脚本将vmlinuz转换为vmlinux。
/usr/src/linux-headers-3.13.0-32/scripts/extract-vmlinux /boot/vmlinuz-3.13.0-32-generic > vmlinux
转换后,使用objdump反汇编。
objdump -D vmlinux > vmlinux.dump
查询sys_read的地址。可知位于0xc1184e00
user@user-VirtualBox:~/Desktop/test1$ sudo grep sys_read /proc/kallsyms [sudo] password for dop: c1135af0 T sys_readahead c1184e00 T sys_read c1185470 T sys_readv c1188fc0 T sys_readlinkat c11890b0 T sys_readlink c11e3470 t proc_sys_read c11e3bc0 t proc_sys_readdir
由于刚才生成的dump文件过大,直接在dump中查找该地址耗费时间较多。我们查询其行号,然后用seq指令查询下方内容即可。
user@user-VirtualBox:~/Desktop/test1$ egrep -in c1184e00 vmlinux.dump 499288:c1184e00: 55 push %ebp ^C user@user-VirtualBox:~/Desktop/test1$ sed -n "$((499288)),$((499500))"p vmlinux.dump c1184e00: 55 push %ebp c1184e01: 89 e5 mov %esp,%ebp c1184e03: 83 ec 20 sub x20,%esp c1184e06: 89 5d f4 mov %ebx,-0xc(%ebp) c1184e09: 89 75 f8 mov %esi,-0x8(%ebp) c1184e0c: 89 7d fc mov %edi,-0x4(%ebp) c1184e0f: e8 40 e3 50 00 call 0xc1693154 c1184e14: be f7 ff ff ff mov xfffffff7,%esi c1184e19: 8b 45 0c mov 0xc(%ebp),%eax ...
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)