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 ...
随机推荐
- jdk1.7环境配置
JDK1.7的环境配置(我的是jdk1.7,文件名写快了,忽略忽略) 官网下载自己需要的版本(ps:我这是朋友发给我的就不提供官网地址,去百度搜jdk就可以了) 下载下来除了改存放路径还有记得再jdk ...
- vue2.0学习笔记之路由(二)路由嵌套+动画
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 【洛谷】【单调栈】P1901 发射站
[题目描述:] 某地有 N 个能量发射站排成一行,每个发射站 i 都有不相同的高度 Hi,并能向两边(当 然两端的只能向一边)同时发射能量值为 Vi 的能量,并且发出的能量只被两边最近的且比 它高的发 ...
- linux(centos 7) 下安装nodejs
1,到node官网下载linux版本,有32和64位版本 2,将文件上传到linux下 3,使用tar -xvf node-v8.9.3-linux-x64.tar.xz 进行解压 4,建立软连接,变 ...
- [luogu4072] 征途
题面 题意体面中写得很明确, 应该不用我说了, 方差的概念在初中人教版九年级数学中有所提到, 没有上过初中的同学们可以左转百度. 将序列拆为几段求最值, 我们考虑用dp来实现. 先推一下式子, 令方差 ...
- 发行版Linux和麒麟操作系统下netperf 网络性能测试
Netperf是一种网络性能的测量工具,主要针对基于TCP或UDP的传输.Netperf根据应用的不同,可以进行不同模式的网络性能测试,即批量数据传输(bulk data transfer)模式和请求 ...
- redis安装及常用命令
查看redis版本 redis-server -v或者redis-cli -v 安装redis 硬件要求 查看版本 uname -a 内存32G 8核CPU 查看内存大小 cat /proc/mem ...
- android java.lang.ExceptionInInitializerError
11-08 13:36:05.108: E/AndroidRuntime(5318): java.lang.ExceptionInInitializerError 11-08 13:36:05.108 ...
- 设置ssh key后push为什么还要输入用户名和密码
$ git push Username for 'https://github.com': Password for 'https://Username@github.com': Counting o ...
- 创世纪 BZOJ3037 & [Poi2004]SZP BZOJ2068
分析: 树形DP中的一种,基环树DP 针对每一个环跑DP,f[i],g[i]分别表示选或者不选,之后我们注意每次遍历的时候,不要重复遍历. 附上代码: #include <cstdio> ...