linux内核分析第三周
20135103王海宁
linux内核分析第三周
http://mooc.study.163.com/course/USTC-1000029000
按照课堂提供的方法,命令行一行行敲上去,我是手机缓存,只能打。

shell,执行下面的命令:

设置完断点后,可以使用c让内核继续进行加载,加载到第一个断点start_kernel。
vim编译器阿 gdb之类的东东面试会很多的,上学期百度面试的人有一个问题是否熟悉Linux,是否掌握vim。

3.start_kernel所在函数的源代码。
我们可以在linux-3.18.6/init/main.c这里找到start_kernel所在函数的源代码。
Archlinux对qemu做了细分,启动指定架构的内核要用对应的qemu命令,这里就是qemu-system-i386执行完上述命令后,我们会看到qemu停留在start_kernel调用前

其实我们首先看第一个函数调用lockdep_init()函数,目的是为了初始化一张lockdep hash,这是什么呢?我们可以在kernel/locking/lockdep.c看到相关说明,从lockdep.c的注释部分我们可以了解,lockdep.c里实现的功能大概是对运行时的一些[lock]锁操作的正确性进行验证,具体详细没有进行分析。
上面内容00引自《深入理解Linux内核》
在gdb中s到set_task_stack_end_magic函数,然后用p打印传入的参数,可以看到传入的参数是个task_struct,此结构定义位于include/linux/sched.h,这里调用set_task_stack_end_magic时传入的参数是由位于include/linux/init_task.h中的INIT_TASK宏进行初始化,实际上它就是我们的0号进程,即当前进程,在此宏中我们可以看到0号进程的所有信息,同时通过查看gdb中打印的参数信息,我们可以确定这里确实是在对0号进程进行处理。
接下来是smp_setup_processer_id(),这个 是什么, 没有弄明白。
接着 debug_objects_early_init() 此函数用于内核的对象调试,其定义位于lib/debugobjects.c,根据其定义处的注释描述,其会初始化一个hash buckets并且把static object pool里的objects链入一个poll list。此函数调用完成后object tracker将可以正常工作
在执行start_kernel时,期初会对CPU、内存等各种硬件设备进行初始化,这期间涉及到非常多的不同内核模块的加载。在start_kernel的最后一项初始化,就是有关内核进程管理的初始化了。一旦这一项初始化完成,内核就加载成功了,在上一次我们自行编写的简单系统内核,实际上是在rest_init前插入了一段我们自己的函数my_start_kernel,插入这个函数之后,我们自己的内核通过PCB的进程管理单元来管理了我们依次创建的四个简单进程,并通过时间片轮转的方式进行了调度。那么在实际的linux内核代码中,rest_init()到底是干什么才使得我们需要在它之前执行my_start_kernel呢?原因就是rest_init实际上是linux内核初始化进程的函数。如果我们在它执行之前自行创建我们自己的进程,并且利用自己的调度算法来调度之后创建的进程,那么rest_init则永远不会被执行。
rest_init代码部分

在rest_init的代码中,kernel_thread,被定义在文件arch/x86/kernel/fork.c中,它的功能是用来fork一个内核线程。
代码:

在执行kernel_thread时,kernel_init作为将要执行的函数指针传入,进程ID会被置为1。所以在这里,kernel_init内核线程被创建,进程号为1。在完成内核进程的创建后,会创建kthreadd内核线程,作用则是管理和调度其他的内核线程

在kthreadd函数中kthread_create_list全局链表中维护的内核线程。当调用kthread_create时,会创建一个kthread,并被添加到kthread_create_list链表中。当进程执行完毕后,就会被从链表中删除。下面的代码我们可以看到,在tast_struct的当前进程被设定为kthread

schedule()代码:

代码绕开kernel_init和kthreadd并会继续执行到complete(&kthreadd_done);这时,说明kthreadd已经创建成功了,并通过一个complete变量kthreadd_done来通知kernel_init线程。
再看

