init/main.c部分代码
memory_end = (1<<20) + (EXT_MEM_K<<10);
memory_end &= 0xfffff000;
if (memory_end > 16*1024*1024)
memory_end = 16*1024*1024;
if (memory_end > 12*1024*1024) //内存>12M 设置高速缓冲区大小4M
buffer_memory_end = 4*1024*1024;
else if (memory_end > 6*1024*1024) // 内存>6M 设置高速缓冲区大小2M
buffer_memory_end = 2*1024*1024;
else
buffer_memory_end = 1*1024*1024; //否则设置高速缓冲大小1M
main_memory_start = buffer_memory_end;
ifdef RAMDISK
main_memory_start += rd_init(main_memory_start, RAMDISK*1024);
endif
memory_end = (1<<20) + (EXT_MEM_K<<10);memory_end &= 0xfffff000;if (memory_end > 16*1024*1024)memory_end = 16*1024*1024;if (memory_end > 12*1024*1024) //内存>12M 设置高速缓冲区大小4Mbuffer_memory_end = 4*1024*1024;else if (memory_end > 6*1024*1024)// 内存>6M 设置高速缓冲区大小2Mbuffer_memory_end = 2*1024*1024;elsebuffer_memory_end = 1*1024*1024;//否则设置高速缓冲大小1Mmain_memory_start = buffer_memory_end;#ifdef RAMDISKmain_memory_start += rd_init(main_memory_start, RAMDISK*1024);#endif
/fs/buffer.c中初始化函数buffer_init()
struct buffer_head *h = start_buffer;
void *b;
int i;
if (buffer_end == 1<<20) //如果内存末端为1M,则要减掉显存和BIOS所占的内存640K--1M之间
b = (void *) (640*1024);
else
b = (void *) buffer_end;
// 这段代码用于初始化缓冲区,建立空闲缓冲区环链表,并获取系统中缓冲块的数目。
// *** 作的过程是从缓冲区高端开始划分1K 大小的缓冲块,与此同时在缓冲区低端建立描述该缓冲块
// 的结构buffer_head,并将这些buffer_head 组成双向链表。
// h 是指向缓冲头结构的指针,而h+1 是指向内存地址连续的下一个缓冲头地址,也可以说是指向h
// 缓冲头的末端外。为了保证有足够长度的内存来存储一个缓冲头结构,需要b 所指向的内存块
// 地址 >= h 缓冲头的末端,也即要>=h+1。
while ((b -= BLOCK_SIZE) >= ((void *) (h + 1)))
{
h->b_dev = 0; // 使用该缓冲区的设备号。
h->b_dirt = 0; // 脏标志,也即缓冲区修改标志。
h->b_count = 0; // 该缓冲区引用计数。
h->b_lock = 0; // 缓冲区锁定标志。
h->b_uptodate = 0; // 缓冲区更新标志(或称数据有效标志)。
h->b_wait = NULL; // 指向等待该缓冲区解锁的进程。
h->b_next = NULL; // 指向具有相同hash 值的下一个缓冲头。
h->b_prev = NULL; // 指向具有相同hash 值的前一个缓冲头。
h->b_data = (char *) b; // 指向对应缓冲区数据块(1024 字节)。
h->b_prev_free = h - 1; // 指向链表中前一项。
h->b_next_free = h + 1; // 指向链表中下一项。
h++; // h 指向下一新缓冲头位置。
NR_BUFFERS++; // 缓冲区块数累加。
if (b == (void *) 0x100000) // 如果地址b 递减到等于1MB,则跳过384KB,
b = (void *) 0xA0000; // 让b 指向地址0xA0000(640KB)处。
}
h--; // 让h 指向最后一个有效缓冲头。
free_list = start_buffer; // 让空闲链表头指向头一个缓冲区头。
free_list->b_prev_free = h; // 链表头的b_prev_free 指向前一项(即最后一项)。
h->b_next_free = free_list; // h 的下一项指针指向第一项,形成一个环链。
// 初始化hash 表(哈希表、散列表),置表中所有的指针为NULL。
for (i = 0; i < NR_HASH; i++)
hash_table[i] = NULL;
struct buffer_head *h = start_buffer;void *b;int i;if (buffer_end == 1<<20)//如果内存末端为1M,则要减掉显存和BIOS所占的内存640K--1M之间b = (void *) (640*1024);elseb = (void *) buffer_end;// 这段代码用于初始化缓冲区,建立空闲缓冲区环链表,并获取系统中缓冲块的数目。// 操作的过程是从缓冲区高端开始划分1K 大小的缓冲块,与此同时在缓冲区低端建立描述该缓冲块// 的结构buffer_head,并将这些buffer_head 组成双向链表。// h 是指向缓冲头结构的指针,而h+1 是指向内存地址连续的下一个缓冲头地址,也可以说是指向h// 缓冲头的末端外。为了保证有足够长度的内存来存储一个缓冲头结构,需要b 所指向的内存块// 地址 >= h 缓冲头的末端,也即要>=h+1。while ((b -= BLOCK_SIZE) >= ((void *) (h + 1))){h->b_dev = 0;// 使用该缓冲区的设备号。h->b_dirt = 0;// 脏标志,也即缓冲区修改标志。h->b_count = 0;// 该缓冲区引用计数。h->b_lock = 0;// 缓冲区锁定标志。h->b_uptodate = 0;// 缓冲区更新标志(或称数据有效标志)。h->b_wait = NULL;// 指向等待该缓冲区解锁的进程。h->b_next = NULL;// 指向具有相同hash 值的下一个缓冲头。h->b_prev = NULL;// 指向具有相同hash 值的前一个缓冲头。h->b_data = (char *) b;// 指向对应缓冲区数据块(1024 字节)。h->b_prev_free = h - 1;// 指向链表中前一项。h->b_next_free = h + 1;// 指向链表中下一项。h++;// h 指向下一新缓冲头位置。NR_BUFFERS++;// 缓冲区块数累加。if (b == (void *) 0x100000)// 如果地址b 递减到等于1MB,则跳过384KB,b = (void *) 0xA0000;// 让b 指向地址0xA0000(640KB)处。}h--;// 让h 指向最后一个有效缓冲头。free_list = start_buffer;// 让空闲链表头指向头一个缓冲区头。free_list->b_prev_free = h;// 链表头的b_prev_free 指向前一项(即最后一项)。h->b_next_free = free_list;// h 的下一项指针指向第一项,形成一个环链。// 初始化hash 表(哈希表、散列表),置表中所有的指针为NULL。for (i = 0; i < NR_HASH; i++)hash_table[i] = NULL;
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)