在Linux中,page、buffer_head、bio這三個概念緊密相關,共同構成了塊設備I/O和內存管理的重要部分,它們的聯系主要體現在以下方面:
page與buffer_head
- 基于page構建:buffer_head通常是基于page來構建的,一個page可以包含一個或多個buffer_head所管理的緩沖區。因為page是內存管理的基本單位,而buffer_head所管理的緩沖區是對page的進一步細分和管理,用于更精細地操作和管理內存中的數據。
- 數據映射:buffer_head記錄了page中對應緩沖區與磁盤塊的映射關系,通過buffer_head中的相關字段,可以知道page中的某部分數據對應于磁盤上的哪個塊,方便實現內存與磁盤之間的數據交互。
page與bio
- 數據載體:bio在進行塊設備I/O操作時,最終的數據傳輸是在page和塊設備之間進行的,page是bio傳輸數據的實際載體。bio中包含了要傳輸的數據的位置和大小等信息,這些數據就存放在page中。
- I/O操作關聯:bio根據要訪問的磁盤塊的位置和大小等信息,找到對應的page,并通過page來執行具體的I/O操作。例如在讀取操作時,bio會指示從磁盤讀取數據到相應的page中;在寫入操作時,將page中的數據寫入到磁盤。
buffer_head與bio
- 操作協同:bio在發起I/O操作時,需要與buffer_head協同工作。bio負責組織和驅動I/O操作,而buffer_head負責管理操作過程中的數據緩存。比如在讀取數據時,bio會根據要讀取的磁盤塊號等信息,通過buffer_head查找對應的緩沖區,看數據是否已在緩存中。
- 狀態交互:bio的操作結果會影響buffer_head的狀態,當bio完成一次數據寫入操作后,會通知buffer_head更新緩沖區的狀態,將其標記為臟等。而buffer_head的狀態也會影響bio的操作,如緩沖區被鎖定時,bio需要等待解鎖。