通过内嵌汇编实现模拟时间片轮转多道程序的内核代码分析
2015-03-13 16:15
274 查看
刘昆
+相关实验环境与代码源自:https://github.com/mengning/mykernel
+ 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
核心代码分析代码(时间片轮转分析)分析:
if(next->state ==
0)/* -1 unrunnable, 0 runnable, >0 stopped */
{
/* switch to next process */
asmvolatile(
"pushl %%ebp\n\t" /* save ebp */
"movl %%esp,%0\n\t"/* save esp */ //保存当前进程堆栈现场状态
"movl %3,%%esp\n\t" /* restore esp *///加载即将切换的新进程堆栈状态,进入新进程运行的堆栈状态
"movl $1f,%1\n\t" /* save eip *///保存当前进程EIP,即进程下次运行时的起点位置(注,即label
1:位置)
"pushl %4\n\t" //即将切换的进程的EIP入栈
"addl $1,%2" //进程切换次数(个人添加,无关信息)
"ret\n\t" /* restore eip */ //进程进入下一个进程
"1:\t" /* next process start here */
"popl %%ebp\n\t" //弹出%%ebp,恢复之前保存的堆栈现场
:"=m" (prev->thread.sp),"=m" (prev->thread.ip),"=m"(procee_switch_count)
:"m" (next->thread.sp),"m" (next->thread.ip)
);
my_current_task = next;
printk(KERN_NOTICE">>>switch %d to %d<<<\n",prev->pid,next->pid);
}
else
{
next->state =0;
my_current_task = next;
printk(KERN_NOTICE">>>switch %d to %d<<<\n",prev->pid,next->pid);
/* switch to new process */
asmvolatile(
"pushl %%ebp\n\t" /* save ebp */
"movl %%esp,%0\n\t"/* save esp */ //保存当前进程堆栈现场状态
"movl %3,%%esp\n\t" /* restore esp */
"movl %3,%%ebp\n\t" /* restore ebp *///加载即将切换的新进程堆栈状态,进入新进程运行的堆栈状态
"movl $1f,%1\n\t" /* save eip
即进程下次运行时的起点位置*/
"pushl %4\n\t"
"addl $1,%2"
"ret\n\t" /* restore eip
*/
:"=m" (prev->thread.sp),"=m" (prev->thread.ip),"=m"(procee_switch_count)
:"m" (next->thread.sp),"m" (next->thread.ip)
);
}
代码运行简易流程
代码运行实验截图
+相关实验环境与代码源自:https://github.com/mengning/mykernel
+ 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
核心代码分析代码(时间片轮转分析)分析:
if(next->state ==
0)/* -1 unrunnable, 0 runnable, >0 stopped */
{
/* switch to next process */
asmvolatile(
"pushl %%ebp\n\t" /* save ebp */
"movl %%esp,%0\n\t"/* save esp */ //保存当前进程堆栈现场状态
"movl %3,%%esp\n\t" /* restore esp *///加载即将切换的新进程堆栈状态,进入新进程运行的堆栈状态
"movl $1f,%1\n\t" /* save eip *///保存当前进程EIP,即进程下次运行时的起点位置(注,即label
1:位置)
"pushl %4\n\t" //即将切换的进程的EIP入栈
"addl $1,%2" //进程切换次数(个人添加,无关信息)
"ret\n\t" /* restore eip */ //进程进入下一个进程
"1:\t" /* next process start here */
"popl %%ebp\n\t" //弹出%%ebp,恢复之前保存的堆栈现场
:"=m" (prev->thread.sp),"=m" (prev->thread.ip),"=m"(procee_switch_count)
:"m" (next->thread.sp),"m" (next->thread.ip)
);
my_current_task = next;
printk(KERN_NOTICE">>>switch %d to %d<<<\n",prev->pid,next->pid);
}
else
{
next->state =0;
my_current_task = next;
printk(KERN_NOTICE">>>switch %d to %d<<<\n",prev->pid,next->pid);
/* switch to new process */
asmvolatile(
"pushl %%ebp\n\t" /* save ebp */
"movl %%esp,%0\n\t"/* save esp */ //保存当前进程堆栈现场状态
"movl %3,%%esp\n\t" /* restore esp */
"movl %3,%%ebp\n\t" /* restore ebp *///加载即将切换的新进程堆栈状态,进入新进程运行的堆栈状态
"movl $1f,%1\n\t" /* save eip
即进程下次运行时的起点位置*/
"pushl %4\n\t"
"addl $1,%2"
"ret\n\t" /* restore eip
*/
:"=m" (prev->thread.sp),"=m" (prev->thread.ip),"=m"(procee_switch_count)
:"m" (next->thread.sp),"m" (next->thread.ip)
);
}
代码运行简易流程
代码运行实验截图
相关文章推荐
- 通过swap代码分析C语言指针在汇编级别的实现
- Linux内核分析课程--通过反汇编一个简单的c程序,分析汇编代码并理解计算机如何工作的
- FUSE 内核实现代码分析(二) 队列管理
- linux 内核源代码情景分析——linux 内核源码中的汇编语言代码
- C++链表AT&T代码,通过Ubuntu实现生成(Linux内核分析笔记)
- Linux0.11内核--汇编代码实现C函数
- VC实例分析:VC++通过汇编获取代码运行时间
- C++中通过指针,引用方式做返回值的汇编代码分析
- 用内核定时器来实现的按键驱动代码分析以及测试代码
- 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- 基于visual c++之windows核心编程代码分析(53)在C++中嵌入汇编实现DLL注入源代码
- 通过汇编代码分析单任务与多任务计算机的工作方式
- 在VC++通过汇编实现获取代码运行时间
- 云课堂 Linux内核分析 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- php中通过curl模拟登陆discuz论坛的实现代码
- 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- 在C++中内嵌汇编代码分析
- 基于visual c++之windows核心编程代码分析(34)WinIo驱动级模拟按键的实现
- 介绍如何通过代码实现模拟按键的函数
- 通过分析汇编代码理解计算机如何工作