Linux0 11核心 緩衝區初始化

2021-08-25 18:15:46 字數 1300 閱讀 1060

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

/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--; // 讓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;

Linux0 11核心 緩衝區初始化

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...

Linux0 11核心 緩衝區機制大致分析

檔案系統的檔案太多,而且是照搬的minix的檔案系統,不想繼續分析下去了。緩衝區機制和檔案系統密切相關,所以這裡就簡單分析一下緩衝區機制。buffer.c 程式用於對高速緩衝區 池 進行操作和管理。高速緩衝區位於核心 塊和主記憶體區之間,見圖9 9 中所示。高速緩衝區在塊裝置與核心其它程式之間起著乙...

Linux 0 11 核心筆記

1 任務0的堆疊問題 一直不明白schedule.c裡的task union的stack和user stack是什麼關係,head.s裡就設定了esp指向user stack,卻一直沒有用到task union,直到看到init task才明白,從進入保護模式到跳轉進使用者態都是用的user sta...