Linux操作系统是如何工作的?破解操作系统的奥秘
学号:SA12**6112
研究笔记:
本博文主要是根据前3篇笔记来总结Linux内核的工作机制。
一:操作系统工作的基础
存储程序计算机:
存储程序计算机最早的是冯.诺伊曼体系结构,即以运算为中心,采用存储程序原理,根据指令顺序执行的计算机。
堆栈机制:
在计算机是怎么样工作的中我们分析了,在系统调用过程中,用户态堆栈的变化,在 用户态到内核态切换之奥秘解析,进程切换之奥秘解析中我们分析了内核态堆栈的变化。
进而可以发现堆栈在操作系统的工作中的作用:通过堆栈来保存任务切换过程中的上下文,进而在顺序执行的基础上支持了多任务操作。
中断机制:
通过中断机制,计算机可以改变指令的执行顺序,可以中断来协调处理器和外部设备的工作,进而提高了操作系统的工作效率。
二:Linux内核的工作原理
Linux内核其实就是一种特殊的软件,夹在硬件和应用程序之间,通过Linux内核中的一些抽象概念(进程、虚拟存储器、文件)向应用程序提供简单一致的机制来控制负责的低级硬件设备。
那Linux内核具体是怎么工作的呢?
通过前面3篇研究笔记及结合孟老师上课的内容,现总结如下:
进程是正在运行的程序的一种抽象,它的工作路径是:用户态-内核态-用户态 反复循环,虽然途中可能会发生进程的切换,但是它总的工作方式不会改变,下面我们来具体总结下这过程的5个阶段:
第一阶段:进程从用户态切换到内核态 :
(1)通过读取TR寄存器获得TSS,再根据TSS来获得当前进程的内核栈的栈顶指针sp0和栈段描述符,并用它们装载esp和ss,由控制单元在内核栈中保存当前进程的eflags,cs,ss,eip,esp等寄存器的值,并通过SAVE_ALL来保存其他常用寄存器的值到内核栈。
(2)用TSS中的内核代码段选择符_KERNEL_CS装载CS寄存器
用中断或者异常处理程序的第一条指令地址装载EIP寄存器
(3)跳转到EIP所指示的地址处开始执行内核代码
这部分内核代码详细分析过程请见研究笔记:用户态到内核态切换之奥秘解析
第二阶段:中断处理
跳转到EIP所指向的指令处后,开始执行内核程序,从这里开始内核的控制路径,注意事项有:
(1)在中断处理过程中,允许嵌套。
(2)在中断处理程序运行期间不能发生进程切换
(3)在中断处理结束时,检查当前进程描述符中的need_resched数据段,判断其是否为1,如果等于1,则调用schedule进行进程调度和切换。
第三阶段:进程切换
通过schedule()函数在运行队列的链表中找到一个进程,并随后通过switch_to宏来进行进程切换。
(1) 首先切换页全局目录
(2)切换内核堆栈
(a)把eflags和ebp寄存器保存到prev内核栈中。
(b)把esp保存到prev->thread.sp中,eip保存到prev->thread.ip中。
(c)把next指向的新进程的thread.esp保存到esp中,把next->thread.ip保存到eip中
(3)切换TSS
(a) load_sp0(tss, next); 从下一个进程的thread字段中获取它的sp0,并用它来更新TSS中的sp0
(b) __switch_to_xtra(prev_p, next_p, tss);必要的时候会更新IO权位值。
详细代码分析请见研究笔记:进程切换之奥秘解析
第四阶段: 处理挂起信号、虚拟模式等任务
除了处理进程切换请求,内核此时还会检查是否有信号处理请求和其他工作。
处理完上述任务后,再跳转到restore_all处,恢复被中断的程序。
第五阶段: 从内核态返回用户态
从内核态到用户态主要是执行 restore_all 和 Iret
RESTORE_ALL:主要是恢复SAVE_ALL时保存在内核栈中的常用寄存器的值
IRET指令:
主要工作是:(1)用保存在内核栈中的值装载CS、EIP、EFLAGS寄存器
(2)恢复SS、ESP寄存器的值。
(3)转到用户态继续执行。
参考资料:3.3版本的内核源码
深入理解Linux内核(第三版)
Linux操作系统是如何工作的?破解操作系统的奥秘的更多相关文章
- Linux操作系统是如何工作的
<实验五——Linux操作系统是如何工作的?破解操作系统的奥秘> 姓名:方超 学号:SA12**6201 Linux操作系统工作的基础 存储程序计算机.堆栈(函数调用堆栈)机制和中断机制是 ...
- 浅析Linux操作系统是如何工作的(思维导图)
SA***189 多任务计算机运转机制如下思维导图所示: 小结: Linux操作系统是一个在时钟的节拍下,各个模块紧密协作.密不可分的整体,而整个Linux系统都是建立在存储程序的基础之上,正是有了程 ...
- Linux操作系统分析__破解操作系统的奥秘
学号:SA12226343 姓名:sunhongbo 一.操作系统工作的基础 存储程序计算机和堆栈(函数调用堆栈)机制以及中断机制是操作系统工作的基础. 现代计算机仍采用存储程序计算机的结构体系和工 ...
- Linux内核分析第二周学习总结:操作系统是如何工作的?
韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.函数调用堆栈 ...
- Linux操作系统学习_操作系统是如何工作的
实验五:Linux操作系统是如何工作的? 学号:SA1****369 操作系统工作的基础:存储程序计算机.堆栈(函数调用堆栈)机制和中断机制 首先要整明白的一个问题是什么是存储程序计算机?其实存储程序 ...
- 《Linux内核分析》第二周 操作系统是如何工作的?
[刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK TWO(2 ...
- Linux内核分析——操作系统是如何工作的
万子惠 + 原创作品转载请注明出处 + <Linux内核分析> 实验部分 使用实验楼的虚拟机打开shell 然后cd mykernel 您可以看到qemu窗口输出的内容的代码mymain. ...
- Linux内核分析之操作系统是如何工作的
在本周的课程中,孟老师主要讲解了操作系统是如何工作的,我根据自己的理解写了这篇博客,请各位小伙伴多多指正. 一.知识点总结 1. 三个法宝 存储程序计算机:所有计算机基础性的逻辑框架. 堆栈:高级语言 ...
- Linux内核分析作业二—操作系统是如何工作的
一.实验:简单的时间片轮转多道程序内核代码运行与分析 my_start_kernel之前都是硬件初始化,它是操作系统的执行入口,每循环100000次就进行一次打印. 执行更加简单,每次时钟中断时都会调 ...
随机推荐
- java的socket 编程
之前在学校的时候,有时间但是总是学不进去,现在工作了,总想多学点东西,但是又是没有时间来学习,只能在工作的闲暇之余,给自己充充电,随着学习的深入,越来月发现Java真的很强大,几乎什么都可以做的,以下 ...
- Codeforces Round #268 (Div. 1) A. 24 Game 构造
A. 24 Game Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/468/problem/A D ...
- 12.1 文档相关 Webbrowser 该文档已被修改,是否保存修改结果
附件:http://files.cnblogs.com/xe2011/Webbrowser_Document_IsModified.rar 该文档已被修改,是否保存修改结果?是:保存修改结果 ...
- C 高级编程5 IO与文件权限
三.基于文件的描术符号 .得到文件描术符号/释入文件描术符号 a.文件类型 目录文件 d 普通文件 f 字符设务文件 c 块设备文件 b 软连接文件 l 管道文件 p socket文件 s 字符设备文 ...
- [Effective C++ --020]宁以pass-by-reference-to-const替换pass-by-value
前言: 我们都用过C的值传递方式,那么在C++情况下,值传递是怎样工作的呢? 比如: int foo(int x); int i; foo(i); 1.程序内部先取得i的一个副本 2.将副本传递到fo ...
- CCCatmullRomTo&CCCatmullRomBy
注: 云形线(Catmull-Rom curve曲线) 云线(Spline或B-spline)在数学上有很多种类,常用的三阶云线有Hermite, Bezier, Uniform B-spline, ...
- java跨平台性分析
实不相瞒,Java是我见过的执行效率最低的程序设计语言,前不久在CSDN论坛上有个评测,计算9999的阶乘,同样的循环算法,Java的耗时是.NET的5倍.我以前很喜欢Serv-U,自从它用Java重 ...
- Day03 - Python 函数
1. 函数简介 函数是组织好的,可重复使用的,用来实现单一或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.Python提供了许多内建函数,比如print():也可以自己创建函数,这 ...
- 关于Eclipse插件开发(五)-----编辑器类方法的使用说明
上面有讲ChinaEditor类继承EditorPart抽象类时,只实现了init,createPartControl两个方法,本节将逐步讲解其他的5个方法的用法. EditorPart方法的执行情况 ...
- UVA - 213 Message Decoding (输入字符串并对单个字符进行操作的输入输出)
POINT: 关于表示一个编码:利用code字符数组表示一个编码字符,其中code[len][val]表示长度为len,二进制值为val的字符: 主程序如下: #include <iostrea ...