最后,cpu_startup_entry 就会使得CPU在idle这样一个循环内进行工作,死循环。
linux内核分析第三周的更多相关文章
- LINUX内核分析第三周学习总结——构造一个简单的Linux系统MenuOS
LINUX内核分析第三周学习总结——构造一个简单的Linux系统MenuOS 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163. ...
- 20135327郭皓--Linux内核分析第三周 构造一个简单的Linux系统MenuOS
Linux内核分析第三周 构造一个简单的Linux系统MenuOS 前提回顾 1.计算机是如何工作的三个法宝 1.存储程序计算机 2.函数调用堆栈 3.中断 2.操作系统的两把宝剑 中断上下文的切换 ...
- Linux内核分析第三周学习笔记
linux内核分析第三周学习笔记 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.co ...
- Linux内核分析第三周学习博客——跟踪分析Linux内核的启动过程
Linux内核分析第三周学习博客--跟踪分析Linux内核的启动过程 实验过程截图: 过程分析: 在Linux内核的启动过程中,一共经历了start_kernel,rest_init,kernel_t ...
- 20135320赵瀚青LINUX内核分析第三周学习笔记
赵瀚青原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 概述 本周是学习的主要是构造 ...
- Linux内核分析第三周学习总结:构造一个简单的Linux系统MenuOS
韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.Linux内 ...
- Linux内核分析——第三周学习笔记
20135313吴子怡.北京电子科技学院 chapter1 知识点梳理 一.Linux内核源代码简介 (视频中对目录下的文件进行了简介,记录如下) arch目录 占有相当庞大的空间 arch/x86目 ...
- linux内核分析 第三周
一.Linux内核源码(简单分析) README 一开始刚接触内核源码的时候,不知道代码文件是什么功能.不清楚如何使用文件的时候,就需要打开README. README提供了内核的各种编译方法.生成文 ...
- Linux内核分析第三周——构造一个简单的Linux系统MenuOS
构造一个简单的Linux系统MenuOS 李雪琦 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/UST ...
随机推荐
- 用JS制作《飞机大作战》游戏_第1讲(素材查找和界面框架搭建)-陈远波
一.查找素材: 二.分析游戏界面框架: 登录界面.游戏界面.暂停游戏界面.玩家死亡后弹出界面:并对应的界面包含什么元素: 三.分别搭建以上四个界面: 1.登录界面与游戏界面框架(隐藏游戏界面,四个界面 ...
- 026.6 网络编程 tomcat
###############Tomcat中相关文件作用 bin:启动关闭服务器的脚本 Conf:配置文件 Lib:Tomcat的jar包,只要部署项目到Tomcat,所有项目可共用 ...
- div+css ie6图片之间有间隙的问题
图片转换为快级元素就解决了 img{display:block;} 也可设置img属性img{vertical-align:top;}
- python第二十九课——文件读写(复制文件)
自定义函数:实现文件复制操作有形参(2个) 没有返回值相似版(不用) def copyFile(src,dest): #1.打开两个文件:1个关联读操作,1个关联写操作 fr=open(src,'rb ...
- [SDOI2008]洞穴勘测
嘟嘟嘟 写完lct的板儿后觉得这就是一道大水题. 连pushup都不用. 不过还是因为一个zz的错误debug了一小会儿(Link的时候连出自环--) 还有一件事就是Cut的时候判断条件还得加上,因为 ...
- Net dll组件版本兼容问题
dll组件版本兼容问题,是生产开发中经常遇到的问题,常见组件兼容问题如:Newtonsoft.Json,log4net等 为了节约大家时间,想直接看解决方法的,可直接点击目录3.4 目录 1.版本兼容 ...
- mysql中的delete , drop 和truncate 区别
1.delete 和 truncate 仅仅删除表数据,drop 连表数据和表结构一起删除,打个比方,delete 是单杀,truncate 是团灭,drop 是把电脑摔了. 2.delete 是 D ...
- Python2.7-copy_reg
copy_reg 模块,提供了在 pickle 或是 copy 特定对象时,可以运行一个指定的函数,作为对象的构造器 模块方法: copy_reg.constructor(object):声明一个可调 ...
- easyui validatebox textbox 使用例子
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebFormTextbox ...
- day 43
今日内容 1.视图 2.事务 3.SQL注入问题 4.存储过程 首先回顾一下昨天所学 子查询: in (select a where 字段名 in select b) exists(判断后面语句执行结 ...