2017-2018-1 20179209《Linux内核原理与分析》第四周作业
本周学习内容为《跟踪分析MenuOS简单linux系统的启动过程》和教材中的进程调度及内核数据结构。
一.跟踪分析Linux内核的启动过程
这个实验我是在实验楼环境中完成的,最初想在自己的环境中完成,可在make的时候出现了问题,原本需要很长时间的make过程只用了10几秒,而且报了错。经过我上网查资料发现可能是因为我的实验环境有问题(kali1-4.3.0)。所以我还是选择了实验楼,其实在实验楼上同样有问题,每次冻结程序进行调试时必然卡顿,然后崩溃。我怀疑是网速的问题,果然,换了流量之后流畅多了。
水平分割终端,上面用来输入命令,下面用来调试。启动内核并冻结,然后进入gdb模式,设置函数断点,使启动过程断在start_kernel处:

__init start_kernel(void)是最低限度的初始化系统。这里面的每一个函数都有其存在的意义,光本次实验的这个小型系统,它的初始化队列中就大概涵盖200多个函数,可想linux系统内核的庞大。

这里我萌生了一个想法,我们都知道,启动linux后会出现一行一行的加载,我想是不是就跟start_kernel中的函数有关,所以打算验证一下这个猜测。

从上图大家可以看到,我在509行也就是lockdep_init();函数处设置断点,继续运行后虚拟机中的启动过程并没有任何变化。
紧接着,我又在511行(smp_setup_processor_id();)处设置断点,这里面的很多函数光靠名字很难猜出它对linux内核启动有什么样的作用,但这对实验没有太大的影响,因为它们的意义不是重点。运行后还是没有任何变化。如下图:

两次跳跃大概10几个函数,竟然没有变化,所以下一个断点,我选择了在528行boot_cpu_init();又是boot,又是cpu的,应该很重要,即使初始化也应该先进行检查吧,但是仍然没有任何反应:

断535setup_per_cpu_areas();依旧:

trap_init(); 这是对中断机制的初始化,出于好奇,我s进了这个函数:



出发点是好的,但结果总不尽人意,这里面的大部分内容我是不明白的。这时候我想退出这个函数了:

从上图可以看出,程序的执行终于跳了出来,回到了start_kernel中。
其实经过这么多次的断,我已经有点怀疑我的猜测了,有可能这些系统初始化的过程并不对应那些启动画面中的一条一条的检查。所以我直接断了619行(跨度将近60行):

它终于出现了变化,证明了我的想法一样,返回去看619行是哪个函数的执行:

可能最初的变化并不是在locking_selftest();函数,但肯定是在这60行中某一个函数开始。
最后一个断点设置在了start_kernel中的最后一个函数rest_init(),而且我也跳进去看了看:


finish后,start_kernel()结束:

