读书笔记《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内核分析书
- struct SEGMENT_DESCRIPTOR
- {
- short limit_low,base_low;
- char limit_high,base_high;
- };
- struct GATE_DESCRIPTOR
- {
- short offset_low,selector;
- char dw_count,access_right;
- short offset_high;
- };
3. PIC的初始化,计算机上有两个PIC,从PIC连到了主PIC的IRQ2引脚,PIC的初始化一般使用都是固定的,只是设置ICW2的中断响应号就可以了。鼠标连接到了IRQ12上其中断响应号为0x2c,键盘是IRQ1中断响应号是0x21 。中断处理代码执行结束后应调用IRETD该指令需要使用汇编编写,并且在处理中断时需要保存寄存器值,并在结束后恢复所以调用C语言编写的中断处理程序代码要包装一下。
- extern _inthandler21
- _inthadler21:
- push es
- push ds
- pushad
- mov eax,esp
- push eax
- mov ax,ss
- mov ds,ax
- mov es,ax
- call _inthandler21
- pop eax
- popad
- pop ds
- pop es
- iretd
4. IDT的设置如下
- set_gatedesc(idt+0x21,(int)asm_inthandler21,2*8,AR_INTGATE32);
上述代码中中断代码的偏移量由asm_inthandler21指出,而所在段为2号,而二号端是GDT中指出的
- set_segmdesc(gdt+1,0xffffffff,0x00000000,0x4092);/*系统专用,不可执行,可读写数据段*/
- set_segmdesc(gdt+2,0x0007ffff,0x00280000,0x409a);/*系统专用,可执行,只读代码段*/
可执行代码段2中保存了bootpack.c代码,在asmhead.nas中将bootpack.c代码memcpy到了0x00280000这里
- BOTPAK EQU 0x00280000
- MOV ESI,bootpack
- MOV EDI,BOTPAK
- MOV ECX,512*1024/4
- CALL memcpy
同样在asmhead.nas中有,跳入HairMain的代码,也是跳到2段中
- JMP DWORD 2*8:0x0000001b
- 读书笔记《30天自制操作系统》day06
- 读书笔记《30天自制操作系统》day06
- 读书笔记《30天自制操作系统》day01
- 读书笔记《30天自制操作系统》day02
- 读书笔记《30天自制操作系统》day03
- 读书笔记《30天自制操作系统》day04
- 读书笔记《30天自制操作系统》day05
- 读书笔记《30天自制操作系统》day07
- 读书笔记《30天自制操作系统》day08
- 读书笔记《30天自制操作系统》day09
- 读书笔记《30天自制操作系统》day10
- 读书笔记《30天自制操作系统》day11
- 读书笔记《30天自制操作系统》day01
- 读书笔记《30天自制操作系统》day02
- 读书笔记《30天自制操作系统》day03
- 读书笔记《30天自制操作系统》day12~day13
- 读书笔记《30天自制操作系统》day01
- 读书笔记《30天自制操作系统》day02
- android xml解析 XmlPullParser的使用
- c++仿函数
- 读书笔记《30天自制操作系统》day05
- 前端视界:2012年度最独特的网页设计作品展示《上篇》
- TableLayout 简介
- 读书笔记《30天自制操作系统》day06
- 协议
- 大家在人生低谷时有多惨,怎么熬过来的(五)
- 读书笔记《30天自制操作系统》day07
- C# Dictionary 的几种遍历方法
- 读书笔记《30天自制操作系统》day08
- checkstyle的eclipse插件
- 读书笔记《30天自制操作系统》day09
- 佛道儒的区别