_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宏”,这些代码都和进入中断没关系:---- __KERNEL_CS Matches (11 in 7 files) ----
Fpu_entry.c (arch\i386\math-emu):else if ( FPU_CS == __KERNEL_CS )
head.S (arch\i386\boot\compressed):        ljmp $(__KERNEL_CS), $0x100000
head.S (arch\i386\boot\compressed):        ljmp $(__KERNEL_CS), $0x1000 # and jump to the move routine
head.S (arch\i386\boot\compressed):        ljmp $(__KERNEL_CS), $0x100000
head.S (arch\i386\kernel):        ljmp $(__KERNEL_CS),$1f
head.S (arch\i386\kernel):        movl $(__KERNEL_CS << 16),%eax
Pci-pc.c (arch\i386\kernel):} bios32_indirect = { 0, __KERNEL_CS };
Pci-pc.c (arch\i386\kernel):} pci_indirect = { 0, __KERNEL_CS };
Segment.h (include\asm-arm):#define __KERNEL_CS   0x0
Segment.h (include\asm-i386):#define __KERNEL_CS        0x10
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寄存器,不是软件负责的。
页: [1]
查看完整版本: 中断改变cs值吗?