linux0.11内核中断处理

 

对于中断的理解
针对时钟中断而言,如果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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值