linux内核分析 第二周

一、实验截图

  • 网络太卡,实验楼的实验没有太多的截图,下面的代码是看着老师的视频分析的。

二、代码解析

1.mymain.c

asm volatile(

    "movl %1,%%esp\n\t"     // 将进程的task[pid].thread.sp,即esp赋给esp寄存器

    "pushl %1\n\t"          // ebp入栈:因为在这里栈为空,esp==ebp,所以push的%1就是esp就是ebp。
    
	"pushl %0\n\t"          // 进程入口task[pid].thread.ip入栈
    
	"ret\n\t"               // 把进程入口task[pid].thread.ip赋给eip,即从这之后0号进程启动
    
	"popl %%ebp\n\t"

    : 

    : "c" (task[pid].thread.ip),"d" (task[pid].thread.sp)   //"c"、"d"表示ecx和edx,将task[pid].thread.ip的值给ecx寄存器,将task[pid].thread.sp的值给edx寄存器

);

2.myinterrupt.c

asm volatile(


    "pushl %%ebp\n\t"       // 当前进程的ebp入栈保存

    "movl %%esp,%0\n\t"     // 把当前进程的esp赋值到prev->thread.sp中保存下来

    "movl %2,%%esp\n\t"     // 把下一个进程的next->thread.sp放到esp中

    "movl $1f,%1\n\t"       // $1f指接下来的标号1:的位置,即将1:的地址赋值给prev->thread.ip 

    "pushl %3\n\t"          // 把下一个进程的eip:next->thread.ip入栈保存起来

    "ret\n\t"               // 还原eip

    "1:\t"                  // 将该处地址标记为1

    "popl %%ebp\n\t"		// ebp出栈

    : "=m" (prev->thread.sp),"=m" (prev->thread.ip)

    : "m" (next->thread.sp),"m" (next->thread.ip)

); 

3.myinterrupt.c

asm volatile(  
	
	"pushl %%ebp\n\t"       // ebp入栈保存

    "movl %%esp,%0\n\t"     // esp赋值给prev->thread.sp

    "movl %2,%%esp\n\t"     // 将next->thread.sp,即下一进程的sp存入esp

    "movl %2,%%ebp\n\t"     // 将下一进程的next->thread.sp,即bp(由于栈空,所以esp和ebp指向同一位置)存入ebp

    "movl $1f,%1\n\t"       // 把标记1的地址赋值给prev->thread.ip

    "pushl %3\n\t"          // next->thread.ip入栈保存 

    "ret\n\t"               // 还原eip

    : "=m" (prev->thread.sp),"=m" (prev->thread.ip)

    : "m" (next->thread.sp),"m" (next->thread.ip)

);

三、本周总结

1.计算机的三个法宝

存储程序计算机:所有计算机基础性的逻辑框架。

函数调用堆栈:高级语言的起点,函数调用需要堆栈机制。

中断机制:多道系统的基础,是计算机效率提升的关键。

2.函数调用堆栈

堆栈是C语言程序运行时必须的一个记录调用路径和参数的空间,即CPU内已经集成好了很多功能。

堆栈的元素:函数调用框架、传递参数、保存返回地址(%eax)、提供局部变量空间等。

3.操作系统的“两把剑”

中断上下文,即中断处理程序。

进程上下文的切换

《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

posted @ 2016-03-06 16:15  20135312吴汉彦  阅读(318)  评论(0编辑  收藏  举报