xv6的中断分析

在xv6中cpu根据中断号乘以8 作为IDT(Interrupt Descriptor Table中断描述符表)的索引,IDT可以是内存中的任意位置,cpu通过寄存器(IDTR中断描述符表寄存器,共6字节高4字节是IDT的起始地址,低2字节是IDT的长度)的内容寻址IDT的起始地址,指令LIDTSIDT

操作IDTR ,LIDT (load IDT Register)包含线性地址基址界限 的内存操作数来加载IDT ,操作系统创建IDT需要执行它设定IDT的起始地址,这条指令只能在特权级0执行;

SIDT(Store IDT' Register):拷贝 IDTR的基址和长度到一个内存地址,这条指令可以是在任何特权级下;

<!-- @page { margin: 0.79in } P { margin-bottom: 0.08in } -->

保护模式 下, 最多会存在 256 Interrupt/Exception Vectors 。范围 [0 31] 内的 32 个向量被异常 Exception NMI 使用 ,但当前并非所有这 32


向量都已经被使用,有几个当前没有被使用的,请不要擅自使用它们,它们被保留,以备将来可能增加新的 Exception 范围 [32 255] 的向


量被 保留给用户定义的 Interrupts Intel 没有定义,也没有保留这些 Interrupts 。用户可以将它们用作外部 I/O 设备中断( 8259A IRQ ),或者系


统调用( System Call Software Interrupts )等。 


<!-- @page { margin: 0.79in } P { margin-bottom: 0.08in } -->

<!-- @page { margin: 0.79in } P { margin-bottom: 0.08in } -->

Interrupts/Exceptions 应该使用 Interrupt Gate Trap Gate ,它们之间的唯一区别就是:当调用 Interrupt Gate 时, Interrupt 会被

 

CPU 自动禁止 ;而调用 Trap Gate 时, CPU 则不 会去禁止或打开中断,而是保留它原来的样子 。在 IDT 中,可以包含如下 3 种类型的 Descriptor

  • Task-gate descriptor (这里没有使用)

  • Interrupt-gate descriptor (中断方式用到)

  • Trap-gate descriptor (系统调用用到)

 

 xv6的内核启动后,会通过tvinit函数初始化idt 表,而其中vectors数组存储了中断处理程序的入口地址

 

<!-- @page { margin: 0.79in } P { margin-bottom: 0in } -->

vector.S 文件通过 vectors.pl 自动生成,其中定义了每个中断的 入口程序 入口地址 ( 保存在 vectors 数组中 ) 。其中,中断可以分


两类:一类是 压入错误编码的 (error code) ,另一类 不压入错误编码 。对于第二类, vector.S 自动压入一个 0 。此外,还会压入相应


中断的中断号。在压入两个必要的参数 之后, 中断处理函数 跳转到统一的入口 alltraps 处;


alltraps(中断入口函数 )定义在trapasm.S的文件中;对中断的预处理(1 :包括压入ds,es数据段,2 :参照 x86.h 中对于

 

trapframe 结构的定义,将 trapframe 的内容压入栈中;3 :将当前的数据段设为内核数据段;4 :以指向 trapframe 内容的指针(esp)

 

作为参数,调用 trap 函数;5 :根据 trapframe 的内容,恢复各寄存器;6 :弹出 trapno 与 errcode 7 :中断返回)


 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值