对于中断的理解
针对时钟中断而言,如果Intel 8253(8254)定时器设置后,会每隔xx毫秒发送时钟中断(IRQ0)信号,给到Intel 8259A的1号芯片的IR0引脚。
然后中止当前正在执行的程序,通过 IDTR+中断向量号 来确定对应的中断程序并执行。
此时操作代码等使用的是GDTR还是IDTR呢???
由于setup.s中已经将设置了IDT和GDT,并且若中断发生在用户进程时。该如何确定使用的是全局描述符还是局部描述符呢?
.align 2
timer_interrupt:
push %ds # save ds,es and put kernel data space
push %es # into them. %fs is used by _system_call
push %fs
pushl %edx # we save %eax,%ecx,%edx as gcc doesn't
pushl %ecx # save those across function calls. %ebx
pushl %ebx # is saved as we use that in ret_sys_call
pushl %eax
movl $0x10,%eax # ds,es置为指向内核数据段。在setup.s中设置的GDT第6项数据
mov %ax,%ds
mov %ax,%es
movl $0x17,%eax # fs置为指向局部数据段(出错程序的数据段)。fs为何物还不甚清楚。???希望哪
位大侠解释
mov %ax,%fs
incl jiffies
# 由于初始化中断控制芯片时没有采用自动EOI,所以这里需要发指令结束该硬件中断。
movb $0x20,%al # EOI to interrupt controller #1
outb %al,$0x20 # 操作命令字OCW2 送0x20 端口。
# 下面3 句从选择符中取出当前特权级别(0 或3)并压入堆栈,作为do_timer 的参数。
movl CS(%esp),%eax
andl $3,%eax # %eax is CPL (0 or 3, 0=supervisor)
pushl %eax
# do_timer(CPL)执行任务切换、计时等工作,在kernel/shched.c,305 行实现。
call do_timer # 'do_timer(long CPL)' does everything from
addl $4,%esp # task switching to accounting ...
jmp ret_from_sys_call
从时钟中断出来程序可以看到使用了GDT