目錄
DMA與Cache一致性" >DMA與Cache一致性
虛擬位址 VS 實體位址 VS 總線位址" >虛擬位址 VS 實體位址 VS 總線位址
DMA位址遮罩" >DMA位址遮罩
程式設計流程" >程式設計流程
一致性DMA" >一致性DMA
串流DMA" >串流DMA
首頁 系統教程 Linux 深入探討Linux驅動技術(三) _DMA程式設計的實現原理與相關技術

深入探討Linux驅動技術(三) _DMA程式設計的實現原理與相關技術

Feb 13, 2024 pm 02:03 PM
linux linux教程 linux系統 linux指令 shell腳本 嵌入式linux linux入門 linux學習

在Linux驅動程式編寫過程中,DMA程式設計是一種非常重要的技術。它可以實現高速資料傳輸,提高系統的效能和響應速度。在本文中,我們將深入探討Linux驅動技術(三) _DMA程式設計的實作原理與相關技術。

深入探讨Linux驱动技术(三) _DMA编程的实现原理和相关技术

#DMA即Direct Memory Access,是一種允許週邊直接存取記憶體資料而沒有CPU參與的技術,當週邊裝置對於該區塊記憶體的讀寫完成之後,DMAC透過中斷通知CPU,這種技術多用於對資料量和資料傳輸速度都有很高要求的周邊控制,如顯示​​設備等。

DMA與Cache一致性

#我們知道,為了提高系統運作效率,現代的CPU都採用多層快取結構,其中就包含使用多層Cache技術來快取記憶體中的資料來緩解CPU和記憶體速度差異問題。在這種前提下,顯而易見,如果DMA記憶體的資料已經被Cache快取了,而周邊又修改了其中的數據,這就會造成Cache資料和記憶體資料不符的問題,即DMA與Cache的一致性問題。為了解決這個問題,最簡單的辦法就是禁掉對DMA記憶體的Cache功能,顯然,這會導致效能的降低

虛擬位址 VS 實體位址 VS 總線位址

#在有MMU的電腦中,CPU看到的是虛擬位址,發給MMU後轉換成實體位址,虛擬位址再經過對應的電路轉換成匯流排位址,就是周邊看到的位址。所以,DMA週邊看到的位址其實是匯流排位址。 Linux核心提供了對應的API來實現三種位址間的轉換:

//虚拟->物理
virt_to_phys()
//物理->虚拟
ioremap()

//虚拟->总线
virt_to_bus()
//总线->虚拟
bus_to_virt()
登入後複製

DMA位址遮罩

#DMA週邊並不一定能在所有的記憶體位址上執行DMA操作,此時應該使用DMA位址遮罩

int dma_set_mask(struct device *dev,u64 mask);
登入後複製

例如只能存取24位址的DMA外設,就使用dma_set_mask(dev,0xffffff)

程式設計流程

以下是在核心程式中使用DMA記憶體的流程:

一致性DMA

#如果在驅動器中使用DMA緩衝區,可以使用核心提供的已經考慮到一致性的API:

/**
 * request_dma - 申请DMA通道
 * On certain platforms, we have to allocate an interrupt as well...
 */
int request_dma(unsigned int chan, const char *device_id);


/**
 * dma_alloc_coherent - allocate consistent memory for DMA
 * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices
 * @size: required memory size
 * @handle: bus-specific DMA address *
 * Allocate some memory for a device for performing DMA.  This function
 * allocates pages, and will return the CPU-viewed address, and sets @handle
 * to be the device-viewed address.
 */
void * dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, gfp_t flag)

//申请PCI设备的DMA缓冲区
void *pci_alloc_consistent(struct pci_dev *hwdev, size_t size, dma_addr_t *dma_handle)


//释放DMA缓冲区
void dma_free_coherent(struct device *dev, size_t size, void *cpu_addr, dma_addr_t dma_handle )

//释放PCI设备的DMA缓冲区
void pci_free_consistent()

/**
 * free_dma - 释放DMA通道
 * On certain platforms, we have to free interrupt as well...
 */
void free_dma(unsigned int chan); 
登入後複製

串流DMA

#如果使用應用層的緩衝區建立的DMA申請而不是驅動中的緩衝區,可能只會使用kmalloc等函數進行申請,那麼就需要使用串流DMA緩衝區,此外,還要解決Cache一致性的問題。

/**
 * request_dma - 申请DMA通道
 * On certain platforms, we have to allocate an interrupt as well...
 */
int request_dma(unsigned int chan, const char *device_id);

//映射流式DMA
dma_addr_t dma_map_single(struct device *dev,void *buf, size_t size, enum dma_datadirection direction);

//驱动获得DMA拥有权,通常驱动不该这么做
void dma_sync_single_for_cpu(struct device *dev,dma_addr_t dma_handle_t bus_addr,size_t size, enum dma_data_direction direction);

