Chinaunix

标题: 中断改变cs值吗? [打印本页]

作者: _nosay    时间: 2016-04-01 17:02
标题: 中断改变cs值吗?
hi~ 用户进程执行时发生中断,跑去内核执行服务程序时,cs会被改成__KERNEL_CS吗?
作者: nswcfd    时间: 2016-04-01 17:53
yes,否则的话特权指令就无法执行了。
作者: _nosay    时间: 2016-04-01 18:09
本帖最后由 _nosay 于 2016-04-01 18:16 编辑

回复 2# nswcfd

嗯,而且不光是特权指令,中断服务代码以及内核中的变量,都在内核空间,CPU在访问时,都需要检查cs的dpl是否为0,是吧?
但是,我搜“__KERNEL_CS”,发现只有以下几个文件使用了“__KERNEL_CS宏”,这些代码都和进入中断没关系:
  1. ---- __KERNEL_CS Matches (11 in 7 files) ----
  2. Fpu_entry.c (arch\i386\math-emu):  else if ( FPU_CS == __KERNEL_CS )
  3. head.S (arch\i386\boot\compressed):        ljmp $(__KERNEL_CS), $0x100000
  4. head.S (arch\i386\boot\compressed):        ljmp $(__KERNEL_CS), $0x1000 # and jump to the move routine
  5. head.S (arch\i386\boot\compressed):        ljmp $(__KERNEL_CS), $0x100000
  6. head.S (arch\i386\kernel):        ljmp $(__KERNEL_CS),$1f
  7. head.S (arch\i386\kernel):        movl $(__KERNEL_CS << 16),%eax
  8. Pci-pc.c (arch\i386\kernel):} bios32_indirect = { 0, __KERNEL_CS };
  9. Pci-pc.c (arch\i386\kernel):} pci_indirect = { 0, __KERNEL_CS };
  10. Segment.h (include\asm-arm):#define __KERNEL_CS   0x0
  11. Segment.h (include\asm-i386):#define __KERNEL_CS        0x10
  12. Traps.c (arch\i386\kernel):         "3" ((char *) (addr)),"2" (__KERNEL_CS << 16)); \
复制代码

作者: nswcfd    时间: 2016-04-06 17:32
建议搜一下<中断处理源码情景分析>

应该体现在各种门的初始化中(set_gate),不知道是不是上面trap.c里的那部分?
作者: _nosay    时间: 2016-04-06 18:05
回复 4# nswcfd

我猜测应该是穿过中断门/陷阱门后,硬件自己将门里所包含的段选择码(__KERNEL_CS__),赋值给ecx寄存器,不是软件负责的。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2