Pintos调试心得
一、如何用GDB调试内核:
Ctrl+Alt+F1打开终端,cd切换到你的pintos/src/threads/build目录下
输入命令pintos –gdb –run alarm-multiple(注意是双线- -,注意run前的空格)出现下面的界面:(注意uilts文件下已经编译通过,还有bochs打开终端调试)
然后,Ctrl+Alt+F2打开第二个终端登录并切换到pintos/src/threads/build目录下
输入命令pintos-gdb -tui
看到如下界面:
按enter键继续,此时为进入gdb调试控制台
输入命令target remote localhost:1234(默认端口,应该与第一个终端里显示的一致)接着输入命令file kernel.o(载入要调试的内核程序),看到如下界面:
输入y继续,这样开始调试啦
(首先自己在网上百度一下gdb常用的调试命令)
break main(在main函数入口插入断点)
接着c(continue的意思跟VS、VC++中的调试命令对应)
看到如下界面
注意划红线部分
输入n(执行下一步,不会进入函数体内部,step单步运行命令会进入函数内部)然后大家可以在第一个终端里查看运行结果。
比如我在第79行添加了一行
Ctrl+Alt+F1打开第一个终端可以看到执行结果
接下来自己慢慢探索吧,感受一下gdb调试器的强大之处。
下面介绍一下我对pintos的理解
二、Pintos内部函数调用
内核加载完成后,进入main函数(pintos主程序)
开始boot
bss_init (); 初始化BSS,(BSS(Block Started by Symbol)通常是指用来存放程序中未初始化的全局变量和静态变量的一块内存区域。
特点是:可读写的,在程序执行之前BSS 段会自动清0。
)
argv = read_command_line ();//读取命令行
argv = parse_options (argv);//分析命令行
thread_init ();初始化主线程
console_init ();
/* 问候用户*/
printf ("Pintos booting with %'"PRIu32" kB RAM...\n", init_ram_pages * PGSIZE / 1024);
在终端打印
/* 初始化内存系统*/
palloc_init (user_page_limit);
malloc_init ();
paging_init ();
/*初始化中断处理*/
intr_init ();
timer_init ();
kbd_init ();
input_init ();
/* 开启线程调度,开启中断*/
thread_start ();//创建idle空线程
serial_init_queue ();
timer_calibrate ();
printf ("Boot complete.\n");//开机完成
/* 运行内核命令行*/
run_actions (argv);
//这个函数会调用struct action a;中的方法
//让我们进入a->function(argv),看到其调用run_task()函数,找到struct action的定义//自己查看一下
//接着我们进入run_test()函数,看到其是tests.c中的,其调用结构体struct test中的//function()方法
//进入该函数后我们已经接近alarm-multiple的真相了,看到test_sleep(5,7)它传入就是//的参数含义就是创建5个线程每个线程sleep迭代7次,这样我们就看到了运行结果//所显示的
//进入test_sleep(5,7)然后我们在timer_sleep()处设置断点就可以观察到该函数被不断调//用
/*然后我们也会发现在tests文件夹下有很多其他的命令,自己可以探索一下。
方法雷同。
*/
/*完成后关机,退出线程*/c
shutdown ();
thread_exit ();。