攥写人:李鹏举 学号:20179203
原创作品转载请注明出处
( 学习课程:《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 )

一、视频学习总结

1.1 计算机是如何工作的

1.1.1 计算机的三个法宝

存储程序计算机、函数调用堆栈、中断机制。
堆栈是C语言程序运行时必须记录调用路径和参数的空间。(函数调用框架、传递参数、保存返回地址、提供局部变量空间)

1.1.2 深入理解函数堆栈

(1)push栈顶减少4个字节
pop栈顶增加4个字节
ebp在C语言中用作记录当前函数调用基址
(2)其他关键寄存器:
1、堆栈用到的寄存器
1.esp,指向栈顶
2.ebp,指向栈底,在C语言中用作记录当前函数调用基址。
2、EIP寄存器
cs:eip:总是指向下一条的指令地址
顺序执行:总是指向地址连续的下一条指令
跳转/分支:cs : eip的值会根据程序需要被修改
3、C代码中嵌入汇编代码的写法


汇编代码模板:

具体来讲就是:

寄存器前双%         例子:movl $3,%%ebp;

%加数字,代表代码末的输出或输入 例子:addl %1,%%eax;

                 :"d"(val1) /d代表edx寄存器/

                 :"c"(val2) /c代表ecx寄存器/

                 即为把val2赋给eax

二、实验要求:

完成一个简单的时间片轮转多道程序内核代码,代码见视频中或从mykernel找。
mykernel实验指导(操作系统是如何工作的)
运行并分析一个精简的操作系统内核,理解操作系统是如何工作的
使用实验楼的虚拟机打开shell
cd LinuxKernel/linux-3.9.4
qemu -kernel arch/x86/boot/bzImage
然后cd mykernel 您可以看到qemu窗口输出的内容的代码mymain.c和myinterrupt.c
使用自己的Linux系统环境搭建过程参见mykernel,其中也可以找到一个简单的时间片轮转多道程序内核代码

三、实验过程

首先通过:cd LinuxKernel/linux-3.9.4 qemu -kernel arch/x86/boot/bzImage

看到了程序的执行结果:

之后通过cd mykernel 您可以看到qemu窗口输出的内容的代码mymain.c和myinterrupt.c

四、操作系统内核源代码的分析

首先是mypcb.c代码:

这个代码的目的是定义一个进程控制块。先定义了一个Thread来存储ip和sp,也就是用于eip和esp的保存。PCB中定义了进程管理相关的数据结构。最后的函数my_schedule表示的是调度器。

接下来是mymain.c代码:

先是include mypcb。声明了一个数组task,然后声明了当前task的一个指针,第20行处定义了一个标志,用来判断是否需要调度。然后定义了一个函数my_process。

my_start_kernel函数中先初始化一个进程0,第32行为定义进程0的入口为my_process,因为一开始系统里只有进程0,所以第34行代码表示的是pid的next还是指向自己。接下来就创建更多其他的进程,在初始化这些进程的时候可以直接把0号进程的代码拷贝过来,第41行表示每个进程都有自己的堆栈,然后把创建好的新进程放到进程列表的尾部,这样就完成了创建。
创建好了之后就可以开始执行0号进程,第48行处到之后的几行代码表示的是一段嵌入式汇编代码。其中的%0表示的是参数thread.ip,%1表示的是参数thread.sp。第49行表示的就是把参数thread.sp放到esp中;接下来push %1,又因为当前栈为空,esp=ebp,所以等价于push ebp;然后push thread.ip;ret等价于pop thread.ip;最后pop ebp。
ret之后0号进程就正式启动了。
函数my_process定义所有进程的工作。这个函数里面定义了一个循环,if语句表示循环1000万次才有机会判断是否需要调度。这是一个主动调度的机制。
最后是myinterrupt.c的代码:

接着是一个函数my_timer_handler,用于设置时间片的大小,时间片用完时设置一下调度标志。当时钟中断发生1000次,并且my_need_sched!=1时,把my_need_sched赋为1。因为当进程发现my_need_sched=1时,就会执行my_schedule。

