buffer_init()这个函数是缓存区初始化,基本没什么很难的都是一些数据结构的初始化,具体解释看下面注释:
void buffer_init(long buffer_end)
{
struct buffer_head * h = start_buffer;//初始化指针指向缓存区顶部
void * b;//定义野指针
int i;
if (buffer_end == 1<<20)
b = (void *) (640*1024);
else
b = (void *) buffer_end;
/****************************************
确定缓存区大小,如果缓存区是1024*1024,说明内存较少情况,应减少缓存内存为640*1024。其他情况都按主函数里面的做
if (memory_end > 16*1024*1024)
memory_end = 16*1024*1024;
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
根据不同物理实际内存大小设置缓存区大小
*******************************************/
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;
h->b_prev = NULL;
h->b_data = (char *) b;
h->b_prev_free = h-1;
h->b_next_free = h+1;
h++;
NR_BUFFERS++;
if (b == (void *) 0x100000)//跳过I/O设备映射区
b = (void *) 0xA0000;
}
/***********************************************
这一段是缓存区数据结构初始化置空。链表初始化,
I/O设备映射区不初始化如图:
*********************************************/
h--;
free_list = start_buffer;//保存最后一页缓存数据结构
free_list->b_prev_free = h;//
保存倒数第2页缓存链表
h->b_next_free = free_list;/
/保存倒数第2页缓存链表
for (i=0;i
hash_table[i]=NULL;
}
总结下,开始确定缓存区大小,然后初始化缓存页数据结构,其中要跳过io映射区,因为那个地方不是系统内存,不能用于缓存区,如上图。最后定位链表当前位置
并且设置散列表,方便快速访问缓存区。
阅读(2681) | 评论(0) | 转发(0) |