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是空的可用内存条目。

书中本节采用的是列表管理

 

posted @   煮酒熬码  阅读(55)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示