LinuxDMA編程方法是什么

本篇內容介紹了“Linux DMA編程方法是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

玉龍網站制作公司哪家好,找成都創新互聯公司!從網頁設計、網站建設、微信開發、APP開發、響應式網站等網站項目制作,到程序開發,運營維護。成都創新互聯公司于2013年開始到現在10年的時間,我們擁有了豐富的建站經驗和運維經驗,來保證我們的工作的順利進行。專注于網站建設就選成都創新互聯公司。

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內存的流程:  

Linux 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);//映射流式 DMAdma_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);//去映射流式  DMAdma_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);

“Linux DMA編程方法是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注創新互聯網站,小編將為大家輸出更多高質量的實用文章!

新聞名稱:LinuxDMA編程方法是什么
網頁網址:http://m.kartarina.com/article34/gecise.html

成都網站建設公司_創新互聯,為您提供標簽優化、動態網站、網站建設Google、微信公眾號云服務器

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都做網站
主站蜘蛛池模板: 无码中文字幕一区二区三区| 18禁无遮拦无码国产在线播放| 无码人妻丰满熟妇区96| 亚洲综合无码无在线观看| 中字无码av电影在线观看网站 | 无码人妻精品一区二区三区久久久 | 亚洲av午夜精品无码专区 | 精品亚洲AV无码一区二区三区| 无码中文人妻在线一区| 伊人久久精品无码av一区| 制服在线无码专区| 亚洲综合av永久无码精品一区二区| 亚洲精品无码专区在线| 久久精品无码精品免费专区| 无码免费又爽又高潮喷水的视频 | 久久久久亚洲精品无码蜜桃| 亚洲精品无码成人片在线观看| 亚洲乱人伦中文字幕无码| 无码专区久久综合久中文字幕 | 人妻丰满av无码中文字幕| 久久无码精品一区二区三区| 亚洲AV无码专区在线电影成人| 无码专区中文字幕无码| 亚洲日韩v无码中文字幕| 色欲香天天综合网无码| 久久久久久亚洲精品无码| 亚洲爆乳无码精品AAA片蜜桃| 日韩av无码一区二区三区| 亚洲AV无码一区二区二三区软件| 特黄熟妇丰满人妻无码| 久久天堂av综合色无码专区| 久久精品无码中文字幕| 无码色偷偷亚洲国内自拍| 无码人妻丰满熟妇片毛片| 色国产色无码色欧美色在线| 国产精品无码久久综合网| 精品少妇人妻AV无码专区不卡| 亚洲av无码专区国产不乱码| 亚洲AV永久无码精品放毛片| 69成人免费视频无码专区| 无码国产亚洲日韩国精品视频一区二区三区 |