您的位置 首页 汽车

Linux0.11-缓冲区初始化

Linux0.11-缓冲区初始化-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

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;  

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/89118.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部