读书笔记《30天自制操作系统》day06

http://blog.csdn.net/ltbylc/article/details/8309257


1. 鼠标及键盘的响应功能,因为用到中断所以必须自32位保护模式下设置GDT和IDT,以前在asmhead中设置时用汇编代码设置,现在用C操作。

2. GDT,IDT的补充知识,图片来自赵炯博士linux0.11内核分析书

  1. struct SEGMENT_DESCRIPTOR  
  2. {  
  3. short limit_low,base_low;  
  4. char limit_high,base_high;  
  5. };  


  1. struct GATE_DESCRIPTOR  
  2. {  
  3. short offset_low,selector;  
  4. char dw_count,access_right;  
  5. short offset_high;  
  6. };  


 

 3. PIC的初始化,计算机上有两个PIC,从PIC连到了主PIC的IRQ2引脚,PIC的初始化一般使用都是固定的,只是设置ICW2的中断响应号就可以了。鼠标连接到了IRQ12上其中断响应号为0x2c,键盘是IRQ1中断响应号是0x21 。中断处理代码执行结束后应调用IRETD该指令需要使用汇编编写,并且在处理中断时需要保存寄存器值,并在结束后恢复所以调用C语言编写的中断处理程序代码要包装一下。

[plain] view plain copy
  1. extern _inthandler21  
  2. _inthadler21:  
  3. push es  
  4. push ds  
  5. pushad  
  6. mov eax,esp  
  7. push eax  
  8. mov ax,ss  
  9. mov ds,ax  
  10. mov es,ax  
  11. call _inthandler21  
  12. pop eax  
  13. popad  
  14. pop ds  
  15. pop es  
  16. iretd  


4. IDT的设置如下

  1. set_gatedesc(idt+0x21,(int)asm_inthandler21,2*8,AR_INTGATE32);  

上述代码中中断代码的偏移量由asm_inthandler21指出,而所在段为2号,而二号端是GDT中指出的

  1. set_segmdesc(gdt+1,0xffffffff,0x00000000,0x4092);/*系统专用,不可执行,可读写数据段*/  
  2. set_segmdesc(gdt+2,0x0007ffff,0x00280000,0x409a);/*系统专用,可执行,只读代码段*/  


可执行代码段2中保存了bootpack.c代码,在asmhead.nas中将bootpack.c代码memcpy到了0x00280000这里

[plain] view plain copy
  1. BOTPAK  EQU     0x00280000  
  2.   
  3. MOV     ESI,bootpack      
  4. MOV     EDI,BOTPAK        
  5. MOV     ECX,512*1024/4  
  6. CALL    memcpy  

同样在asmhead.nas中有,跳入HairMain的代码,也是跳到2段中

[plain] view plain copy
  1. JMP     DWORD 2*8:0x0000001b  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值