重要变量
name |
|
file |
mdec |
每次鼠标中断产生的数据 |
bootpack.c |
mx,my |
鼠标位置 |
bootpack.c |
mmx, mmy |
鼠标移动前位置 |
bootpack.c |
fifo |
缓冲区,存放鼠标、键盘、定时器缓冲数据 |
bootpack.c |
task_timer |
用于任务切换的定时器 |
mtask.c |
key_win |
获得焦点的窗口 |
bootpack.c |
系统功能
id |
功能 |
所在文件 |
说明 |
1 |
显卡模式设置 |
haribote.nas |
INT 0x10 |
2 |
调色板的设置 |
graphic.c |
set_palette |
3 |
绘制矩形 |
graphic.c |
boxfill8 |
4 |
屏幕初始化 |
graphic.c |
init_screen8 |
5 |
显示字符串 |
graphic.c |
putfonts8_asc |
6 |
鼠标显示 |
graphic.c |
init_mouse_cursor8,putblock8_8 |
7 |
GDT、IDT段设置 |
dsctbl.c |
load_gdtr, load_idtr |
8 |
PIC初始化 |
int.c |
- |
9 |
键盘中断处理 |
keyboard.c |
inthandler21 |
9.1 |
Shift+F1 |
bootpack.c |
|
10 |
鼠标中断处理 |
mouse.c |
inthandler2c |
10.1 |
鼠标数据解析 |
mouse.c |
mouse_decode |
11 |
内存分配 |
memory.c |
memman_alloc_4k |
11.1 |
内存释放 |
memory.c |
memman_free_4k |
12 |
刷新图层,并避免刷新画面外 |
sheet.c |
sheet_refreshsub,sheet_refreshsub |
12.1 |
上下移动图层 |
sheet.c |
sheet_updown |
12.2 |
左右移动图层 |
sheet.c |
sheet_slide |
13 |
窗口制作 |
windows.c |
make_window8 |
14 |
定时器分配 |
timer.c |
timer_alloc |
15 |
任务切换 |
timer.c |
inthandler20 |
GDT, IDT,LDT
段号 |
说明 |
基址 |
限长 |
G |
C/D |
- |
1 |
说明CPU可以管理全部4GB内存 |
0x00000000 |
0xffffffff |
1 |
D |
系统 |
2 |
存放haribote.hrb |
0x00280000 |
0x0007ffff |
1 |
C |
系统 |
3-1002 |
任务的TSS |
|
|
|
|
|
1003-2002 |
任务的LDT描述符 |
|
|
|
|
|
- IDT
需要将中断处理程序注册到 IDT 中。
中断号 |
说明 |
- |
中断处理 |
0x0c |
栈异常 |
如数组越界 |
|
0x0d |
访问权限异常 |
主要是访问异常 |
强制结束任务并返回 |
0x20 |
PIT 定时器 |
IRQ0 |
产生定时中断 |
0X21 |
键盘中断 |
IRQ1 |
数据输出到keyfifo |
0X2c |
鼠标中断 |
IRQ12 |
数据输出到mousefifo |
- 0x00~0x1f都是异常所使用的中断,因此IRQ的中断号都是从0x20之后开始的。
LDT
- gdt 的内存地址通过gdtr 寄存器告知CPU,而 LDT 的内存地址以段描述符的形式存储在GDT中(类似于TSS),然后通过 LDTR中的选择符找到 LDT 描述符。
- ldtr 在TSS中
键盘与鼠标
键盘
- 在bootpack 中处理的键盘数据有
直接接收从1号中断发来的数据,除了以下一些数据外,其余字符发送给console处理。
按键 |
键码 |
作用 |
Tab |
0x0f |
切换窗口 |
LShift |
0x2a(on),0xaa(off) |
|
RShift |
0x36(on),0xb6(off) |
|
CapsLock |
0x3a |
|
Shift+F1 |
- |
关闭当前窗口 |
Shift+F2 |
- |
打开新的console |
F11 |
- |
- |
鼠标
事件 |
动作 |
case |
左键按下 |
找到点击图层 |
1:点击区域最上层且不为透明色 |
左键按下 |
切换窗口 |
2:1+点击窗口不是key_win |
|
更新mmx,mmy |
|
|
关闭应用窗口 |
4:1+点击x+(sht->flags & 0x10) != 0 |
|
关闭命令行窗口 |
5:1+点击x+(sht->flags & 0x10) == 0 |
鼠标移动 |
移动图层 |
fifo为空 |
存储器管理
空闲分区管理
struct FREEINFO { /* information */
unsigned int addr, size;
};
struct MEMMAN { /* Memory management */
int frees, maxfrees, lostsize, losts;
struct FREEINFO free[MEMMAN_FREES]; //MEMMAN_FREE=4090
};
- 采用段式存储管理
- 分配时,采用首次适应算法,并且不处理碎片
- 释放内存