实验五: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)。

 

参考资料:

维基百科之存储程序计算机

孟老师:实验二参考答案

posted @ 2013-06-27 18:28  独墅一枝花  阅读(441)  评论(1编辑  收藏  举报