本次内容分为两部分,第一部分是实验,第二部分是教材的第四章和第六章。

第一部分:实验

本次的实验内容是构造一个简单的Linux系统MenuOS,过程如下。

首先使用如下命令进入LinuxKernel

$ cd LinuxKernel

可以看到我们几个需要的文件,如Linux-3.18.6和rootfs生成了rootfs.img前面的工作已经做好了,就可以直接启动了,启动命令如下。

$ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd roofs.img

其中initrd是指定根文件系统,就是rootfs.img。

启动结果如图所示,



我们可以看到加载了根文件系统,init就执行起来了,就看到了MenuOS,内核启动完成后进入menu程序,支持三个命令help、version和quit。可以输入一个help,就可以看到三个命令。



这样构件一个简单的Linux系统就完成了。

接下来是使用gdb跟踪调试内核,命令如下

$ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd roofs.img —S -s

先把内核启动一下,-S freeze CPU at startup (use ’c’ to start execution)是表示在CPU初始化之前就冻结起来,-s shorthand for -gdb tcp::1234 若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项,是指在-gdb tcp::1234端口上创建了一个gdb server。结果如下图所示



我们可以用水平分割另外打开一个窗口,输入

$ gdb

打开了gdb 就可以看到gdb的提示符,如图所示。

使用如下命令把gdb带有符号表(debug信息)的内核镜像加载进来,就是在gdb界面中targe remote之前加载符号表。

(gdb)file linux-3.18.6/vmlinux

结果如图所示

接下来就是使用如下命令建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行。

(gdb)target remote:1234

如图所示

使用如下命令在内核启动的起点设置断点,断点的设置可以在target remote之前,也可以在之后。

(gdb)break start_kernel

如图所示

如果按C加回车的话系统就开始启动了,启动到start_kernel的位置,如图所示



输入s进入函数,输入n单步执行

输入list就可以查看函数

接下来简单分析一下start_kernel。



其中&init_task是全局变量,即手工创建的PCB,0号进程即最终的idle进程。下面的debug boot等启动的点,都涉及到复杂的模块。不管分析内核的哪一个部分都会涉及到start_kernel,基本上所有的模块都是经过statr_kernel进行初始化。我们只看需要了解的。



trap_init()是初始化一些中断向量。由于搜索该函数时遇到了问题,所以无法继续分析。具体问题如下图,找不到linux-3.18.6文件。



只能了解到设置了很多硬件中断,其中有一个是trap_get()系统陷阱门。

mm_init()是内存管理模块的初始化,sched_init()调度模块初始化等等还有很多模块的初始化。



这是函数的最后一句。在该函数中有kernle_init,如下所示。

kernel_thread(kernel_init, NULL, CLONE_FS);

kernel_init()函数部分代码如下所示



其中run_init_process()是linux系统中的1号进程,就是第一个用户态进程。

接下来还创建了一个kthreadd内核线程,管理系统的资源,如下所示。

pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);

rest_init()启动完成之后进入cpu_start_entry(),当系统没有进程需要执行时就调度到idle进程。cpu_start_entry()中的cpu_idel_loop()函数中的while(0)就是0号进程

总结:

rest_init()在内核启动一直存在,这就是0号进程,0号进程创建了一号进程kernel_init(),还创建了其他的服务线程。道生一一生二,二生三,三生万物。

第二部分:教材

本周学习了第四章进程调度和第六章内核数据结构。

进程调度策略:I/O消耗型和处理器消耗型的进程分类,按进程优先级和时间片。

Linux调度实现:时间记账,进程选择,调度器入口,睡眠和唤醒。

链表:单项链表和双向链表,环形链表。还介绍了操作链表、沿链表移动和遍历链表的方法。

对于队列介绍了kfifo,创建队列,推入队列数据,摘取队列数据,获取队列长度,重置和撤销队列。

最重要的是自平衡二叉搜索树,一个平衡二叉搜索树是一个所有叶子节点深度差不超过1的二叉搜索树,一个自平衡二叉搜索树是指其操作都试图维持(半)平衡的二叉搜索树。红黑树是自平衡的二叉搜索树,并且遵循六个属性。

1.所有的节点要么着红色,要么着黑色。

2.叶子节点都是黑色。

3.叶子节点都不包含数据。

4.所有非叶子结点都有两个子节点。

5.如果一个节点是红色,则它的子节点就是黑色。

6.在一个节点到其叶子节点的路径上,如果总是包含同样数目的黑色节点,则该路径相比其他路径是最短的。

上述条件,保证了最深的叶子节点的深度不会大于两倍的最浅叶子节点的深度,所以,红黑树总是半平衡的。

