首页 > 系统服务 > 详细

《linux内核与分析》第三周

时间:2016-03-13 14:21:12      阅读:229      评论:0      收藏:0      [点我收藏+]

20135130王川东

实验:构造一个简单的Linux系统的MenuOS

命令:qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img、

       命令含义:kernel启动一个内核,其后为内核位置。

                     initrd指定一个根文件系统。

使用gdb调试和跟踪:

     重新配置和编译Linux使之携带调试信息

       命令:qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S              

       注:-S freeze CPU at startup (use ’c’ to start execution) CPU初始化之前冻结
             -s shorthand for -gdb tcp::1234  在端口1234上创建gdb server (不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项)

另开一个shell窗口:

  (gdb)file linux-3.18.6/vmlinux # 在gdb界面中targe remote之前加载符号表

  (gdb)target remote:1234 # 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行

  (gdb)break start_kernel # 断点的设置可以在target remote之前,也可以在之后

start_kernel函数中有全局变量init_task,即手工创建的PCB,0号进程即最终的idle进程。0号进程一直存在。当系统没有进程需要执行时就调度idle进程。

rest_init()中的run_init_process是linux中的一号进程,第一个用户态进程。
实验过程:

 进入LinuxKernel,输入指令:

技术分享

得到结果:

技术分享

重新配置和编译Linux使之携带调试信息;输入命令:qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s

此时QEMU为Stopped状态:

技术分享

另开窗口,输入指令:

linux-3.18.6/vmlinux # 在gdb界面中targe remote之前加载符号表

target remote:1234 # 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行

break start_kernel # 设置断点:

技术分享

 

输入C,回车,QEMU开始执行:

技术分享

输入list,可看到程序执行到此:

技术分享

同样的方法,设置rest_init断点“

技术分享技术分享

《linux内核与分析》第三周

原文:http://www.cnblogs.com/dvew/p/5270915.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!