cache操作函式 --20240310

lethe1203發表於2024-03-10
Baremetal
不討論多級cache的情況下,裸驅兩種關於dcache的操作:
flush_dcache_all(); // 將cache裡面的東西刷入記憶體 invalidate_dcache_all(); // 將資料快取中的所有內容無效化(invalidate)。該指令一般用於確保快取中的資料與主記憶體中的資料同步
flush_dcache_all()函式通常在嵌入式系統或需要對資料快取進行手動管理的系統中使用。以下是一些常見的情況和原因:
  1. 作業系統啟動和關閉時:
在某些嵌入式系統中,作業系統啟動時可能需要執行 flush_dcache_all()來確保資料快取中的資料已經寫回到主記憶體,從而避免啟動過程中的資料不一致性。同樣,在關閉系統之前,也可能需要執行該函式以確保資料完整性。
  1. DMA 操作:
當使用直接記憶體訪問(Direct Memory Access, DMA)進行資料傳輸時,需要確保快取中的資料已經寫回到主記憶體,否則可能會導致資料不一致或丟失。在進行 DMA 操作前或後,執行flush_dcache_all()可以確保資料的一致性。
  1. 記憶體對映裝置:
在一些嵌入式系統中,可能存在記憶體對映裝置,需要手動管理快取以確保正確的資料傳輸和一致性。
  1. 共享記憶體:
當多個處理器或硬體模組共享同一塊記憶體時,需要確保資料的一致性。在資料被共享之前或之後,執行flush_dcache_all()可以確保共享資料的正確性。
總的來說,flush_dcache_all()通常用於確保資料的一致性和完整性,特別是在涉及到硬體、記憶體對映和多處理器系統的場景中。
invalidate_dcache_all()是一個函式或指令名稱,用於將資料快取中的所有內容無效化(invalidate)。該指令一般用於確保快取中的資料與主記憶體中的資料同步,在某些場景下非常重要。
具體來說,當處理器從主記憶體讀取資料時,資料通常會被快取到資料快取中。而當資料被修改時,為了提高效能,處理器通常只會在必要時將修改後的資料寫回到主記憶體,而不是立即更新主記憶體中的資料。這就可能導致快取中的資料和主記憶體中的資料不一致。使用invalidate_dcache_all()可以強制重新整理快取,從而使快取中的資料無效化,確保後續從主記憶體中讀取資料時,總是可以獲得最新的資料。
Linux核心
Linux 核心中操作快取時一些常見的 cache 操作函式的解釋:
  1. kmem_cache_create()
  • 功能:建立一個新的核心快取(kmem_cache)。
  • 引數:包括快取物件的大小、對齊方式、建構函式等。
  • 返回值:成功建立快取時返回指向 kmem_cache 結構的指標,失敗時返回 NULL。
  • 示例:my_cache = kmem_cache_create("my_cache", sizeof(struct my_struct), 0, SLAB_HWCACHE_ALIGN, NULL);
  1. kmem_cache_alloc()
  • 功能:從指定的核心快取中分配一個物件。
  • 引數:要分配的快取指標。
  • 返回值:成功時返回分配的物件的指標,失敗時返回 NULL。
  • 示例:ptr = kmem_cache_alloc(my_cache, GFP_KERNEL);
  1. kmem_cache_free()
  • 功能:將一個物件釋放回其所屬的核心快取中。
  • 引數:要釋放的物件指標。
  • 返回值:無。
  • 示例:kmem_cache_free(my_cache, ptr);
  1. kmem_cache_destroy()
  • 功能:銷燬一個核心快取,釋放其佔用的資源。
  • 引數:要銷燬的快取指標。
  • 返回值:無。
  • 示例:kmem_cache_destroy(my_cache);
  1. flush_dcache_page()
  • 功能:重新整理指定頁面的資料快取,確保資料被寫入記憶體。
  • 引數:要重新整理的頁面指標。
  • 返回值:無。
  • 示例:flush_dcache_page(virt_to_page(ptr));
  1. flush_icache_page()
  • 功能:重新整理指定頁面的指令快取,確保指令的正確性。
  • 引數:要重新整理的頁面指標。
  • 返回值:無。
  • 示例:flush_icache_page(virt_to_page(ptr));

相關文章