kernel/protect.c

Code:
  1. /*  
  2.     By Marcus Xing  
  3.     kernel/protect.c  
  4.     有关保护模式的函数  
  5. */  
  6.   
  7. #include "type.h"   
  8. #include "const.h"   
  9. #include "ipc.h"   
  10. #include "protect.h"   
  11. #include "proc.h"   
  12. #include "console.h"   
  13. #include "tty.h"   
  14. #include "global.h"   
  15. #include "proto.h"   
  16.   
  17. /* 内中断处理函数声明 */      
  18. void    Divide_Error();       
  19. void    Single_Step_Exception();       
  20. void    NMI();       
  21. void    Breakpoint_Exception();       
  22. void    Overflow();       
  23. void    Bounds_Check();       
  24. void    Inval_Opcode();       
  25. void    Copr_Not_Available();       
  26. void    Double_Fault();       
  27. void    Copr_Seg_Overrun();       
  28. void    Inval_TSS();       
  29. void    Segment_Not_Present();       
  30. void    Stack_Exception();       
  31. void    General_Protection();       
  32. void    Page_Fault();       
  33. void    Copr_Error();   
  34.   
  35. /* 外中断处理函数声明 */  
  36. void    hw_00();   
  37. void    hw_01();   
  38. void    hw_02();   
  39. void    hw_03();   
  40. void    hw_04();   
  41. void    hw_05();   
  42. void    hw_06();   
  43. void    hw_07();   
  44. void    hw_08();   
  45. void    hw_09();   
  46. void    hw_10();   
  47. void    hw_11();   
  48. void    hw_12();   
  49. void    hw_13();   
  50. void    hw_14();   
  51. void    hw_15();   
  52.   
  53. /*----------------------------------------------------------------------Init_GDT  
  54.     此函数用于初始化GDT   
  55. */  
  56. void Init_GDT()   
  57. {   
  58.   /* 填充GDT */  
  59.   Fill_Desc(0,0,0,0);                                   /* DUMMY段,这个必须有 */  
  60.   Fill_Desc(1,0,0xfffff,DA_DRW + DA_32 + DA_LIMIT_4K);  /* 平坦4G 32位代码段 */  
  61.   Fill_Desc(2,0,0xfffff,DA_C + DA_32 + DA_LIMIT_4K);    /* 平坦4G 32位数据段 */  
  62.   Fill_Desc(3,0xb8000,0xffff,DA_DRW + DA_DPL3);         /* 视频段描述符,DPL为3 */  
  63.   Fill_Desc(126,0,0xfffff,DA_C + DA_LIMIT_4K);          /* 16位平坦代码段描述符 */  
  64.   Fill_Desc(127,0,0xffff,DA_DRW);                       /* NORMAL描述符,跳回PM用*/  
  65.        
  66.   /* 填充GDT_Ptr */  
  67.   u16 *p16_GDT_Ptr_Len = (u16 *)GDT_Ptr;   
  68.   u32 *p32_GDT_Ptr_Base = (u32 *)(GDT_Ptr + 2);   
  69.        
  70.   *p16_GDT_Ptr_Len = (u16)(sizeof(Descriptor) * GDT_SIZE - 1);   
  71.   *p32_GDT_Ptr_Base = (u32)GDT;   
  72. }   
  73.   
  74. /*----------------------------------------------------------------------Init_IDT   
  75.     此函数用于初始化IDT   
  76. */  
  77. void Init_IDT()   
  78. {   
  79.     /* 初始化系统内中断描述符 */  
  80.     Fill_Gate(INT_VECTOR_DIVIDE,Divide_Error,DA_386IGate,PRIVILEGE_KRNL);       
  81.     Fill_Gate(INT_VECTOR_DEBUG,Single_Step_Exception,DA_386IGate,PRIVILEGE_KRNL);       
  82.     Fill_Gate(INT_VECTOR_NMI,NMI,DA_386IGate,PRIVILEGE_KRNL);       
  83.     Fill_Gate(INT_VECTOR_BREAKPOINT,Breakpoint_Exception,DA_386IGate,PRIVILEGE_KRNL);       
  84.     Fill_Gate(INT_VECTOR_OVERFLOW,Overflow,DA_386IGate,PRIVILEGE_KRNL);       
  85.     Fill_Gate(INT_VECTOR_BOUNDS,Bounds_Check,DA_386IGate,PRIVILEGE_KRNL);       
  86.     Fill_Gate(INT_VECTOR_INVAL_OP,Inval_Opcode,DA_386IGate,PRIVILEGE_KRNL);       
  87.     Fill_Gate(INT_VECTOR_COPROC_NOT,Copr_Not_Available,DA_386IGate,PRIVILEGE_KRNL);       
  88.     Fill_Gate(INT_VECTOR_DOUBLE_FAULT,Double_Fault,DA_386IGate,PRIVILEGE_KRNL);       
  89.     Fill_Gate(INT_VECTOR_COPROC_SEG,Copr_Seg_Overrun,DA_386IGate,PRIVILEGE_KRNL);       
  90.     Fill_Gate(INT_VECTOR_INVAL_TSS,Inval_TSS,DA_386IGate,PRIVILEGE_KRNL);       
  91.     Fill_Gate(INT_VECTOR_SEG_NOT,Segment_Not_Present,DA_386IGate,PRIVILEGE_KRNL);       
  92.     Fill_Gate(INT_VECTOR_STACK_FAULT,Stack_Exception,DA_386IGate,PRIVILEGE_KRNL);       
  93.     Fill_Gate(INT_VECTOR_PROTECTION,General_Protection,DA_386IGate,PRIVILEGE_KRNL);       
  94.     Fill_Gate(INT_VECTOR_PAGE_FAULT,Page_Fault,DA_386IGate,PRIVILEGE_KRNL);       
  95.     Fill_Gate(INT_VECTOR_COPROC_ERR,Copr_Error,DA_386IGate,PRIVILEGE_KRNL);   
  96.        
  97.     /* 填充IDT_Ptr */  
  98.     u16 *p16_IDT_Ptr_Len = (u16 *)IDT_Ptr;   
  99.     u32 *p32_IDT_Ptr_Base = (u32 *)(IDT_Ptr + 2);   
  100.        
  101.     *p16_IDT_Ptr_Len = sizeof(Gate) * IDT_SIZE - 1;   
  102.     *p32_IDT_Ptr_Base = (u32)IDT;   
  103.        
  104.     /* 填充外中断的中断描述符 */  
  105.     Fill_Gate(INT_VECTOR_IRQ0 + 0,hw_00,DA_386IGate,PRIVILEGE_KRNL);   
  106.     Fill_Gate(INT_VECTOR_IRQ0 + 1,hw_01,DA_386IGate,PRIVILEGE_KRNL);   
  107.     Fill_Gate(INT_VECTOR_IRQ0 + 2,hw_02,DA_386IGate,PRIVILEGE_KRNL);   
  108.     Fill_Gate(INT_VECTOR_IRQ0 + 3,hw_03,DA_386IGate,PRIVILEGE_KRNL);   
  109.     Fill_Gate(INT_VECTOR_IRQ0 + 4,hw_04,DA_386IGate,PRIVILEGE_KRNL);   
  110.     Fill_Gate(INT_VECTOR_IRQ0 + 5,hw_05,DA_386IGate,PRIVILEGE_KRNL);   
  111.     Fill_Gate(INT_VECTOR_IRQ0 + 6,hw_06,DA_386IGate,PRIVILEGE_KRNL);   
  112.     Fill_Gate(INT_VECTOR_IRQ0 + 7,hw_07,DA_386IGate,PRIVILEGE_KRNL);   
  113.     Fill_Gate(INT_VECTOR_IRQ0 + 8,hw_08,DA_386IGate,PRIVILEGE_KRNL);   
  114.     Fill_Gate(INT_VECTOR_IRQ0 + 9,hw_09,DA_386IGate,PRIVILEGE_KRNL);   
  115.     Fill_Gate(INT_VECTOR_IRQ0 + 10,hw_10,DA_386IGate,PRIVILEGE_KRNL);   
  116.     Fill_Gate(INT_VECTOR_IRQ0 + 11,hw_11,DA_386IGate,PRIVILEGE_KRNL);   
  117.     Fill_Gate(INT_VECTOR_IRQ0 + 12,hw_12,DA_386IGate,PRIVILEGE_KRNL);   
  118.     Fill_Gate(INT_VECTOR_IRQ0 + 13,hw_13,DA_386IGate,PRIVILEGE_KRNL);   
  119.     Fill_Gate(INT_VECTOR_IRQ0 + 14,hw_14,DA_386IGate,PRIVILEGE_KRNL);   
  120.     Fill_Gate(INT_VECTOR_IRQ0 + 15,hw_15,DA_386IGate,PRIVILEGE_KRNL);   
  121.        
  122.     /* 系统调用的中断入口 */  
  123.     Fill_Gate(SYSTEM_CALL_INT_VECTOR,System_Call,DA_386IGate,PRIVILEGE_USER);   
  124. }   
  125.   
  126. /*---------------------------------------------------------------------Fill_Desc  
  127.     此函数用于填充GDT的描述符  
  128.     para1:要填充的描述符在GDT的索引,从0开始,以1递增  
  129.     para2:要填充的描述符的基地址  
  130.     para3:要填充的描述符的段界限  
  131.     para4:要填充的描述符的段属性   
  132. */  
  133. void Fill_Desc(u8 desc_no,u32 base,u32 limit,u16 attr)       
  134. {       
  135.     Descriptor *p_Desc = (Descriptor *)&GDT[desc_no];       
  136.     p_Desc->limit_low = limit & 0xffff;       
  137.     p_Desc->base_low = base & 0xffff;       
  138.     p_Desc->base_mid = (base >> 16) & 0xff;       
  139.     p_Desc->attr1 = attr & 0xff;       
  140.     p_Desc->limit_high_attr2 = ((limit >> 16) & 0xf) | (attr >> 8);       
  141.     p_Desc->base_high = (base >> 24) & 0xff;       
  142. }      
  143.   
  144. /*---------------------------------------------------------------------Fill_Gate  
  145.     此函数用于填充一个IDT中的门描述符  
  146.     para1:要填充的描述符在IDT的索引,从0开始,以1递增  
  147.     para2:处理程序的地址,即为函数指针,类型在type.h中定义  
  148.     para3:门描述符的类型  
  149.     para4:门描述符的特权级   
  150. */  
  151. void Fill_Gate(u8 idt_no,Int_Handler handler,u8 type,u8 privilege)       
  152. {       
  153.     Gate *p_Gate = (Gate*)&IDT[idt_no];       
  154.     u32 base = (u32)handler;       
  155.     p_Gate->offset_low = base & 0xffff;       
  156.     p_Gate->selector = 16;    /* 处理程序的段地址,GDT中的第3个描述符,即FLAT_C */  
  157.     p_Gate->dcount = 0;       
  158.     p_Gate->attr = type | (privilege << 5);       
  159.     p_Gate->offset_high = (base >> 16) & 0xffff;       
  160. }       
  161.   
  162. /*-------------------------------------------------------------Exception_Handler   
  163.     此函数用来统一处理内中断处理函数,把各个参数打印出来  
  164.     para1:中断向量号  
  165.     para2:错误码(如果没有,则为0xffffffff)  
  166.     para3:出现错误的代码时的EIP  
  167.     para4:出现错误的代码时的CS  
  168.     para5:出现错误的代码时的EFLAGS  
  169. */  
  170. void Exception_Handler(unsigned int vec_no,int err_code,int eip,int cs,int eflags)   
  171. {   
  172.     int i;   
  173.     /* 前5行清空,通过改动d_Disp_Pos的值 */  
  174.     d_Disp_Pos = 0;   
  175.     for(i = 0;i < 80 * 5;i++)   /* 每行80个字符 */  
  176.     {   
  177.         Disp_Str(" ");   
  178.     }   
  179.     d_Disp_Pos = 0;        
  180.        
  181.     /* 打印各项的值 */  
  182.     Disp_Str("Exception! --> ");   
  183.     Disp_Str("VEC_NO:");       
  184.     Disp_Int(vec_no);       
  185.     Disp_Str("/n");       
  186.            
  187.     Disp_Str("CS:");       
  188.     Disp_Int(cs);       
  189.     Disp_Str("/n");       
  190.            
  191.     Disp_Str("EIP:");       
  192.     Disp_Int(eip);       
  193.     Disp_Str("/n");       
  194.            
  195.     Disp_Str("EFLAGS:");       
  196.     Disp_Int(eflags);       
  197.     Disp_Str("/n");     
  198.      
  199.     /* 如果有错误码,则打印之 */  
  200.     if(err_code != 0xffffffff)   
  201.     {   
  202.       Disp_Str("ERROR_CODE:");       
  203.       Disp_Int(err_code);       
  204.       Disp_Str("/n");        
  205.     }   
  206. }   
  207.   
  208. /*--------------------------------------------------------------Hard_Int_Handler  
  209.     外中断统一的处理函数  
  210.     para1:外中断的向量号  
  211.     暂时放空  
  212. */  
  213. void Hard_Int_Handler(int hw_vec_no)   
  214. /*  
  215.     int i;  
  216.      前5行清空,通过改动d_Disp_Pos的值   
  217.     d_Disp_Pos = 0;  
  218.     for(i = 0;i < 80 * 5;i++)    每行80个字符   
  219.     {  
  220.         Disp_Str(" ");  
  221.     }  
  222.     d_Disp_Pos = 0;  
  223.       
  224.      打印相应的向量号   
  225.     Disp_Str("HARD WARE VECTOR:");  
  226.     Disp_Int(hw_vec_no);  
  227.     Disp_Str("/n");  
  228.     */  
  229. }   

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值