//将DMA拥有权还给设备
void dma_sync_single_for_device(struct device *dev,dma_addr_t dma_handle_t bus_addr,size_t size, enum dma_data_direction direction);

//去映射流式DMA
dma_addr_t dma_unmap_single(struct device *dev,void *buf, size_t size, enum dma_datadirection direction);

/**
 * free_dma - 释放DMA通道
 * On certain platforms, we have to free interrupt as well...
 */
void free_dma(unsigned int chan); 
登入後複製

總之,DMA程式設計是Linux驅動程式編寫過程中不可或缺的一部分。它可以實現高速資料傳輸,提高系統的效能和響應速度。希望本文能幫助讀者更能理解Linux驅動技術(三) _DMA程式設計的實作原理與相關技術。

以上是深入探討Linux驅動技術(三) _DMA程式設計的實現原理與相關技術的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

centos和ubuntu的區別 centos和ubuntu的區別 Apr 14, 2025 pm 09:09 PM

CentOS 和 Ubuntu 的關鍵差異在於:起源(CentOS 源自 Red Hat,面向企業;Ubuntu 源自 Debian,面向個人)、包管理(CentOS 使用 yum,注重穩定;Ubuntu 使用 apt,更新頻率高)、支持週期(CentOS 提供 10 年支持,Ubuntu 提供 5 年 LTS 支持)、社區支持(CentOS 側重穩定,Ubuntu 提供廣泛教程和文檔)、用途(CentOS 偏向服務器,Ubuntu 適用於服務器和桌面),其他差異包括安裝精簡度(CentOS 精

centos如何安裝 centos如何安裝 Apr 14, 2025 pm 09:03 PM

CentOS 安裝步驟:下載 ISO 映像並刻錄可引導媒體;啟動並選擇安裝源;選擇語言和鍵盤佈局;配置網絡;分區硬盤;設置系統時鐘;創建 root 用戶;選擇軟件包;開始安裝;安裝完成後重啟並從硬盤啟動。

Centos停止維護2024 Centos停止維護2024 Apr 14, 2025 pm 08:39 PM

CentOS將於2024年停止維護,原因是其上游發行版RHEL 8已停止維護。該停更將影響CentOS 8系統,使其無法繼續接收更新。用戶應規劃遷移,建議選項包括CentOS Stream、AlmaLinux和Rocky Linux,以保持系統安全和穩定。

docker原理詳解 docker原理詳解 Apr 14, 2025 pm 11:57 PM

Docker利用Linux內核特性,提供高效、隔離的應用運行環境。其工作原理如下:1. 鏡像作為只讀模板,包含運行應用所需的一切;2. 聯合文件系統(UnionFS)層疊多個文件系統,只存儲差異部分,節省空間並加快速度;3. 守護進程管理鏡像和容器,客戶端用於交互;4. Namespaces和cgroups實現容器隔離和資源限制;5. 多種網絡模式支持容器互聯。理解這些核心概念,才能更好地利用Docker。

Centos停止維護後的選擇 Centos停止維護後的選擇 Apr 14, 2025 pm 08:51 PM

CentOS 已停止維護,替代選擇包括:1. Rocky Linux(兼容性最佳);2. AlmaLinux(與 CentOS 兼容);3. Ubuntu Server(需要配置);4. Red Hat Enterprise Linux(商業版,付費許可);5. Oracle Linux(與 CentOS 和 RHEL 兼容)。在遷移時,考慮因素有:兼容性、可用性、支持、成本和社區支持。

centos停止維護後怎麼辦 centos停止維護後怎麼辦 Apr 14, 2025 pm 08:48 PM

CentOS 停止維護後,用戶可以採取以下措施應對:選擇兼容髮行版:如 AlmaLinux、Rocky Linux、CentOS Stream。遷移到商業發行版:如 Red Hat Enterprise Linux、Oracle Linux。升級到 CentOS 9 Stream:滾動發行版,提供最新技術。選擇其他 Linux 發行版:如 Ubuntu、Debian。評估容器、虛擬機或云平台等其他選項。

docker desktop怎麼用 docker desktop怎麼用 Apr 15, 2025 am 11:45 AM

如何使用 Docker Desktop? Docker Desktop 是一款工具,用於在本地機器上運行 Docker 容器。其使用步驟包括:1. 安裝 Docker Desktop;2. 啟動 Docker Desktop;3. 創建 Docker 鏡像(使用 Dockerfile);4. 構建 Docker 鏡像(使用 docker build);5. 運行 Docker 容器(使用 docker run)。

vscode需要什麼電腦配置 vscode需要什麼電腦配置 Apr 15, 2025 pm 09:48 PM

VS Code 系統要求:操作系統:Windows 10 及以上、macOS 10.12 及以上、Linux 發行版處理器:最低 1.6 GHz,推薦 2.0 GHz 及以上內存:最低 512 MB,推薦 4 GB 及以上存儲空間:最低 250 MB,推薦 1 GB 及以上其他要求:穩定網絡連接,Xorg/Wayland(Linux)

See all articles