2.4 内存管理结构mem_map初始化

2.4 内存管理结构mem_map初始化

对主内存区起始位置的重新确定,标志着主内存区和缓冲区的位置和大小已经全都确定了,于是系统开始调用mem_init()函数。先对主内存区的管理结构进行设置,该过程如图2-5所示。

具体执行代码如下:

 
 
  1. //代码路径:init/main.c:  
  2. void main(void)  
  3. {  
  4.     …  
  5.     mem_init(main_memory_start,memory_end);  
  6.     …  
  7. }  
  8. //代码路径:mm/memory.c:  
  9.     …  
  10.     #define LOW_MEM 0x100000    //1 MB  
  11.     #define PAGING_MEMORY (15*1024*1024)  
  12.     #define PAGING_PAGES (PAGING_MEMORY>>12)  //15 MB的页数  
  13.     #define MAP_NR(addr) (((addr)-LOW_MEM)>>12)  
  14.     #define USED 100  
  15.     …  
  16.     static long HIGH_MEMORY0;  
  17.     …  
  18.     static unsigned char mem_map [PAGING_PAGES]= {0,};  
  19.     …  
  20. void mem_init(long start_mem, long end_mem)  
  21. {  
  22.     int i;  
  23.  
  24.     HIGH_MEMORYend_mem;  
  25.     for (i=0;i<PAGING_PAGES;i++)  
  26.          mem_map[i]= USED;  
  27.     iMAP_NR(start_mem);    //start_mem为6 MB(虚拟盘之后)  
  28.     end_mem -start_mem;  
  29.     end_mem >>= 12;     //16 MB的页数  
  30.     while (end_mem-->0)  
  31.          mem_map[i++]=0;   

系统通过mem_map[]对1 MB以上的内存分页进行管理,记录一个页面的使用次数。

mem_init()函数先将所有的内存页面使用计数均设置成USED (100,即被使用),然后再将主内存中的所有页面使用计数全部清零,系统以后只把使用计数为0的页面视为空闲页面。

那么为什么系统对1 MB以内的内存空间不用这种分页方法管理呢?这是因为,操作系统的设计者对内核和用户进程采用了两套不同的分页管理方法。内核采用分页管理方法,线性地址和物理地址是完全一样的,是一一映射的,等价于内核可以直接获得物理地址。用户进程则不然,线性地址和物理地址差异很大,之间没有可递推的逻辑关系。操作系统设计者的目的就是让用户进程无法通过线性地址推算出具体的物理地址,让内核能够访问用户进程,用户进程不能访问其他的用户进程,更不能访问内核。1 MB以内是内核代码和只有由内核管控的大部分数据所在内存空间,是绝对不允许用户进程访问的。1 MB以上,特别是主内存区主要是用户进程的代码、数据所在内存空间,所以采用专门用来管理用户进程的分页管理方法,这套方法当然不能用在内核上。详细内容请看第6章中的内存管理,深层次原因的分析请看第9章。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值