LDD3 閱讀隨記

來源:互聯網
上載者:User
15.4.2. 分配 DMA 緩衝

本節涵蓋 DMA 緩衝在底層的分配; 我們稍後介紹一個進階介面, 但是來理解這裡展示的內容仍是一個好主意.

隨 DMA 緩衝帶來的主要問題是, 當它們大於一頁, 它們必須佔據實體記憶體的連續頁因為裝置使用 ISA 或者 PCI 系統匯流排傳輸資料, 它們都使用物理地址. 注意有趣的是這個限制不適用 SBus ( 見 12 章的"SBus"一節 ), 它在外設匯流排上使用虛擬位址. 一些體繫結構還可以在 PCI 匯流排上使用虛擬位址, 但是一個可移植的驅動不能依賴這個功能.

儘管 DMA 緩衝可被分配或者在系統啟動時或者在運行時, 模組只可在運行時分配它們的緩衝. (第 8 章介紹這些技術; "擷取大緩衝"一節涵蓋在系統啟動時分配, 而"kmalloc 的真實"和"get_free_page 和其友"描述在運行時分配). 驅動編寫者必須關心分配正確的記憶體,當它被用做 DMA 操作時; 不是所有記憶體區是合適的. 特別的, 在一些系統中的一些裝置上高端記憶體可能不為 DMA 工作
- 外設完全無法使用高端地址.

在現代匯流排上的大部分裝置可以處理 32-位 地址, 意思是正常的記憶體配置對它們是剛剛好的. 一些 PCI 裝置, 但是, 不能實現完整的 PCI 標準並且不能使用 32-位 地址. 並且 ISA 裝置, 當然, 限制只在 24-位 地址.

對於有這種限制的裝置, 記憶體應當從 DMA 區進行分配, 通過添加 GFP_DMA 標誌到 kmalloc 或者 get_free_pages 調用. 當這個標誌存在, 只有可用 24-位 定址的記憶體被分配. 另一種選擇, 你可以使用通用的 DMA 層( 我們馬上討論這個 )來分配緩衝以解決你的裝置的限制.

15.4.2.1. 自己做分配

我們已見到 get_free_pages 如何分配直到幾個 MByte (由於 order 可以直到 MAX_ORDER, 當前是 11), 但是進階數的請求容易失敗當請求的緩衝遠遠小於 128 KB, 因為系統記憶體時間長了變得碎裂.[50]

當核心無法返回請求數量的記憶體或者當你需要多於 128 KB(例如, 一個通常的 PCI 幀抓取的請求), 一個替代返回 -ENOMEM 的做法是在啟動時分配記憶體或者保留物理 RAM 的頂部給你的緩衝. 我們在第 8 章的 "獲得大量緩衝" 一節描述在啟動時間分配, 但是它對模組是停用. 保留 RAM 的頂部是通過在啟動時傳遞一個 mem= 參數給核心實現的. 例如, 如果你有 256 MB, 參數
mem=255M 使核心不使用頂部的 MByte. 你的模組可能後來使用下列代碼來獲得對這個記憶體的存取:

dmabuf = ioremap (0xFF00000 /* 255M */, 0x100000 /* 1M */); 

分配器, 配合本書的例子代碼的一部分, 提供了一個簡單的 API 來探測和管理這樣的保留 RAM 並且已在幾個體繫上被成功使用. 但是, 這個技巧當你有一個高記憶體系統時無效(即, 一個有比適合 CPU 地址空間更多的實體記憶體的系統 ).???????

當然, 另一個選項, 是使用 GFP_NOFAIL 來分配你的緩衝. 這個方法, 但是, 確實嚴重地對記憶體管理子系統有壓力, 並且它冒鎖住系統的風險; 最好是避免除非確實沒有其他方法.

如果你分配一個大 DMA 緩衝到這樣的長度, 但是, 值得想一下替代的方法. 如果你的裝置可以做發散/匯聚 I/O, 你可以分配你的緩衝以更小的片段並且讓裝置做其他的. 發散/匯聚 I/O 也可以用當進行直接 I/O 到使用者空間時, 它可能是最好地解決方案當需要一個真正大緩衝時.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.