Operating system 反汇编正在运行的内核

Operating system 反汇编正在运行的内核,operating-system,gdb,linux-kernel,system-calls,Operating System,Gdb,Linux Kernel,System Calls,我尝试运行gdb来反汇编内核,并尝试运行: root@debian:/home/jestinjoy# gdb /usr/src/linux-2.6.38.8/vmlinux GNU gdb (GDB) 7.0.1-debian Copyright (C) 2009 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> Th

我尝试运行gdb来反汇编内核,并尝试运行:

root@debian:/home/jestinjoy# gdb /usr/src/linux-2.6.38.8/vmlinux
GNU gdb (GDB) 7.0.1-debian
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /usr/src/linux-2.6.38.8/vmlinux...done.
(gdb) disass sys_read
Dump of assembler code for function sys_read:
0xc10cacb9 <sys_read+0>:    push   %ebp
0xc10cacba <sys_read+1>:    mov    %esp,%ebp
0xc10cacbc <sys_read+3>:    push   %esi
0xc10cacbd <sys_read+4>:    mov    $0xfffffff7,%esi
0xc10cacc2 <sys_read+9>:    push   %ebx
0xc10cacc3 <sys_read+10>:   sub    $0xc,%esp
0xc10cacc6 <sys_read+13>:   mov    0x8(%ebp),%eax
0xc10cacc9 <sys_read+16>:   lea    -0xc(%ebp),%edx
0xc10caccc <sys_read+19>:   call   0xc10cb346 <fget_light>
0xc10cacd1 <sys_read+24>:   test   %eax,%eax
0xc10cacd3 <sys_read+26>:   mov    %eax,%ebx
0xc10cacd5 <sys_read+28>:   je     0xc10cad10 <sys_read+87>
0xc10cacd7 <sys_read+30>:   mov    0x2c(%ebx),%edx
0xc10cacda <sys_read+33>:   mov    0x28(%eax),%eax
0xc10cacdd <sys_read+36>:   mov    0x10(%ebp),%ecx
0xc10cace0 <sys_read+39>:   mov    %edx,-0x10(%ebp)
0xc10cace3 <sys_read+42>:   mov    0xc(%ebp),%edx
0xc10cace6 <sys_read+45>:   mov    %eax,-0x14(%ebp)
0xc10cace9 <sys_read+48>:   lea    -0x14(%ebp),%eax
0xc10cacec <sys_read+51>:   push   %eax
0xc10caced <sys_read+52>:   mov    %ebx,%eax
0xc10cacef <sys_read+54>:   call   0xc10cab82 <vfs_read>
0xc10cacf4 <sys_read+59>:   mov    -0x10(%ebp),%edx
0xc10cacf7 <sys_read+62>:   mov    %eax,%esi
root@debian:/home/jestinjoy#gdb/usr/src/linux-2.6.38.8/vmlinux
GNU gdb(gdb)7.0.1-debian
版权所有(C)2009免费软件基金会。
许可证GPLv3+:GNU GPL版本3或更高版本
这是自由软件:您可以自由更改和重新发布它。
在法律允许的范围内,不存在任何担保。键入“显示复制”
和“显示保修”了解详细信息。
此GDB配置为“i486 linux gnu”。
有关错误报告说明,请参阅:
...
从/usr/src/linux-2.6.38.8/vmlinux读取符号…完成。
(gdb)disass系统读取
函数sys_read的汇编程序代码转储:
0xc10cacb9:推送%ebp
0xc10cacba:mov%esp,%ebp
0xc10cacbc:推送%esi
0xc10cacbd:mov$0xfffffff7,%esi
0xc10cacc2:推送%ebx
0xC10CCC3:子$0xc,%esp
0xc10cacc6:mov 0x8(%ebp),%eax
0xC10CAC9:lea-0xc(%ebp),%edx
0xC10CCCC:调用0xc10cb346
0xc10cacd1:测试%eax,%eax
0xc10cacd3:mov%eax,%ebx
0xC10CAD5:je 0xc10cad10
0xc10cacd7:mov 0x2c(%ebx),%edx
0xc10cacda:mov 0x28(%eax),%eax
0xc10cacdd:mov 0x10(%ebp),%ecx
0xc10cace0:mov%edx,-0x10(%ebp)
0xC10CAE3:mov 0xc(%ebp),%edx
0xc10cace6:mov%eax,-0x14(%ebp)
0xc10cace9:lea-0x14(%ebp),%eax
0xc10cacec:推送%eax
0xc10caced:mov%ebx,%eax
0xc10cacef:调用0xc10cab82
0xc10cacf4:mov-0x10(%ebp),%edx
0xc10cacf7:mov%eax,%esi
它很好用。但是当我试着跑步的时候

