成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Linux驅動技術(三) _DMA編程

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

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來實現三種地址間的轉換:

  1. //虛擬->物理 
  2. virt_to_phys() 
  3. //物理->虛擬 
  4. ioremap() 
  5. //虛擬->總線 
  6. virt_to_bus() 
  7. //總線->虛擬 
  8. bus_to_virt()  

DMA地址掩碼

DMA外設并不一定能在所有的內存地址上執行DMA操作,此時應該使用DMA地址掩碼 

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

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

編程流程

下面是在內核程序中使用DMA內存的流程:   

在內核程序中使用DMA內存的流程 

一致性DMA

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

  1. /** 
  2.  * request_dma - 申請DMA通道 
  3.  * On certain platforms, we have to allocate an interrupt as well... 
  4.  */int request_dma(unsigned int chan, const char *device_id);/** 
  5.  * dma_alloc_coherent - allocate consistent memory for DMA 
  6.  * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices 
  7.  * @size: required memory size 
  8.  * @handle: bus-specific DMA address * 
  9.  * Allocate some memory for a device for performing DMA.  This function 
  10.  * allocates pages, and will return the CPU-viewed address, and sets @handle 
  11.  * to be the device-viewed address. 
  12.  */ 
  13.  
  14. void * dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, gfp_t flag)//申請PCI設備的DMA緩沖區 
  15. void *pci_alloc_consistent(struct pci_dev *hwdev, size_t size, dma_addr_t *dma_handle)//釋放DMA緩沖區 
  16. void dma_free_coherent(struct device *dev, size_t size, void *cpu_addr, dma_addr_t dma_handle )//釋放PCI設備的DMA緩沖區 
  17. void pci_free_consistent()/** 
  18.  * free_dma - 釋放DMA通道 
  19.  * On certain platforms, we have to free interrupt as well... 
  20.  */ 
  21. void free_dma(unsigned int chan);  

流式DMA

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

  1. /** 
  2.  * request_dma - 申請DMA通道 
  3.  * On certain platforms, we have to allocate an interrupt as well... 
  4.  */ 
  5.  
  6. int request_dma(unsigned int chan, const char *device_id);//映射流式 
  7. DMAdma_addr_t dma_map_single(struct device *dev,void *buf, size_t size, enum dma_datadirection direction);//驅動獲得DMA擁有權,通常驅動不該這么做 
  8.  
  9. 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擁有權還給設備 
  10.  
  11. 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);//去映射流式 
  12.  
  13. DMAdma_addr_t dma_unmap_single(struct device *dev,void *buf, size_t size, enum dma_datadirection direction); 
  14. /** 
  15.  * free_dma - 釋放DMA通道 
  16.  * On certain platforms, we have to free interrupt as well... 
  17.  */ 
  18.  
  19. void free_dma(unsigned int chan);   
責任編輯:龐桂玉 來源: 嵌入式Linux中文站
相關推薦

2017-02-28 17:46:15

Linux驅動技術并發控制

2017-03-01 14:46:53

Linux驅動技術異步通知技術

2017-03-01 10:45:39

Linux驅動技術內存申請

2017-11-07 20:12:05

Linux音頻設備ALSA

2017-03-01 12:36:15

Linux驅動技術內存

2018-06-14 09:38:53

Linux多核編程

2017-03-01 16:40:12

Linux驅動技術設備阻塞

2023-10-07 09:37:53

2023-11-28 09:17:05

Linux編程

2023-09-26 10:30:57

Linux編程

2022-10-17 08:03:54

CPUDMAKafka

2012-09-29 09:00:25

2025-05-19 00:00:55

2012-05-28 15:49:06

Linux凱迪拉克

2021-05-21 10:48:34

新華三

2009-07-29 09:07:51

Linux驅動開源操作系統微軟

2011-08-04 10:18:45

數據驅動編程

2021-03-03 08:45:38

IO驅動式Linux

2022-03-15 09:01:45

領域驅動編程

2011-04-11 13:26:25

Linux驅動
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人在线免费观看视频 | 7777精品伊人久久精品影视 | 91av在线免费 | 国产精品亚洲片在线播放 | 免费看黄色国产 | 国产欧美性成人精品午夜 | 久久久国产一区二区三区 | 91免费观看视频 | 亚洲综合电影 | 一级毛片免费视频观看 | 国产精品视频一区二区三区四蜜臂 | 成人毛片视频免费 | 成人av鲁丝片一区二区小说 | 亚洲欧美日韩系列 | 亚洲午夜视频 | 色婷婷精品国产一区二区三区 | 成人激情免费视频 | 黄色在线免费观看 | 亚洲码欧美码一区二区三区 | 日韩毛片视频 | 日韩中文欧美 | 在线国产一区 | 自拍亚洲 | 在线观看欧美一区 | 中文字幕乱码一区二区三区 | www.日韩| 国产精品久久久久久久久动漫 | 国产精品久久久久久吹潮 | 国产精品69久久久久水密桃 | 欧美日产国产成人免费图片 | 高清国产午夜精品久久久久久 | 亚洲热在线视频 | 日日夜夜精品视频 | 国内精品久久久久久 | 天天射美女 | 亚洲精品日本 | 日日夜夜天天 | 精品乱人伦一区二区三区 | 天天天天操 | 激情综合五月 | 国产精品久久国产精品 |