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;
?
評論
查看更多