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;