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吴汉彦  阅读(347)  评论(0)    收藏  举报