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

来源:互联网 发布:老公 知乎 编辑:程序博客网 时间:2024/05/29 02:02

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


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

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

[cpp] view plaincopy
  1. struct SEGMENT_DESCRIPTOR  
  2. {  
  3. short limit_low,base_low;  
  4. char limit_high,base_high;  
  5. };  


[cpp] view plaincopy
  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 plaincopy
  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的设置如下

[cpp] view plaincopy
  1. set_gatedesc(idt+0x21,(int)asm_inthandler21,2*8,AR_INTGATE32);  

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

[cpp] view plaincopy
  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 plaincopy
  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 plaincopy
  1. JMP     DWORD 2*8:0x0000001b