20169210《Linux内核原理与分析》第五周作业的更多相关文章

  1. 20169210《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 本周作业分为两部分:第一部分为观看学习视频并完成实验楼实验一:第二部分为看<Linux内核设计与实现>1.2.18章并安装配置内核. 第 ...

  2. 20169212《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 这一周学习了MOOCLinux内核分析的第一讲,计算机是如何工作的?由于本科对相关知识的不熟悉,所以感觉有的知识理解起来了有一定的难度,不过多查查资 ...

  3. 2018-2019-1 20189221 《Linux内核原理与分析》第九周作业

    2018-2019-1 20189221 <Linux内核原理与分析>第九周作业 实验八 理理解进程调度时机跟踪分析进程调度与进程切换的过程 进程调度 进度调度时机: 1.中断处理过程(包 ...

  4. 2017-2018-1 20179215《Linux内核原理与分析》第二周作业

    20179215<Linux内核原理与分析>第二周作业 这一周主要了解了计算机是如何工作的,包括现在存储程序计算机的工作模型.X86汇编指令包括几种内存地址的寻址方式和push.pop.c ...

  5. 2019-2020-1 20199329《Linux内核原理与分析》第九周作业

    <Linux内核原理与分析>第九周作业 一.本周内容概述: 阐释linux操作系统的整体构架 理解linux系统的一般执行过程和进程调度的时机 理解linux系统的中断和进程上下文切换 二 ...

  6. 2019-2020-1 20199329《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 一.上周问题总结: 未能及时整理笔记 Linux还需要多用 markdown格式不熟练 发布博客时间超过规定期限 二.本周学习内容: <庖丁解 ...

  7. 2019-2020-1 20209313《Linux内核原理与分析》第二周作业

    2019-2020-1 20209313<Linux内核原理与分析>第二周作业 零.总结 阐明自己对"计算机是如何工作的"理解. 一.myod 步骤 复习c文件处理内容 ...

  8. 2018-2019-1 20189221《Linux内核原理与分析》第一周作业

    Linux内核原理与分析 - 第一周作业 实验1 Linux系统简介 Linux历史 1991 年 10 月,Linus Torvalds想在自己的电脑上运行UNIX,可是 UNIX 的商业版本非常昂 ...

  9. 《Linux内核原理与分析》第一周作业 20189210

    实验一 Linux系统简介 这一节主要学习了Linux的历史,Linux有关的重要人物以及学习Linux的方法,Linux和Windows的区别.其中学到了LInux中的应用程序大都为开源自由的软件, ...

  10. 2018-2019-1 20189221《Linux内核原理与分析》第二周作业

    读书报告 <庖丁解牛Linux内核分析> 第 1 章 计算工作原理 1.1 存储程序计算机工作模型 1.2 x86-32汇编基础 1.3汇编一个简单的C语言程序并分析其汇编指令执行过程 因 ...

随机推荐

  1. glibc 安装( version `GLIBC_2.14' not found")

    在ubuntu上编译的东西 拿到CentOS 下运行 提示 :“/lib64/libc.so.6: version `GLIBC_2.14' not found” 原因是ubuntu上用的libc 版 ...

  2. 动画讲解 Eclipse 常用快捷键

    Eclipse有强大的编辑功能, 工欲善其事,必先利其器, 掌握Eclipse快捷键,可以大大提高工作效率. 小坦克我花了一整天时间, 精选了一些常用的快捷键操作,并且精心录制了动画, 让你一看就会. ...

  3. 【web安全】第四弹:防火墙技术笔记

    参考资料: <黑客攻防演习>第二版   Ed SKoudis  Tom Liston著 <防火墙.入侵检测与VPN> 马春光 郭方方著 OSI在理论上将网络分为七层,物理层.数 ...

  4. 微软CSS面试全记录

    先是会有一轮简单的电话技术面试,聊的比较随意,什么都会问,跟职位相关的都有.然后会发一些材料说是要学习,是windows内存管理相关的东西. 完了就是一轮oral test,和技术没有任何关系,问问为 ...

  5. leetcode 第二题Add Two Numbers java

    链接:http://leetcode.com/onlinejudge Add Two Numbers You are given two linked lists representing two n ...

  6. Bootstrap 分页插件 ajax获取数据显示

    Bootstrap 分页插件 ajax获取数据显示 标签(空格分隔): bootstrap 文章的内容是使用bootstrap-paginator进行分页,使用ajax获取后台数据.渲染. 1. 版本 ...

  7. Word删除空白页

    1.常见的就是在前一页最后按delete 2.我遇到的问题是,共两页第一页是平常的A4,是表格,第二页也是A4,只不过横着显示(后来才知道的),中间是分节符,不能直接删除的,否则表格各个部分分开在好几 ...

  8. 模拟键盘输入 : SendMessage, keybd_event, PostKeybdMessage

    转自模拟键盘输入 : SendMessage, keybd_event, PostKeybdMessage 目的 最近项目要求在Windows CE下模拟键盘输入,上网搜索了一下,发现有3个API可以 ...

  9. Entity Framework快速入门--IQueryable与IEnumberable的区别(转载)

    IEnumerable接口 公开枚举器,该枚举器支持在指定类型的集合上进行简单迭代.也就是说:实现了此接口的object,就可以直接使用foreach遍历此object: IQueryable 接口 ...

  10. 用 NSURProtocol 注入测试数据

    在之前的几篇博文中,笔者介绍过访问异步网络的单元测试方法及如何使用模拟对象来进一步控制单元测试的范围.在今天的教程中,笔者将展示另一种方法,即:通过自定义 NSURProtocol 类来获取静态测试数 ...