GDB跟踪调试linux-3.18.6内核

要跟踪调试内核,首先需要对内核架构有一个基本的了解,以linux-3.18.6为例:

  • arch文件夹:Linux需要兼容不同的架构,因此该文件夹下面包含arm、x86、alpha等支持各种机构的源码。
  • init文件夹:包含mian.c ,程序入口:start_kernel,任何模块的初始化都需要在strart_kernel中调用。
  • 还有ipc,kernel,security.sound等比较重要的文件夹
  • readme文件包含内核详细的安装过程

start_kernel分析:

  • trap_init();//涉及中断的内容,设置了很多硬件中断门,其中有一个系统中断门: set_system_trap_gate(SYSCALL_VECTOR, &system_call);//系统调用
  • mm_init()://内存管理模块
  • sched_init();//调度模块
  • rest_init();//内核进程,里面有kernel_thread(kernel_init, NULL, CLONE_FS);
    kernel_init函数中有run_init_process,init_process为linux系统中的第1号进程。
    system_idle(0号进程)系统进程中一直存在。0号进程创建了1号进程。同时创建了其它一些内核服务线程。

GDB调试过程:

  1. 冻结MENUOS
    输入:
    qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
    -S 冻结munuos的 CPU,“c(continue)”继续运行
    -s shorthand for -gdb tcp::1234 若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项
  2. 横向分割shell窗口,进入GDB,导入镜像文件 vmlinux
    输入:
    gdb
    file linux-3.18.6/ vmlinux
  3. 建立gdb和gdbserver之间的连接
    输入:target remote :1234
  4. 设置断点
    输入:break start_kernel
  5. 开始调试
    输入:c
    实验截图如下:
    冻结menuos
    冻结menuos
    GDB调试
    GDB调试
    断点设置
    断点设置
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值