Linux内核的启动过程---linux内核学习笔记(三)
内容一:实验报告相关说明。
真实姓名 谢润帮
原创作品转载请注明出处
所学课程:《Linux内核分析》MOOC课程
链接:http://mooc.study.163.com/course/USTC-1000029000
代码来源于孟宁老师的课件
虚拟实验室实验截图
这一小节感觉学的莫名奇妙,似乎并没有学到Linux内核启动的太多知识,因为很多初始化是自己看不懂的。所以自己只能简单的重复一下老师上课讲的东西,并搜素一下相关知识加以拓展,将此次的作业变成了课后小结!
内容二:gdb相关
和所有常用的调试工具一样,gdb提供了以下功能:
1:监视程序中变量的值
2:在程序中设置断点
3:程序的单步执行
在使用gdb前,必须先载入可执行文件,因为要进行调试,文件中就必须包含调试信息。
实验中:(gdb)file linux-3.18.6/vmlinux # 在gdb界面中targe remote之前加载符号表 。file <文件名> 其作用为加载被调试的可执行程序文件
其他部分实用知识请参考 http://blog.csdn.net/liigo/article/details/582231
内容三:Linux内核启动过程浅析
内核几乎所有模块的初始化都会经过start_kernel来进行,分析从init文件中的main.c开始。 start_kernal函数位于main.c的第500行。
其中第510行的函数,其原型如下:
297 void set_task_stack_end_magic(struct task_struct *tsk) 298 { 299 unsigned long *stackend; 300 301 stackend = end_of_stack(tsk); 302 *stackend = STACK_END_MAGIC; /* for overflow detection */ 303 }
其中&init_task的init_task的声明如下:
/* Initial task structure */ struct task_struct init_task = INIT_TASK(init_task);
INIT_TASK(init_task)是一个 #define INIT_TASK(tsk){......} 形式的宏定义。而且注释也说明此处声明的是 Initial task structure。即0号进程的PCB
综合起来也就不难理解老师说的:init_task是手工创建的PCB,0号进程就是最终的idle进程
接下来提到了一下初始化561 trap_init(); //中断初始化
562 mm_init(); //内存管理模块初始化 .... 569 sched_init(); //调度模块初始化 ....
679 /* Do the rest non-__init‘ed, we‘re now alive */
680 rest_init(); //其他内容初始化
....
其中trap_init中有一个需要重点关注:(具体情况自己还是不明白)
839 set_system_trap_gate(SYSCALL_VECTOR, &system_call);
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。