linux0.11任务切换switch_to
来源:互联网 发布:美国网站域名后缀 编辑:程序博客网 时间:2024/05/16 17:35
#define switch_to(n) {\struct {long a,b;} __tmp; \__asm__("cmpl %%ecx,current\n\t" \"je 1f\n\t" \"movw %%dx,%1\n\t" \"xchgl %%ecx,current\n\t" \"ljmp *%0\n\t" \"cmpl %%ecx,last_task_used_math\n\t" \"jne 1f\n\t" \"clts\n" \"1:" \::"m" (*&__tmp.a),"m" (*&__tmp.b), \"d" (_TSS(n)),"c" ((long) task[n])); \}
上面的嵌入宏汇编代码就是完成任务的切换操作。首先判断传递进来的任务号n是否是当前任务,如果是就跳出,否则将current指向task[n],然后长跳转任务n的TSS选择符,这样就完成了任务切换操作。
注意:
1. 跳转到TSS段选择符会造成任务切换到该TSS对应的进程。
2. 对于造成任务切换的长跳转,TSS段基址无用。
在保护模式下CPU进行长跳转,如果发现段选择符指向TSS段,那么CPU将会自动将TSS段的内容加载到当前CPU寄存器中,比如eax,ldr,cs,ss,esp等等,其实就是104字节的TSS结构的所有成员变量赋值给CPU寄存器(注意这里是ss0和esp0)。再次强调这个过程是自动完成的。进程TSS结构的初始值在copy_process函数中完成,最后调用set_tss_desc函数将tss段插入到gdt描述符表中,在该函数中设置TSS的段基址和段长度(104字节)。
代码中 ljmp *%0 指令需要说明下,对于长跳转首先要指定段寄存器,其次就是偏移。在32位保护模式下,长跳转段寄存器其实也就变成了段选择符,即ljmp sel:offset。代码中该条指令的操作数是一个结构体,其实这个结构体的第一个成员就是偏移,第二个成员也就是选择子了。由于选择子是16位的,所以第二个成员的高2字节无用,程序中定义成32位的long型是为了字节对齐。所以要跳转到任务n的TSS段,首先就要对__tmp结构的b成员赋值,如果目标段为TSS段,则段基址无用,至于原因,这是intel规定的,所以没有为什么。因此最后ljmp *%0就是ljmp __tmp.b : __tmp.a
0 0
- linux0.11任务切换switch_to
- linux0.11中switch_to理解
- linux0.11中switch_to理解
- Linux任务切换代码(switch_to)详解
- Linux任务切换代码(switch_to)详解
- Linux0.11内核--进程的调度schedule和switch_to解析
- linux0.11 汇编 切换到任务0 的相关描述
- linux0.11学习笔记-技术铺垫-简单AB任务切换程序(5)-实现三个任务切换
- linux0.11 进程切换
- switch_to及ret_from_sys_call控制任务的切换与返回
- switch_to及ret_from_sys_call控制任务的切换与返回
- Linux0.12任务调度与进程切换
- 进程切换switch_to()注释
- linux0.11学习笔记-技术铺垫-简单AB任务切换程序(3)-调试手段和方法
- 分析进程切换宏 switch_to
- Linux 0.12 switch_to切换过程
- Linux0.11进程切换和TSS结构
- linux0.11学习笔记-技术铺垫-简单AB任务切换程序(1)-实现一个简单的bootloader
- 如何设置JTable不可编辑
- BDTC2014中国大数据技术大会 会议记录
- C语言大世界—————09指针类型之函数指针+函数别名 福利篇
- 自己写的detab函数
- Linux epoll工作原理
- linux0.11任务切换switch_to
- 面向对象与面向过程小结
- JScrollPane,JTable
- asm磁盘管理
- 第十六周项目2-用指针玩字符串(去除字符串中的特定字符)
- form中的button按钮在IE11中自动提交表单问题导致弹出框关闭之后表单被重置
- 黑马程序员之ios学习总结——12 OC语言的内存管理2
- Convolution Neural Network (CNN) 原理与实现
- 数学有用,有啥用?