kernel.S 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ; kernel.S - 中断处理程序
  3. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  4. [bits 32]
  5. %define ERROR_CODE nop
  6. %define ZERO push 0
  7. extern put_str ; 声明外部函数
  8. extern idt_table ; idt_table 是 C 中注册的中断处理程序数组
  9. section .data
  10. intr_str db "interrup occur!", 0xa, 0
  11. global intr_entry_table
  12. intr_entry_table:
  13. %macro VECTOR 2
  14. section .text
  15. intr%1entry: ; 每个中断处理程序都要压入中断向量号,所以一个中断类型一个中断处理程序
  16. %2
  17. ; 保存上下文环境
  18. push ds
  19. push es
  20. push fs
  21. push gs
  22. pushad ; 保存通用寄存器的值, 依次是 eax, ecx, edx, ebx, esp, ebp, esi, edi
  23. ; 如果从片上进入的中断,除了从片上发送 EOI 外,还要往主片上发送 EOI
  24. mov al, 0x20 ; EOI 中断结束命令
  25. out 0xa0, al ; 发送给从片
  26. out 0x20, al ; 发送给主片
  27. push %1 ; 不管 idt_table 中的目标程序是否需要参数,都保存中断向量号,调试方便
  28. call [idt_table + %1 * 4] ; 调用中断处理程序(中断处理程序的地址存储在 idt_table 中,是 C 中注册的中断处理程序数组)
  29. jmp intr_exit ; 中断处理程序执行完毕,跳转到中断退出程序
  30. section .data
  31. dd intr%1entry ; 存储各个中断入口程序的地址,形成 intr_entry_table 数组
  32. %endmacro
  33. section .text
  34. global intr_exit
  35. intr_exit:
  36. add esp, 4 ; 跳过中断向量号
  37. popad ; 恢复通用寄存器的值
  38. pop gs
  39. pop fs
  40. pop es
  41. pop ds
  42. add esp, 4 ; 由于中断发生时,CPU 会自动压入错误码,所以在中断退出时,需要将错误码弹出
  43. iretd ; 从中断返回
  44. VECTOR 0x00, ZERO
  45. VECTOR 0x01, ZERO
  46. VECTOR 0x02, ZERO
  47. VECTOR 0x03, ZERO
  48. VECTOR 0x04, ZERO
  49. VECTOR 0x05, ZERO
  50. VECTOR 0x06, ZERO
  51. VECTOR 0x07, ZERO
  52. VECTOR 0x08, ZERO
  53. VECTOR 0x09, ZERO
  54. VECTOR 0x0a, ZERO
  55. VECTOR 0x0b, ZERO
  56. VECTOR 0x0c, ZERO
  57. VECTOR 0x0d, ZERO
  58. VECTOR 0x0e, ZERO
  59. VECTOR 0x0f, ZERO
  60. VECTOR 0x10, ZERO
  61. VECTOR 0x11, ZERO
  62. VECTOR 0x12, ZERO
  63. VECTOR 0x13, ZERO
  64. VECTOR 0x14, ZERO
  65. VECTOR 0x15, ZERO
  66. VECTOR 0x16, ZERO
  67. VECTOR 0x17, ZERO
  68. VECTOR 0x18, ZERO
  69. VECTOR 0x19, ZERO
  70. VECTOR 0x1a, ZERO
  71. VECTOR 0x1b, ZERO
  72. VECTOR 0x1c, ZERO
  73. VECTOR 0x1d, ZERO
  74. VECTOR 0x1e, ERROR_CODE
  75. VECTOR 0x1f, ZERO
  76. VECTOR 0x20, ZERO