root@debian:/home/jestinjoy# gdb /usr/src/linux-2.6.38.8/vmlinux /proc/kcore 
GNU gdb (GDB) 7.0.1-debian
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /usr/src/linux-2.6.38.8/vmlinux...done.
Core was generated by `BOOT_IMAGE=/boot/vmlinuz-2.6.38.8 root=UUID=b61e8ee2-949a-4810-ac56-42564ee005d7'.
#0  0x00000000 in ?? ()
(gdb) disass sys_read
Dump of assembler code for function sys_read:
0xc10cacb9 <sys_read+0>:    add    %al,(%eax)
0xc10cacbb <sys_read+2>:    add    %al,(%eax)
0xc10cacbd <sys_read+4>:    add    %al,(%eax)
0xc10cacbf <sys_read+6>:    add    %al,(%eax)
0xc10cacc1 <sys_read+8>:    add    %al,(%eax)
0xc10cacc3 <sys_read+10>:   add    %al,(%eax)
0xc10cacc5 <sys_read+12>:   add    %al,(%eax)
0xc10cacc7 <sys_read+14>:   add    %al,(%eax)
0xc10cacc9 <sys_read+16>:   add    %al,(%eax)
0xc10caccb <sys_read+18>:   add    %al,(%eax)
0xc10caccd <sys_read+20>:   add    %al,(%eax)
0xc10caccf <sys_read+22>:   add    %al,(%eax)
0xc10cacd1 <sys_read+24>:   add    %al,(%eax)
0xc10cacd3 <sys_read+26>:   add    %al,(%eax)
0xc10cacd5 <sys_read+28>:   add    %al,(%eax)
0xc10cacd7 <sys_read+30>:   add    %al,(%eax)
root@debian:/home/jestinjoy#gdb/usr/src/linux-2.6.38.8/vmlinux/proc/kcore
GNU gdb(gdb)7.0.1-debian
版权所有(C)2009免费软件基金会。
许可证GPLv3+:GNU GPL版本3或更高版本
这是自由软件:您可以自由更改和重新发布它。
在法律允许的范围内,不存在任何担保。键入“显示复制”
和“显示保修”了解详细信息。
此GDB配置为“i486 linux gnu”。
有关错误报告说明,请参阅:
...
从/usr/src/linux-2.6.38.8/vmlinux读取符号…完成。
核心由“BOOT_IMAGE=/BOOT/vmlinuz-2.6.38.8 root=UUID=b61e8ee2-949a-4810-ac56-42564ee005d7”生成。
#0 0x00000000英寸??()
(gdb)disass系统读取
函数sys_read的汇编程序代码转储:
0xc10cacb9:添加%al,(%eax)
0xc10cacbb:添加%al,(%eax)
0xc10cacbd:添加%al,(%eax)
0xc10cacbf:添加%al,(%eax)
0xc10cacc1:添加%al,(%eax)
0xC10ccc3:添加%al,(%eax)
0xc10cacc5:添加%al,(%eax)
0xc10cacc7:添加%al,(%eax)
0xc10cacc9:添加%al,(%eax)
0xC10CACB:添加%al,(%eax)
0xC10ACCD:添加%al,(%eax)
0xC10ccf:添加%al,(%eax)
0xc10cacd1:添加%al,(%eax)
0xc10cacd3:添加%al,(%eax)
0xc10cacd5:添加%al,(%eax)
0xc10cacd7:添加%al,(%eax)
结果很奇怪。我和你一起跑步


CONFIG\u DEBUG\u INFO=y
对于内核2.6.38来说,“grep sys\u read/proc/kallsyms”在您的机器上说了什么?如果它不是0xc10cacb9,则您的运行内核的源代码或配置不相同,因此地址不匹配

禁用
配置可重新定位

不能简单地用gdb调试正在运行的内核 Linux内核有两个不同的前端用于调试(
kdb
和),它们有些不同,但幸运的是,可以动态地在它们之间切换

kdb
它不是源代码级调试器(因此不是您要查找的调试器),可以在本地计算机上的系统控制台上使用,也可以通过其他计算机的串行连接使用

是一个源代码级调试器,但需要两台机器来运行-其中一台是被调试的主体(即运行被调试代码的目标机器),另一台是开发机器,其中,
gdb
针对
vmlinux
文件(目标机器正在运行的同一文件)运行。目标机和开发机之间的连接是通过串口实现的


现在,有大量的文档说明了如何在内核的
文档
目录下设置这些内容。只要
grep
就可以了:
kdb
kgdboc
,…

我不能说我用GDB调试内核,但我用了crash(),它是GDB的包装器。我大部分时间都在使用它,而且效果很好。

看起来您正在加载的内核与从中启动的内核不同-如果您安装了内核,可能是这样,也可能不是这样/proc/kcore报告内核为/boot/vmlinuz-2.6.38.8。另外,如果你可以发布你的.config,这可能有助于获得更好的答案,那么我的
config
可以在上找到。我是否错过了一些配置?如果你只是想反汇编内核,为什么不反汇编映像呢?
cat/boot/System.map-2.6.38.8 | grep sys_read
0xc10cacb9
对不起,我的问题不知怎么被截断了。我的意思是问“grep sys_read/proc/kallsyms”在你的机器上读什么?原因是/proc/kallsyms来自实际运行的内核和/boot/Systems。map-2.6.38.8是与以前的一个内核一起安装的。因为我怀疑运行的内核可能不同,所以我想验证实际运行的内核的地址。实际上,您可以使用gdb调试正在运行的内核(前提是您有一个带有调试符号的内核映像)-你不能在断点等停止它。@ GBY我不考虑调试。因为你可以从任何内存位置提取值,调试很多现象是非常有用的。