Linux0.11中系统内存的使用

文件转:http://hi.baidu.com/qiqi7036/blog/item/971e1316bab8b94b21a4e9e6.html

系统内存分为基本内存(1M)和扩展内存,总长度保存在全局变量memory_end中。1M以后的扩展内存大小(KB)是由setup.s程序在引导时间从BIOS中获取,并保存在内存0x90002位置的。memory_end的计算方法如下:
#define EXT_MEM_K (*(unsigned shor *)0x90002)
memory_end = (1<<20) + (EXT_MEM_K << 10);
系统内存的最小使用单位为页(即4KB),因此,需要忽略不到4KB的内存数:
memory_end &= 0XFFFFF000;
注意到Linux0.11支持的系统内存最多为16M。
if (memory_end > 16*1024*1024)
memory_end = 16*1024*1024;
1. 内核模块
从物理地址0到end。end是内核模块链接期间由链接程序(ld)设置的一个值,内核代码中没有定义这个符号。当在连接生成system模块时,ld程序的digest_symbols()函数会产生此符号。该函数主要用于对全局变量进行引用赋值,并且计算每个被连接文件的起始和大小。其中也设置了end的值,它等于data_start+datasize+bss_size。
2. 高速缓冲区
起始位置从内核模块末段end标号开始,结束位置取决于系统内存的大小。如果系统内存在12M和16M(含)之间,则高速缓冲区结束于4M处;如果系统内存在6M和12M(含)之间,则高速缓冲区结束于2M处;如果系统内存在6M(含)以下,则高速缓冲区结束于1M处。高速缓冲部分还要扣除被显存和ROM BIOS占用的部分(640K和1M之间)。高速缓冲区是用于磁盘等块设备临时存放数据的地方,以1K字节为一个数据块单位。
if (memory_end > 12*1024*1024)
buffer_memory_end = 4*1024*1024;
else if (memory_end > 6*1024*1024)
buffer_memory_end = 2*1024*1024;
else
buffer_memory_end = 1*1024*1024;
3. 虚拟盘(Ramdisk)
虚拟盘设备是一种利用物理内存来模拟实际磁盘存储数据的方式。如果在linux/Makefile文件中定义了常量RAMDISK,内核初始化程序就会在主内存区域前划出一块该常量值指定大小的内存区域存放虚拟盘数据。
main_memory_start = buffer_memory_end;
#ifdef RAMDISK
main_memory_start += rd_init(main_memory_start, RAMDISK*1024)
#endif
虚拟盘区域从高速缓冲区末端buffer_memory_end开始(rd_start),容量等于RAMDISK的值(rd_length)。
rd_start = (char *)mem_start;
rd_length = length;
4. 主内存区
主内存区域从main_memory_start开始,到memory_end结束。主内存区域的内存是由内存管理模块mm通过分页机制进行管理分配,以4K字节为一个内存页单位。内核程序可以自由访问高速缓冲中的数据,但需要通过mm才能使用分配到的内存页面。

你可能感兴趣的:(Linux0.11中系统内存的使用)