30天自制操作系统-第09天-内存管理
1.整理代码(/09_day/harib06a)
键盘和鼠标的初始化代码以及解码、中断处理代码各自拆分成keboard.c和mouse.c
2.内存容量检查
理解高速缓存,循环语句中,大量对同一块内存区域操作
要坚持内存容量,需要先禁用缓存
经过几次迭代,由于C编译器的优化,导致内存检查代码被优化掉,因此作者改用汇编重写了memset_stub函数
_memtest_sub: ; unsigned int memtest_sub(unsigned int start, unsigned int end)
PUSH EDI ; (由于还要使用EBX, ESI, EDI)
PUSH ESI
PUSH EBX
MOV ESI,0xaa55aa55 ; pat0 = 0xaa55aa55;
MOV EDI,0x55aa55aa ; pat1 = 0x55aa55aa;
MOV EAX,[ESP+12+4] ; i = start;
mts_loop:
MOV EBX,EAX
ADD EBX,0xffc ; p = i + 0xffc;
MOV EDX,[EBX] ; old = *p;
MOV [EBX],ESI ; *p = pat0;
XOR DWORD [EBX],0xffffffff ; *p ^= 0xffffffff;
CMP EDI,[EBX] ; if (*p != pat1) goto fin;
JNE mts_fin
XOR DWORD [EBX],0xffffffff ; *p ^= 0xffffffff;
CMP ESI,[EBX] ; if (*p != pat0) goto fin;
JNE mts_fin
MOV [EBX],EDX ; *p = old;
ADD EAX,0x1000 ; i += 0x1000;
CMP EAX,[ESP+12+8] ; if (i <= end) goto mts_loop;
JBE mts_loop
POP EBX
POP ESI
POP EDI
RET
mts_fin:
MOV [EBX],EDX ; *p = old;
POP EBX
POP ESI
POP EDI
RET
3.内存管理
1)分块管理
使用一个数组来进行管理,以4kb作为分块的大小,数组中值为1表示该块可用,否则该块不可用。以128MB内存的管理为例,说明这种方法。128MB有0x08000000个字节,块的大小为0x1000,则需要0x08000000/0x1000=32768个管理单元。
2)列表管理
定义两个结构体,一个用来表示可用状况,包括地址addr和大小size,即从addr开始的size的内存可用,另外一个用来管理内存,free是空的可用内存条目。
书中本节采用的是列表管理

浙公网安备 33010602011771号