Linux0.11核心--緩衝區機制大致分析,linux0.11緩衝區

來源:互聯網
上載者:User

Linux0.11核心--緩衝區機制大致分析,linux0.11緩衝區

檔案系統的檔案太多,而且是照搬的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。voidbuffer_init (long buffer_end){  struct buffer_head *h = start_buffer;  void *b;  int i;// 如果緩衝區高端等於1Mb,則由於從640KB-1MB 被顯示記憶體和BIOS 佔用,因此實際可用緩衝區記憶體// 高端應該是640KB。否則記憶體高端一定大於1MB。  if (buffer_end == 1 << 20)    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;}

根據上面的理論知識,這段代碼很好分析,就不多做解釋了。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.