1>
2>各层堆栈指针区域
0级内核堆栈,总被压入者认为其是空栈!
3>地址映射寄存器区域
在分页机制下,由线性地址空间到物理地址空间的映射 由包含页目录起始地质的控制寄存器CR3确定。
与 任务相关的虚拟地址空间 到物理地址空间的映射由LDTR和CR3确定!
----------------------------------------------------------------------------------------------------
整体思路,及详细分析!
一
二
三
四 完成跳转,实现ring0->ring1(kernel.asm之restart)
1 restart:
2 mov esp, [p_proc_ready] ;ESP 指向进程表A结构体的 首地址!
3 lldt [esp + P_LDT_SEL] ;加载LDTR选择子 ;指向了进程testA表中的ldt_sel , ldt_sel指向;SELECTOR_LDT_FIRST==0x28
4 lea eax, [esp + P_STACKTOP] ;指向了进程testA表中的Reg结构体的尾地址
5 mov dword [tss + TSS3_S_SP0], eax ;TSS表中的esp0(0级堆栈) 当中断跳转的时候 把esp0 转到当前esp!
6
7 pop gs ;把TestA()进程表中的gs 放戴 CPU的gs
8 pop fs
9 pop es
10 pop ds
11 popad
12 add esp, 4 ;跳过retaddr
13 iretd ;eip cs eflags
相关原理: 1.在任务切换的过程中;处理器中的各寄存器的当前值,被自动保存到TR所指定的TSS中.
2.下一个任务的TSS的选择子被装入TR,最后从TR所以指定的TSS中取出来各寄存器的值
送到CPU的各寄存器!