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

2022-07-04 12:09:15 字數 1891 閱讀 5273

檔案系統的檔案太多,而且是照搬的minix的檔案系統,不想繼續分析下去了。緩衝區機制和檔案系統密切相關,所以這裡就簡單分析一下緩衝區機制。

buffer.c 程式用於對高速緩衝區(池)進行操作和管理。高速緩衝區位於核心**塊和主記憶體區之間,見圖9-9 中所示。高速緩衝區在塊裝置與核心其它程式之間起著乙個橋梁作用。除了塊裝置驅動程式以外,核心程式如果需要訪問塊裝置中的資料,就都需要經過高速緩衝區來間接地操作。

因為讀取磁碟資料很耗費時間,所以緩衝區的作用就是儲存讀過的磁碟資料,下次有需求直接從緩衝區讀取,緩衝區是記憶體區域,讀取非常快速。

圖中高速緩衝區的起始位置從核心模組末段end 標號開始,end 是核心模組鏈結期間由鏈結程式(ld)設定的乙個值,核心**中沒有定義這個符號。當在連線生成system 模組時,ld 程式的digest_symbols()函式會產生此符號。該函式主要用於對全域性變數進行引用賦值,並且計算每個被連線檔案的其始和大小,其中也設定了end 的值,它等於data_start + datasize + bss_size,也即核心模組的末段。

整個高速緩衝區被劃分成1024 位元組大小的緩衝塊,正好與塊裝置上的磁碟邏輯塊大小相同。高速緩衝採用hash 表和空閒緩衝塊佇列進行操作管理。在緩衝區初始化過程中,從緩衝區的兩端開始,同時分別設定緩衝塊頭結構和劃分出對應的緩衝塊。緩衝區的高階被劃分成乙個個1024 位元組的緩衝塊,低端則分別建立起對應各緩衝塊的緩衝頭結構buffer_head(include/linux/fs.h,68 行),用於描述對應緩衝塊的屬性和把所有緩衝頭連線成鍊錶。直到它們之間已經不能再劃分出緩衝塊為止,見圖9-10 所示。而各個buffer_head 被鏈結成乙個空閒緩衝塊雙向鍊錶結構。詳細結構見圖9-11 所示。

緩衝區的大致結構可參照buffer.c的buffer_init函式:

extern int end;			// 由連線程式ld 生成的表明程式末端的變數。[??]

struct buffer_head *start_buffer = (struct buffer_head *) &end;

struct buffer_head *hash_table[nr_hash]; // nr_hash = 307 項。

static struct buffer_head *free_list;

//// 緩衝區初始化函式。

// 引數buffer_end 是指定的緩衝區記憶體的末端。對於系統有16mb 記憶體,則緩衝區末端設定為4mb。

// 對於系統有8mb 記憶體,緩衝區末端設定為2mb。

void

buffer_init (long buffer_end)

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核心 緩衝區初始化

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

Linux 0 11 核心筆記

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