- 论坛徽章:
- 0
|
CPU的特权级是CPU的属性,当CPU处于低特权级时有些指令是不能执行的。
操作系统利用CPU的特权级分出用户级和内核级
用户级代码属于低特权级,只能执行CPU有限的指令
内核级代码属于高特权级,可以执行CPU所有的指令
用户态只能通过系统调用进入内核态(int $80)
int $80执行的时候,CPU自动切换CS段的特权(在调用门定义的)
#define _set_gate(gate_addr,type,dpl,addr) \
do { \
int __d0, __d1; \
__asm__ __volatile__ ("movw %%dx,%%ax\n\t" \
"movw %4,%%dx\n\t" \
"movl %%eax,%0\n\t" \
"movl %%edx,%1" \
:"=m" (*((long *) (gate_addr))), \
"=m" (*(1+(long *) (gate_addr))), "=&a" (__d0), "=&d" (__d1) \
:"i" ((short) (0x8000+(dpl<<13)+(type<< )), \
"3" ((char *) (addr)),"2" (__KERNEL_CS << 16)); \
} while (0)
进入int $80之后有一段saveall的代码,saveall把DS段和ES段都设置为高特权
#define SAVE_ALL \
cld; \
pushl %es; \
pushl %ds; \
pushl %eax; \
pushl %ebp; \
pushl %edi; \
pushl %esi; \
pushl %edx; \
pushl %ecx; \
pushl %ebx; \
movl $(__KERNEL_DS),%edx; \
movl %edx,%ds; \
movl %edx,%es;
其中__KERNEL_CS和__KERNEL_DS的0和1位(RPL位)为0,就是特权0级
[ 本帖最后由 readkernel 于 2009-11-30 17:15 编辑 ] |
|