Chinaunix首页 | 论坛 | 博客
  • 博客访问: 63797
  • 博文数量: 10
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 143
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-20 21:24
个人简介

学习是一种修行

文章分类

全部博文(10)

文章存档

2014年(2)

2013年(8)

我的朋友

分类: LINUX

2013-12-28 23:28:01

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映射区,因为那个地方不是系统内存,不能用于缓存区,如上图。最后定位链表当前位置
并且设置散列表,方便快速访问缓存区。
阅读(2695) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~