实验五 Linux操作系统是如何工作的
来源:互联网 发布:js获取选中的单选框 编辑:程序博客网 时间:2024/04/29 09:48
实验五 Linux操作系统是如何工作的
SG*****059 叶志强
一、操作系统工作基础
1、存储程序计算机:现在的计算机都是存储程序计算机(由控制器、运算器、存储器、输入输出设备组成),我们写好的程序当要使用时会被调入主存(存储器),CPU(运算器、控制器)从主存中取指令执行,CPU周而复始的进行着这项工作,指令顺序的被一条一条的执行,直到该程序被完成。
2、函数调用堆栈机制:堆栈的作用有很多,最主要的作用是发生函数调用时,用来保存当前进程在CPU上有关寄存器的值(如ss,esp,cs,eip等等),即保存现场。当函数调用结束返回时,可以根据保存的值来恢复现场以使当前进程继续执行。
3、中断机制:中断机制是一个总称,即系统调用、中断、异常所用的机制都是中断机制。简单的说,假设当前进程是A,发生某个事件要去执行进程B,在切换进程之前,保存进程A的相关信息到堆栈以便下次得以恢复执行,然后进行中断处理,完后切换到进程B,恢复进程B的现场,从而执行B。
二、操作系统(内核)如何工作
简单的讲,内核的工作过程就是内核频繁地在用户态和内核态之间来回转换以使程序运行完毕完成相应功能。
具体过程如下图:
1、进程X工作在用户态,esp指向用户态进程堆栈的栈顶,当中断发生(中断、异常、系统调用)时,由int 0x80跳转到内核态,esp/eip被压入进程X的内核态堆栈,此时eip经过一些相关的引导后指向将要被处理的中断处理程序的入口处。
2、保存进程X占有的CPU资源的剩余寄存器的值到进程X的内核态堆栈(SAVE_ALL).
3、执行中断处理,在此期间有调度时机,可能会发生进程调度,假设如图中发生调度(schedule())。进程切换schedule()函数分两步完成:
a、切换页目录以安装一个新的地址空间;
b、切换内核堆栈和硬件上下文,由switch_to宏实现。(具体实现见附录)
4、进程切换完选择进程Y执行,esp指向进程Y的内核态堆栈,恢复进程Y的内核栈数据到CPU各寄存器,eip指向进程Y上次挂起时将要执行的下一条指令处。
5、执行iret指令返回进程Y的用户态,esp指向进程Y的用户态栈顶,结束。
附录
switch_to宏功能描述:
1)在eax和edx寄存器中分别保存prev、next的值:
movl prev,%eax
movl next,%edx
2)把eflags和ebp寄存器的内容保存在prev内核栈中。
pushfl
pushl %ebp
3)把esp的内容保存到prev->thread.esp中,以使该字段指向prev内核栈的栈顶:
movl %esp,484(%eax)
4)把next->thread.esp装入esp。
movl 484(%eax),%esp
5)把标记为1的地址(下文)存入prev->thread.eip。当被替换的进程重新恢复执行时,进程执行被标记为1的那条指令。
movl $lf,480(%eax)
6)把next->thread.eip的值压入next内核栈:
push 480(%eax)
7)跳到__switch_to()C函数。
jmp__switch_to
8)这里被进程B替换掉的进程A再次获得CPU:它执行一些保存eflags和ebp寄存器内容的指令,这两条指令的第一条指令被标记为1.
1:
popl %ebp
popfl
9)拷贝eax寄存器内容到switch_to宏的第三个参数last标志的内存区域中。
movl %eax,last
参考资料:
1、http://weibo.com/1703473342/zCaExEg79
2、《深入理解linux内核》
- linux操作系统实验五--Linux操作系统是如何工作的?
- 实验五 Linux操作系统是如何工作的
- 实验五 Linux操作系统是如何工作的?
- 实验五:Linux操作系统是如何工作的?
- 【实验五】Linux操作系统是如何工作的?破解操作系统的奥秘
- 【实验五】Linux操作系统是如何工作的?破解操作系统的奥秘
- 【实验五】Linux操作系统是如何工作的?破解操作系统的奥秘
- 实验五-简述Linux/x86是如何工作的
- linux操作系统是如何工作的
- 浅析Linux操作系统是如何工作的
- 浅谈Linux操作系统是如何工作的?
- Linux操作系统是如何工作的?
- Linux操作系统是如何工作的
- Linux操作系统是如何工作的
- Linux操作系统是如何工作的?
- 操作系统是如何工作的(Linux)
- 《Linux内核分析》-mykernel实验指导(操作系统是如何工作的)
- <实验五>linux操作系统内核的工作过程
- git使用规则
- [黑马程序员] _C#基础知识小结
- MSMQ的安装
- Toast重复显示问题解决
- 黑马程序员----【javaSE基础】个人总结--abstract class和interface的区别
- 实验五 Linux操作系统是如何工作的
- B/S和C/S的区别
- while循环的语法
- 如何将 Memo中的文本内容保存到当前目录下的 Word 文档中
- 关于堆排序中MAX-HEAPIFY中时间复杂度的分析
- 10 个你必须掌握的超酷 VI 命令技巧
- php利用反射真正实现多继承(非接口模拟)
- [黑马程序员] _变量的基本使用方法(赋值、占位符、接收、命名规则)
- MySQL数据库调优之二