实验五:Linux操作系统是如何工作的?破解操作系统的奥秘
SA*****160 *丰
实验内容:
1.操作系统工作的基础:存储程序计算机、堆栈(函数调用堆栈)机制和中断机制;
2.在操作系统工作的基础之上,请您简述操作系统(内核)是如何工作,宏观概述结合关键点的
微观(CS:EIP、EBP/ESP等的变化)分析。
3.完成500字左右的一段总结文字(务必是自己写的),附上学习研究笔记,另外请大家养成尊
重知识产权的习惯引用或参考别人的资料注明出处URL。
4.实验报告以博客URL方式提交
5.请于本周四实验课前提交,最迟提交日期6月30日24:00.
实验过程:
1.存储程序计算机、堆栈(函数调用堆栈)机制和中断机制
1.1存储程序计算机
存储程序计算机最早是由著名数学家冯·诺伊曼等人在1946年总结并明确提出来的,因此又被称为冯·诺伊曼计算机。
存储程序计算机在体系结构上主要特点有:
a.以运算单元为中心
b.采用存储程序原理
c.存储器是按地址访问、线性编址的空间
d.控制流由指令流产生
c.指令由操作码和地址码组成
f.数据以二进制编码
操作系统其实就是一个死循环,CPU一直在执行这个循环,CS:EIP指向下一条要执行的指令。
1.2堆栈(函数调用堆栈)机制
内核在创建进程的时候,在创建task_struct的同时,会为进程创建相应的堆栈。每个进程会有两个栈,
一个用户栈,存在于用户空间,一个内核栈,存在于内核空间。当进程在用户空间运行时,cpu堆栈指
针寄存器里面的内容是用户堆栈地址,使用用户栈;当进程在内核空间时,cpu堆栈指针寄存器里面的
内容是内核栈空间地址,使用内核栈。
具体请参考我的另一篇博文:计算机是怎样工作的
1.3中断机制
中断是CPU的一个功能,就是CPU停下当前的工作,转到中断信号指向的特定工作,同时CPU的控制权发生变化。
存储程序计算机通过函数调用堆栈来工作,而中断的出现使多线程成为可能。中断分为:I/O中断、时钟中断、系
统调用。
中断产生后,由用户态转到内核态,由用户堆栈切换到内核堆栈。
具体请参考我的另一篇博文:中断、异常和系统调用的关系
2.操作系统(内核)是如何工作,宏观概述结合关键点的微观(CS:EIP、EBP/ESP等的变化)分析
2.1内核是由什么组成的
a.内核线程(进程)--> 软中断、tasklet、工作队列
b.系统调用(中断处理程序)
c.中断处理程序(内核执行的控制路径,eg:I/O中断和时钟中断)
其中b和c是内核的控制路径;CPU和内核都是所有进程共享的。
2.2内核工作过程分析
2.2.1下边以时钟中断为例,讲述操作系统内核的工作过程,如下图所示:
单核CPU计算机工作其实是串行的,即每时刻只能执行一个程序,如果我们要“同时”执行多个程序,就要一种机制来切换程序(进程),
使每个进程都能占用CPU,这种机制就是中断和进程调度。
while(1)
{
执行指令;
修改CS:IP使其指向下一条将要执行的指令;
}
操作系统内核就是个死循环,等着被中断。如果没有任务时就执行系统设定好的进程。
1.如果现在一个进程A处于运行状态,esp指向A用户栈,eip指向进程A的下一条将要执行的指令;
2.此时发生时钟中断,CPU找到中断处理总程序的入口处(此地址由CPU厂商指定,而中断处理总程
序由操作系统厂商编写;此过程修改esp使其指向内核栈,修改eip指向中断处理总程序入口处);
3.陷入内核态,保存原来的esp、eip等相关信息到内核栈(需要借助记录CPU状态的TSS),save_all保护现场(也是保存到内核的堆栈);
4.处理中断子程序(进程调度),此过程由于进程调度,切换将要执行进程B的内核栈;
5.restore_all恢复现场,恢复esp的值,使其切换到用户栈;同时iret恢复cs:eip,切换到用户态,执行B程序
关于save_all、restore_all和iret请参考我的另一篇博文:中断处理中的save_all、restore_all和iret
2.2.2以系统调用为例分析内核工作过程
fork和exec系统调用最终都是通过int 0x80软中断 + EAX寄存器(存储对应的系统调用号)进入内核,在内核中fork和exec对应找到
sys_fork/do_fork和sys_exec/do_exec。do_fork主要的工作就是创建一个新进程,创建的方法是拷贝当前进程、分配新的进程pid、
插入进程相关链表队列中等。 do_exec的工作较为复杂,它的主要目标是将一个可执行程序加载到当前进程中来,返回到用户态时EIP
指向可执行程序的入口位置(即 0x08048000)。
参考资料: