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

来源:互联网 发布:淘宝ab单危险 编辑:程序博客网 时间:2024/06/08 16:28

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


1. 寄存器EFLAGS第18位AC标志表示CPU是否为486以上,486以上CPU有缓存 

2. 对CR0寄存器标志位进行改写实现关闭缓存功能

[cpp] view plaincopy
  1. #define CR0_CACHE_DISABLE  
  2. /*...*/  
  3. cr0=load_cr0();  
  4. cr0 |= CR0_CACHE_DISABLE;  
  5. store_cr0(cr0);  

3. 内存管理(1)位图法(2)列表管理方法

这部分是对计算机物理内存进行管理的方法,动态分配和释放,不用在obj文件中分配了!

[cpp] view plaincopy
  1. #define MEMMAN_FREES        4090    /*零碎的保存free内存块*/  
  2. #define MEMMAN_ADDR         0x003c0000  
  3.   
  4. struct FREEINFO {   /* free可用信息 */  
  5.     unsigned int addr, size;  
  6. };  
  7.   
  8. struct MEMMAN {     /*内存管理结构体*/  
  9.     int frees, maxfrees, lostsize, losts;  
  10.     struct FREEINFO free[MEMMAN_FREES];  
  11. };  
  12.   
  13. void memman_init(struct MEMMAN *man)  
  14. {  
  15.     man->frees = 0;          /* 可用free块 */  
  16.     man->maxfrees = 0;       /* frees的最大值 */  
  17.     man->lostsize = 0;       /* 释放失败的内存大小 */  
  18.     man->losts = 0;          /* 释放失败次数 */  
  19.     return;  
  20. }  
  21. /* 现在free内存大小 */  
  22. unsigned int memman_total(struct MEMMAN *man)  
  23. {  
  24.     unsigned int i, t = 0;  
  25.     for (i = 0; i < man->frees; i++) {  
  26.         t += man->free[i].size;  
  27.     }  
  28.     return t;  
  29. }  
  30.   
  31. unsigned int memman_alloc(struct MEMMAN *man, unsigned int size)  
  32. {  
  33.     unsigned int i, a;  
  34.     for (i = 0; i < man->frees; i++) {  
  35.         if (man->free[i].size >= size) {  
  36.             /* find free space */  
  37.             a = man->free[i].addr;  
  38.             man->free[i].addr += size;  
  39.             man->free[i].size -= size;  
  40.             if (man->free[i].size == 0) {  
  41.                 /* 当前free块正好被全部分配了 */  
  42.                 man->frees--;  
  43.                 for (; i < man->frees; i++) {  
  44.                     man->free[i] = man->free[i + 1]; /* 把后面的free块信息向前移动 */  
  45.                 }  
  46.             }  
  47.             return a;  
  48.         }  
  49.     }  
  50.     return 0; /* not found */  
  51. }  
  52.   
  53. int memman_free(struct MEMMAN *man, unsigned int addr, unsigned int size)  
  54. {  
  55.     int i, j;  
  56.     /* free[]中信息按照地址空间的顺序排序 */  
  57.     /* 找到这个释放的空间放在哪里 */  
  58.     for (i = 0; i < man->frees; i++) {  
  59.         if (man->free[i].addr > addr) {  
  60.             break;  
  61.         }  
  62.     }  
  63.     /* free[i - 1].addr < addr < free[i].addr */  
  64.     if (i > 0) {  
  65.         /* 前面有与要释放的内存连续的free内存 */  
  66.         if (man->free[i - 1].addr + man->free[i - 1].size == addr) {  
  67.             /* 与前面的free内存信息合并到一起 */  
  68.             man->free[i - 1].size += size;  
  69.             if (i < man->frees) {  
  70.                 /* 后面也有与要释放的内存连续的free内存 */  
  71.                 if (addr + size == man->free[i].addr) {  
  72.                     /* 可以与后面的free内存信息合并到一起 */  
  73.                     man->free[i - 1].size += man->free[i].size;  
  74.                     /*归并*/  
  75.                     man->frees--;  
  76.                     for (; i < man->frees; i++) {  
  77.                         man->free[i] = man->free[i + 1];  
  78.                     }  
  79.                 }  
  80.             }  
  81.             return 0; /* ok */  
  82.         }  
  83.     }  
  84.     /* 不能与前面的可用空间合并到一起 */  
  85.     if (i < man->frees) {  
  86.         /* 后面也有与要释放的内存连续的free内存 */  
  87.         if (addr + size == man->free[i].addr) {  
  88.             /* 可以与后面的free内存信息合并到一起 */  
  89.             man->free[i].addr = addr;  
  90.             man->free[i].size += size;  
  91.             return 0; /* ok */  
  92.         }  
  93.     }  
  94.     /* 前后都不能合并 */  
  95.     if (man->frees < MEMMAN_FREES) {  
  96.         /* free[i]之后的向后移动,腾出空间 */  
  97.         for (j = man->frees; j > i; j--) {  
  98.             man->free[j] = man->free[j - 1];  
  99.         }  
  100.         man->frees++;  
  101.         if (man->maxfrees < man->frees) {  
  102.             man->maxfrees = man->frees;  
  103.         }  
  104.         man->free[i].addr = addr;  
  105.         man->free[i].size = size;  
  106.         return 0; /* ok */  
  107.     }  
  108.     /* 不能向后移动 */  
  109.     man->losts++;  
  110.     man->lostsize += size;  
  111.     return -1; /* 失败 */  
  112. }  

3. 以4k大小为单位的内存分配和释放


 

[cpp] view plaincopy
  1. unsigned int memman_alloc_4k(struct MEMMAN *man, unsigned int size)  
  2. {  
  3.     unsigned int a;  
  4.     size = (size + 0xfff) & 0xfffff000;  
  5.     a = memman_alloc(man, size);  
  6.     return a;  
  7. }  
  8.   
  9. int memman_free_4k(struct MEMMAN *man, unsigned int addr, unsigned int size)  
  10. {  
  11.     int i;  
  12.     size = (size + 0xfff) & 0xfffff000;  
  13.     i = memman_free(man, addr, size);  
  14.     return i;  

原创粉丝点击