LinuxDMA編程方法是什么

本篇內(nèi)容介紹了“Linux DMA編程方法是什么”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

玉龍網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)公司!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。成都創(chuàng)新互聯(lián)公司于2013年開始到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)公司。

DMA即Direct Memory Access,是一種允許外設(shè)直接存取內(nèi)存數(shù)據(jù)而沒有CPU參與的技術(shù),當(dāng)外設(shè)對于該塊內(nèi)存的讀寫完成之后,DMAC通過中斷通知CPU,這種技術(shù)多用于對數(shù)據(jù)量和數(shù)據(jù)傳輸速度都有很高要求的外設(shè)控制,比如顯示設(shè)備等。

DMA和Cache一致性

我們知道,為了提高系統(tǒng)運(yùn)行效率,現(xiàn)代的CPU都采用多級緩存結(jié)構(gòu),其中就包括使用多級Cache技術(shù)來緩存內(nèi)存中的數(shù)據(jù)來緩解CPU和內(nèi)存速度差異問題。在這種前提下,顯而易見,如果DMA內(nèi)存的數(shù)據(jù)已經(jīng)被Cache緩存了,而外設(shè)又修改了其中的數(shù)據(jù),這就會(huì)造成Cache數(shù)據(jù)和內(nèi)存數(shù)據(jù)不匹配的問題,即DMA與Cache的一致性問題。為了解決這個(gè)問題,最簡單的辦法就是禁掉對DMA內(nèi)存的Cache功能,顯然,這會(huì)導(dǎo)致性能的降低

虛擬地址 VS 物理地址 VS 總線地址

在有MMU的計(jì)算機(jī)中,CPU看到的是虛擬地址,發(fā)給MMU后轉(zhuǎn)換成物理地址,虛擬地址再經(jīng)過相應(yīng)的電路轉(zhuǎn)換成總線地址,就是外設(shè)看到的地址。所以,DMA外設(shè)看到的地址其實(shí)是總線地址。Linux內(nèi)核提供了相應(yīng)的API來實(shí)現(xiàn)三種地址間的轉(zhuǎn)換:

//虛擬->物理 virt_to_phys() //物理->虛擬 ioremap() //虛擬->總線 virt_to_bus() //總線->虛擬 bus_to_virt()

DMA地址掩碼

DMA外設(shè)并不一定能在所有的內(nèi)存地址上執(zhí)行DMA操作,此時(shí)應(yīng)該使用DMA地址掩碼

int dma_set_mask(struct device *dev,u64 mask);

比如一個(gè)只能訪問24位地址的DMA外設(shè),就使用dma_set_mask(dev,0xffffff)

編程流程

下面是在內(nèi)核程序中使用DMA內(nèi)存的流程:  

Linux DMA編程方法是什么

一致性DMA

如果在驅(qū)動(dòng)中使用DMA緩沖區(qū),可以使用內(nèi)核提供的已經(jīng)考慮到一致性的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設(shè)備的DMA緩沖區(qū) void *pci_alloc_consistent(struct pci_dev *hwdev, size_t size, dma_addr_t *dma_handle)//釋放DMA緩沖區(qū) void dma_free_coherent(struct device *dev, size_t size, void *cpu_addr, dma_addr_t dma_handle )//釋放PCI設(shè)備的DMA緩沖區(qū) void pci_free_consistent()/**  * free_dma - 釋放DMA通道  * On certain platforms, we have to free interrupt as well...  */ void free_dma(unsigned int chan);

流式DMA

如果使用應(yīng)用層的緩沖區(qū)建立的DMA申請而不是驅(qū)動(dòng)中的緩沖區(qū),可能僅僅使用kmalloc等函數(shù)進(jìn)行申請,那么就需要使用流式DMA緩沖區(qū),此外,還要解決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);//驅(qū)動(dòng)獲得DMA擁有權(quán),通常驅(qū)動(dòng)不該這么做  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擁有權(quán)還給設(shè)備  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編程方法是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

新聞名稱:LinuxDMA編程方法是什么
網(wǎng)頁網(wǎng)址:http://muchs.cn/article34/gecise.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、動(dòng)態(tài)網(wǎng)站、網(wǎng)站建設(shè)、Google、微信公眾號云服務(wù)器

廣告

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

成都做網(wǎng)站