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);

 

 

 

 

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。