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内核分析第三周的更多相关文章

  1. LINUX内核分析第三周学习总结——构造一个简单的Linux系统MenuOS

    LINUX内核分析第三周学习总结——构造一个简单的Linux系统MenuOS 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163. ...

  2. 20135327郭皓--Linux内核分析第三周 构造一个简单的Linux系统MenuOS

    Linux内核分析第三周  构造一个简单的Linux系统MenuOS 前提回顾 1.计算机是如何工作的三个法宝 1.存储程序计算机 2.函数调用堆栈 3.中断 2.操作系统的两把宝剑 中断上下文的切换 ...

  3. Linux内核分析第三周学习笔记

    linux内核分析第三周学习笔记 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.co ...

  4. Linux内核分析第三周学习博客——跟踪分析Linux内核的启动过程

    Linux内核分析第三周学习博客--跟踪分析Linux内核的启动过程 实验过程截图: 过程分析: 在Linux内核的启动过程中,一共经历了start_kernel,rest_init,kernel_t ...

  5. 20135320赵瀚青LINUX内核分析第三周学习笔记

    赵瀚青原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 概述 本周是学习的主要是构造 ...

  6. Linux内核分析第三周学习总结:构造一个简单的Linux系统MenuOS

    韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.Linux内 ...

  7. Linux内核分析——第三周学习笔记

    20135313吴子怡.北京电子科技学院 chapter1 知识点梳理 一.Linux内核源代码简介 (视频中对目录下的文件进行了简介,记录如下) arch目录 占有相当庞大的空间 arch/x86目 ...

  8. linux内核分析 第三周

    一.Linux内核源码(简单分析) README 一开始刚接触内核源码的时候,不知道代码文件是什么功能.不清楚如何使用文件的时候,就需要打开README. README提供了内核的各种编译方法.生成文 ...

  9. Linux内核分析第三周——构造一个简单的Linux系统MenuOS

    构造一个简单的Linux系统MenuOS 李雪琦 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/UST ...

随机推荐

  1. ArcGIS pro2.3中添加天地图底图

    应用背景: 很多时候,我们需要使用网络上的遥感影像或者百度地图.天地图等在线地图做一些矢量化工作或者其他. 笔者见过很多人都是把百度地图截图,然后把图片导如Arcmap或者Arcgis pro中,然后 ...

  2. ubuntu环境下docker的安装与操作

    只要按照本文的步骤一步步的走,就能正确的安装docker并使用,ubuntu需要联网 1. 在Ubuntu中安装Docker 更新ubuntu的apt源索引 sudo apt-get update 安 ...

  3. win10系统上Python和pycharm的安装及配置

    1.https://www.python.org/downloads/windows/进入官网下载需要的Python安装包(以2.7版本为例) 2.http://www.jetbrains.com/p ...

  4. 「2017 山东一轮集训 Day5」字符串

    题目 比较神仙的操作啊 首先先考虑一个串的做法,我们有两种:SA或SAM,其中SAM又有两种,拓扑图上的\(dp\)和\(parent\)上随便统计一下 显然这道题\(SA\)和\(parent\)树 ...

  5. WorldWind源码剖析系列:数学引擎类MathEngine

    PluginSDK中的MathEngine类是密封类.不可继承,主要完成通用的数学计算功能.由于按平面展开层层划分,所以在WW里用到一个row,col的概念,类MathEngine封装了从行/列到经/ ...

  6. docker pull下载镜像时的报错及其解决方法

    使用docker pull从镜像仓库拉取镜像时报错如下: [root@docker-registry ~]# docker pull centos Using default tag: latest ...

  7. 浅谈 DNS

    一.DNS(Domain Name System,域名系统) 概念:万维网(WWW是环球信息网的缩写,亦作“Web”.“WWW”.“'W3'”,英文全称为“World Wide Web”),作为域名和 ...

  8. SQL 提高性能

    参考博客:http://www.cnblogs.com/jiekzou/p/5988099.html  非常感谢博主分享. 1.set nocount on 关闭行基数信息,减少网络通信,提高程序性能 ...

  9. Python中 __init__的通俗解释?附修饰器contextmanager的理解

    作者:匿名用户链接:https://www.zhihu.com/question/46973549/answer/103805810来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...

  10. abp 将abp项目发布之后挂在IIS上无法访问嵌入资源的问题

    在本地调试是能够正常访问到写在另一个程序集中的嵌入资源,但是发布之后 挂在IIS上却不能访问. 整了半天没找到原因.后来发现是发布时配置错误造成的:取消勾选precompile during publ ...