1, 核心為裝置提供了兩種通用的緩衝方案:
a, 頁緩衝(page cache)
b, 塊緩衝
2,核心管理頁緩衝所用的資料結構
核心通過基數樹(radix tree)來管理頁緩衝的,
3,核心如何回寫記憶體中修改的資料到物理裝置
a, 核心的守護進程在後台運行,為pdflush,這些守護進程周期性啟用,
b, pdflush的第二種運作模式是:如果緩衝中修改的資料項目數目在短期內顯著增加,則由核心啟用pdflush.
c,核心提供了相關的系統調用,如sync()
4,地址空間的概念
頁緩衝中的頁是通過地址空間(address_space)來和物理裝置記憶體(如底層檔案系統的struct inode結構)相互關聯的。對應與page結構的struct address_space *mapping成員。
(1) 如果page->mapping等 於0,說明該頁屬於交換告訴緩衝swap cache
(2) 如果page->mapping不 等於0,但第0位為0,說明該頁為匿名也,此時mapping指向一個struct anon_vma結構變數;
(3) 如果page->mapping不 等於0,但第0位不為0,則apping指向一個struct address_space地址空間結構變數;
struct address_space {struct inode *host; /*擁有節點*/struct radix_tree_root page_tree; /*包含全部頁面的radix樹 */spinlock_t tree_lock; /*保護page_tree的自旋鎖*/unsigned int i_mmap_writable; /* VM_SHARED計數*/struct prio_tree_root i_mmap; /*私人映射鏈表*/struct list_head i_mmap_nonlinear; /* VM_NONLINEAR 鏈表*/spinlock_t i_mmap_lock; /* 保護i_mmap的自旋鎖 */atomic_t truncate_count; /* 截斷計數*/ unsigned long nrpages; /* 頁總數*/pgoff_t writeback_index; /* 回寫的起始位移*/struct address_space_operations *a_ops; /* 動作表*/unsigned long flags; /* gfp_mask 掩碼與錯誤標識*/struct backing_dev_info *backing_dev_info; /*預讀資訊*/spinlock_t private_lock; /*私人address_space鎖*/struct list_head private_list; /*私人address_space鏈表*/struct address_space *assoc_mapping; /*相關的緩衝*/
};
比如頁快取中頁的擁有者是一個檔案的時候,那麼此時索引節點的i_mapping欄位總是指向索引節點的資料頁所有者的address_space.而address_space對象就嵌入在VFS索引節點對象的i_data欄位中。而address_space中的欄位host則指向它所有者的索引節點對象。
5,頁緩衝的常用操作函數
頁快取的還有幾個常用處理函數:尋找頁,增加頁,刪除頁更新頁。
struct page * find_get_page(struct address_space *mapping, unsigned long offset)unsigned find_get_pages(struct address_space *mapping, pgoff_t start,unsigned int nr_pages, struct page **pages)struct page *find_lock_page(struct address_space *mapping,unsigned long offset)struct page *find_trylock_page(struct address_space *mapping, unsigned long offset)struct page *find_or_create_page(struct address_space *mapping,unsigned long index, unsigned int gfp_mask)int add_to_page_cache(struct page *page, struct address_space *mapping,pgoff_t offset, int gfp_mask)remove_from_page_cache(struct page *page)