If语句表示task为空,即发生错误时返回。第52行开始介绍my_scheduel的工作,先把当前进程的下一个进程赋给next,当前进程为prev。
第54行表示如果下一个进程的状态是正在执行的话,就运用if语句中的代码表示的方法来切换进程,这些代码为嵌入式汇编代码,与mymain.c代码中的相似。
%0表示prev->thread.sp,%1表示prev->thread.ip,%2表示next->thread.sp,%3表示next->thread.ip。push ebp为保存当前进程的ebp;然后保存当前进程的esp;把下一个进程的sp放到esp中;接下来保存eip,$1表示后面的标号1:的位置;然后把下一个进程的eip push到栈里面。

ret之后下一个进程就开始执行了。这是进程切换的关键代码。

与上一段代码不同的是如果下一个进程为新进程时,就运用else中的这一段代码。首先将这个进程置为运行时状态,将这个进程作为当前正在执行的进程。

五、实验总结:

本次实验首先总结了一下linux操作系统的工作方式,并且了解到了计算机工作的三大法宝,而且了解了堆栈的工作方式和如何在C语言中嵌套汇编语言的方法。懂得了如何在Linux系统中查看相应的代码,然后进行了一段时间片轮转的操作系统内核代码的分析,跟着学习视频一步步的进行学习,认识到了一个很基础的Linux系统的时间片轮转的操作系统内核,分析可能有些部分不全面,也没来得及在自己的linux系统中搭建相应的mykernel环境。分析的目的是为了学习了解,并且我会慢慢按照现在的分析过程去分析更多复杂一些的内核程序,在这个过程中熟练掌握Linux的基础操作,虽然估计离自己编写内核还有一定差距,但还是要努力跟着课程去学习。

2017-2018-1 20179203 《Linux内核原理与分析》第三周作业的更多相关文章

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

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

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

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

  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. 【React Native开发】React Native配置执行官方样例-刚開始学习的人的福音(8)

    ),React Native技术交流4群(458982758),请不要反复加群! 欢迎各位大牛,React Native技术爱好者加入交流!同一时候博客左側欢迎微信扫描关注订阅号,移动技术干货,精彩文 ...

  2. Android 一个强大的图片选择器

    看看下面的图片选择器,感觉很不错 http://www.jcodecraeer.com/a/anzhuokaifa/2017/0122/7083.html 看看下面的图片选择器,支持视频等 http: ...

  3. MySQL登陆数据库

    下面是几种登陆到MySql数据库的登陆方式代码 1mysql -u root -ppassword 2.mysql -u root -p Enter password:password3.mysql ...

  4. [Tjoi2018]数学计算

    [Tjoi2018]数学计算 BZOJ luogu 线段树分治 是不是想问为什么不暴力做? 模数没说是质数,所以不一定有逆元. 然后就是要每次build一下把线段树权值init成1, 博猪不知道为什么 ...

  5. iOS应用公布Invalid Binary问题解决方式

    上次公布一淘HD应用.头一天公布,第二天就上线,私下还在想.是不是苹果採用什么优化的解决方式了,导致审核速度加快了. 这两天公布新版.一直碰到Invaild Binary问题.才想明确,原来大家都被这 ...

  6. 移动端 触摸事件 ontouchstart、ontouchmove、ontouchend、ontouchcancel[转]

    转:http://www.cnblogs.com/irelands/p/3433628.html 1.Touch事件简介pc上的web页面鼠 标会产生onmousedown.onmouseup.onm ...

  7. KinedEditor特性

    谷歌浏览器会将kindeditor在其他js文件加载完之后加载 kindeditor是异步加载,document.ready完了,kindeditor可能还没加载完 kind会将选区变成一个节点 1. ...

  8. Chrome Extension 扩展程序 小白入门

    Chrome Extension 扩展程序 前请说明:本文适用于之前从来没有接触过chrome extension扩展程序的同学~ 编写demo 创建项目文件夹chrome_ext_demo,在项目根 ...

  9. oss2模块和aliyun oss链接

    安装oss pip install oss2 首先已经理解OSS 基本概念,如Bucket.Object.Endpoint.AccessKeyId和AccessKeySecret等. 下面介绍如何使用 ...

  10. leetcode 901. Online Stock Span

    Write a class StockSpanner which collects daily price quotes for some stock, and returns the span of ...