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.操作系统的“两把剑”
中断上下文,即中断处理程序。
进程上下文的切换