start_kernel函数相当于c程序中的main函数,我们都知道而且也这样做:在main函数中调用其他函数,而不直接把功能函数的实体写在main中;start_kernel一样,它的作用就是调用linux内核启动所需要的各类初始化。对于它里面这些函数的功能,见start_kernel函数分析。说实话,我觉得这个实验给我收获最大的不是对内核启动过程的分析,因为从最开始明白start_kernel的用途以及跳进初始化中断的那个函数开始,我就已经领悟到了内核启动的过程——对系统启动所需要的软硬件的初始化(这里的软硬件包括系统运行所需要的栈、内存、中断等),以及对0号和1号进程的启动。我想说的最大的收获是对gdb的理解,尽管在调试myod的时候就已经很熟练对gdb的使用,但经过对内核启动过程的分析,我发现其实gdb的功能远不止设置断点继续运行这么简单,所以我就上网查了查,发现这篇博客解释得比较完美。
二.教材内容总结
其实本科所学的操作系统这门课已经详解了进程调度的原理和手段,而且链表作为数据结构的一种,也早已实现过多次,所以这里我不再做过多陈述。只是总结一下,我认为的新的、或者原来没学的内容。
- Linux调度器是以模块方式提供的,这样做的目的是允许不同类型的进程可以有针对性地选择调度算法。这种模块化结构被称为调度器类,它允许多种不同的可动态添加的调度算法并存,调度属于自己范畴的进程。每个调度器都有一个优先级,基础的调度器代码定义在kernel/sched.c文件中,它会按照优先级顺序遍历调度类,拥有一个可执行进程的最高优先级的调度器类胜出,去选择下面要执行的那一个程序。这里我觉得调度器只存在于Linux操作系统中,Windows系统中没有。
- 红黑树是一种自平衡的二叉树,与普通二叉树相比,它具有着色属性,或红色或黑色。它通过以下六个属性来维持半平衡二叉树:
- 所有的节点不是红色,就是黑色
- 叶子节点都是黑色
- 叶子节点不包含数据
- 所有非叶子节点都有两个子节点
- 如果一个节点是红色,则它的子节点都是黑色
- 在一个节点到其叶子节点的路径中,如果总是包含同样数目的黑色节点,则该路径相比其他路径是最短的。 - 进程调度的主要入口点是函数schedule();其实在之前的《构建一个简单的Linux系统》实验中出现过,这个函数中嵌入汇编代码,实现进程的切换。
其实在进程切换和调度中,还有一个很重要的概念就是加锁机制。由于系统资源的有限,为避免产生死锁,必须对临界区资源加锁。想到这一概念我特意翻了一下课本,发现在内核同步那一章有讲。
总结:
可能由于之前操作系统的学习,让我的思想有些固化,对于进程调度和管理这些概念性的内容,即使再看一遍也提不出什么实质性的问题,我除了对内核代码感兴趣之外,其他还是希望观看其他学生提出的问题,希望能帮助他们解决;即使解决不了,那也可以来当做自己的问题处理。相比抽象地学习理论,我还是希望多些代码方面的练习,当然也不是直接像Linux内核这样庞大的代码,起初看到start_kernel 函数时确实吓了一大跳,如果要是在这门课结束之前,我弄不明白这么多代码该怎么办?而且这还只是内核中一部分;而且这个函数中的每个函数还有具体的实现。这样想想,似乎我连入门都没有。还是希望老师多讲解一下我们对这门课应该有的整体把握和方向。
2017-2018-1 20179209《Linux内核原理与分析》第四周作业的更多相关文章
- 2019-2020-1 20199303<Linux内核原理与分析>第二周作业
2019-2020-1 20199303第二周作业 1.汇编与寄存器的学习 寄存器是中央处理器内的组成部份.寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令.数据和位址.在中央处理器的控制部件中 ...
- 20169219 linux内核原理与分析第二周作业
"linux内核分析"的第一讲主要讲了计算机的体系结构,和各寄存器之间对数据的处理过程. 通用寄存器 AX:累加器 BX:基地址寄存器 CX:计数寄存器 DX:数据寄存器 BP:堆 ...
- 2019-2020-1 20199314 <Linux内核原理与分析>第二周作业
1.基础学习内容 1.1 冯诺依曼体系结构 计算机由控制器.运算器.存储器.输入设备.输出设备五部分组成. 1.1.1 冯诺依曼计算机特点 (1)采用存储程序方式,指令和数据不加区别混合存储在同一个存 ...
- Linux内核原理与分析-第一周作业
本科期间,学校开设过linux相关的课程,当时的学习方式主要以课堂听授为主.虽然老师也提供了相关的学习教材跟参考材料,但是整体学下来感觉收获并不是太大,现在回想起来,主要还是由于自己课下没有及时动手实 ...
- 2019-2020-1 20199314 <Linux内核原理与分析>第一周作业
前言 本周对实验楼的Linux基础入门进行了学习,目前学习到实验九完成到挑战二. 学习和实验内容 快速学习了Linux系统的发展历程及其简介,学习了下的变量.用户权限管理.文件打包及压缩.常用命令的和 ...
- Linux内核原理与分析-第二周作业
写之前回看了一遍秒速五厘米:如果
- 20169219linux 内核原理与分析第四周作业
系统调用 系统调用是用户空间访问内核的唯一手段:除异常和陷入外,它们是内核唯一的合法入口. 一般情况下,应用程序通过在用户空间实现的应用编程接口(API)而不是直接通过系统调用来编程. 要访问系统调用 ...
- 2018-2019-1 20189221《Linux内核原理与分析》第一周作业
Linux内核原理与分析 - 第一周作业 实验1 Linux系统简介 Linux历史 1991 年 10 月,Linus Torvalds想在自己的电脑上运行UNIX,可是 UNIX 的商业版本非常昂 ...
- 2017-2018-1 20179209《Linux内核原理与分析》第七周作业
一.实验 1.1task_struct数据结构 Linux内核通过一个被称为进程描述符的task_struct结构体来管理进程,这个结构体包含了一个进程所需的所有信息.它定义在linux-3.18.6 ...
- 20169212《Linux内核原理与分析》课程总结
20169212<Linux内核原理与分析>课程总结 每周作业链接汇总 第一周作业:完成linux基础入门实验,了解一些基础的命令操作. 第二周作业:学习MOOC课程--计算机是如何工作的 ...
随机推荐
- C++ | class size
c++类大小和机器还有编译器有关.64位机器指针大小为8个字节,32位机器为4个字节. 每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例 ...
- Java 在Word创建表格
表格作为一种可视化交流模式及组织整理数据的手段,在各种场合及文档中应用广泛.常见的表格可包含文字.图片等元素,我们操作表格时可以插入图片.写入文字及格式化表格样式等.下面,将通过Java编程在Word ...
- MyEclipse导入外部项目
1,File 2,Preferences 3,General----Existing----next 4,Browse选择要导入的项目---finash 5,导入后可能会出现很多error 检查项目的 ...
- 聊聊、Zookeeper Linux 单服务
关于上一篇 Zookeeper 的文章是介绍安装启动,这一篇介绍独立服务,也就是单台 Zookeeper 提供服务.首先登陆 Linux 系统,确保网络通畅.如果遇到找不到网卡 eth0 情况,可以先 ...
- 【lombok】lombok---帮你简化生成必要但臃肿的java代码工具 【映射注解和lombok注解同时使用 以及 映射注解放在属性和get方法上的区别】
官方地址:https://projectlombok.org/ GitHub:https://github.com/rzwitserloot/lombok 指导说明文档:http://jnb.ociw ...
- 如何判断自己外网IP是否为真实公网IP,以及解决方案
如何判断本地(路由器)分配的IP是否公网IP? 公网IP:全球唯一IP地址.(公网IP又分为静态公网IP和动态公网IP,如何分辨的话,进入路由器查看连接方式pppoe连接都是动态公网IP.) ...
- 报错:OpenCV Error: Assertion failed (src.size() == dst.size() && src.type() == dst.ty pe()) in unknown function, file ..……
在用cvDilate函数的时候,老是导致程序中断,报错如下: OpenCV Error: Assertion failed (src.size() == dst.size() && s ...
- poor-pigs(非常好的思路)
https://leetcode.com/problems/poor-pigs/ package com.company; class Solution { // 下面第二种做法貌似是OJ原来的做法, ...
- 七天学会ASP.NET MVC(七)——创建单页应用 【转】
http://www.cnblogs.com/powertoolsteam/p/MVC_Seven.html 系列文章 七天学会ASP.NET MVC (一)——深入理解ASP.NET MVC 七天学 ...
- angular js 使用$location问题整理
angular js 自带的$location方法十分强大,通过使用$location方法.我们能够获取到server的port.杂乱连接中的path()部分(/所包括的部分). 例: // give ...