代码改变世界

Linux内核分析 02

2016-03-06 14:02  KG35  阅读(302)  评论(0编辑  收藏  举报

二,操作系统是如何工作的

1、函数调用堆栈

 

三大法宝:存储程序计算机 函数调用堆栈 中断机制 

堆栈:是C语言程序运行时必须的一个记录调用路径和参数的空间。是计算机内部现成的东西,我们直接使用。

   包括函数调用框架、传递参数、保存返回地址、提供局部变量的空间等等。

堆栈相关寄存器:esp堆栈指针(栈顶)、ebp基址指针(栈底) * ebp在C语言中用作记录当前函数调用基址。

堆栈操作:push(栈顶地址减少四个字节)、pop(栈顶地址增加四个字节)(32位)

 其他关键寄存器:cs:eip,总是指向下一条指令的地址。(call、ret)

 

//建立被调用函数的堆栈框架

pushl %ebp

movl %esp,%ebp

//被调用者函数体

//do sth

//拆除被调用者函数的堆栈框架

movl %ebp,%esp

popl %ebp

ret

 

call指令是将eip中下一条指令的地址保存在栈顶,设置eip指向被调用程序的代码开始处。

ret将该地址恢复到eip中

 * 举例应用:首先,使用gcc -g 生成test.c的可执行文件test;然后再使用objdump -s获得test的反汇编文件。

       有压栈必有出栈,有生必有死。

       函数的返回值通过eax寄存器传递。

 

2,借助Linux内核部分源代码模拟存储程序计算机工作模型及时钟中断

中断机制如何工作:CPU和内核代码共同实现保存现场和恢复现场。

mykernel的实验,诸如下图:

3,在mykernel基础上构造一个简单的操作系统内核

C语言代码中嵌入汇编代码: asm("statements" : output_regs :inout_regs :clobbered_regs);   输入、输出、破会描述、编译器优化、不允许编译器优化等等。

mysceh的具体内容

两个正在运行的进程之间做进程上下文转换 

* 操作系统的两把剑:中断上下文和进程上下文的切换

时间片轮转的例子,时间片可以改小一点。

4,学习心得体会

  基本了解了函数调用堆栈的过程和原理,中断机制的工作原理,以及mykernel的一些相关知识,最后学习了一下时间片轮转的实验举例。总的来说内容不多也不算少,还是需要一些时间来消化和理解的。很不错的一次自学。