国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Linux驅(qū)動(dòng)技術(shù)(三) _DMA編程

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

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

DMA和Cache一致性

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

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

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

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

DMA地址掩碼

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

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

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

編程流程

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

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

一致性DMA

如果在驅(qū)動(dòng)中使用DMA緩沖區(qū),可以使用內(nèi)核提供的已經(jīng)考慮到一致性的API:

  1. /** 
  2.  * request_dma - 申請(qǐng)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)//申請(qǐng)PCI設(shè)備的DMA緩沖區(qū) 
  15. void *pci_alloc_consistent(struct pci_dev *hwdev, size_t size, dma_addr_t *dma_handle)//釋放DMA緩沖區(qū) 
  16. void dma_free_coherent(struct device *dev, size_t size, void *cpu_addr, dma_addr_t dma_handle )//釋放PCI設(shè)備的DMA緩沖區(qū) 
  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

如果使用應(yīng)用層的緩沖區(qū)建立的DMA申請(qǐng)而不是驅(qū)動(dòng)中的緩沖區(qū),可能僅僅使用kmalloc等函數(shù)進(jìn)行申請(qǐng),那么就需要使用流式DMA緩沖區(qū),此外,還要解決Cache一致性的問(wèn)題。 

  1. /** 
  2.  * request_dma - 申請(qǐng)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);//驅(qū)動(dòng)獲得DMA擁有權(quán),通常驅(qū)動(dòng)不該這么做 
  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擁有權(quán)還給設(shè)備 
  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);   
責(zé)任編輯:龐桂玉 來(lái)源: 嵌入式Linux中文站
相關(guān)推薦

2017-02-28 17:46:15

Linux驅(qū)動(dòng)技術(shù)并發(fā)控制

2017-03-01 14:46:53

Linux驅(qū)動(dòng)技術(shù)異步通知技術(shù)

2017-03-01 10:45:39

Linux驅(qū)動(dòng)技術(shù)內(nèi)存申請(qǐng)

2017-03-01 12:36:15

Linux驅(qū)動(dòng)技術(shù)內(nèi)存

2018-06-14 09:38:53

Linux多核編程

2017-11-07 20:12:05

Linux音頻設(shè)備ALSA

2017-03-01 16:40:12

Linux驅(qū)動(dòng)技術(shù)設(shè)備阻塞

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驅(qū)動(dòng)開(kāi)源操作系統(tǒng)微軟

2021-03-03 08:45:38

IO驅(qū)動(dòng)式Linux

2011-08-04 10:18:45

數(shù)據(jù)驅(qū)動(dòng)編程

2022-03-15 09:01:45

領(lǐng)域驅(qū)動(dòng)編程

2011-04-11 13:26:25

Linux驅(qū)動(dòng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

亚洲欧美成人网| 国产丝袜精品第一页| 99中文字幕在线观看| 欧美精品啪啪| 国外成人在线视频| 美女写真久久影院| 日韩一区二区中文字幕| 能在线看的av| 亚洲第一av色| 国产黄视频网站| 中文字幕不卡在线播放| 日韩精品一区二区三区久久| 韩国三级电影一区二区| 欧美日韩综合久久| 亚洲综合丁香| 日韩精品另类天天更新| 亚洲高清久久| 女同一区二区| 麻豆精品视频在线| 伊人久久99| 国产成人免费在线观看不卡| 91看片淫黄大片91| 国产精品69毛片高清亚洲| 宅男av一区二区三区| 国产曰批免费观看久久久| 日本女人高潮视频| 韩国精品久久久| www.在线观看av| 91丨porny丨首页| 手机在线免费观看毛片| 亚洲私人影院在线观看| 友田真希在线| 一本在线高清不卡dvd| av网站在线免费播放| 91久久线看在观草草青青| 男人影院在线观看| 日韩国产一区三区| 电影91久久久| 国产成人精品一区二区| 一本一本久久a久久综合精品| 丁香婷婷久久久综合精品国产 | 欧美一区二区三区婷婷| 日韩视频亚洲视频| 高清精品视频| 亚洲xxx视频| 香蕉精品999视频一区二区| 午夜精品亚洲一区二区三区嫩草 | 国产精品久久久久久网站| 成人3d精品动漫精品一二三| 91在线视频九色| 日韩综合一区二区| 欧美视频在线播放一区| 一区二区三区**美女毛片| 国产午夜精品一区理论片| 日韩欧美一二三区| 精品入口麻豆88视频| 成人国产精品一区| 美腿丝袜一区二区三区| 国产精品无码av无码| 老司机午夜激情| www浪潮av99com| 国产精品传媒视频| 色视频在线看| 日韩电影免费观看在线观看| 国产精品99久久免费| 国产福利精品av综合导导航| 一本色道精品久久一区二区三区| 天堂av在线中文| 国产精品日韩精品欧美在线| 深夜福利视频在线免费观看| 欧美精品一区二区三区蜜桃| 91在线一区| 欧美尤物一区| 国产精品护士白丝一区av| 毛片av在线| 性欧美长视频免费观看不卡| 免费日韩精品中文字幕视频在线| 欧美视频第三页| 欧美一区二区性放荡片| 亚洲国产精品免费视频| 国产伦精品一区二区三区四区视频| 精品亚洲成a人| 九色porny在线观看| 国产亚洲一区二区精品| 综合久久综合| 国产成人精品视频ⅴa片软件竹菊| 日本电影亚洲天堂一区| 九色porny视频在线观看| 一区二区三区亚洲| 色爱综合网欧美| 99亚洲国产精品| 色婷婷综合激情| 欧美专区视频| 美女被啪啪一区二区| 中文字幕一区二区三区在线观看| 岛国毛片av在线| 国产精品自拍网| 久久综合网色—综合色88| 免费观看久久久久| 国产欧美婷婷中文| 久久综合999| 蜜臀久久精品| 国产一区不卡在线观看| 亚洲欧美日韩综合aⅴ视频| 成人在线中文| 色阁综合av| 欧美在线观看视频在线| 视频一区欧美| 狠狠躁狠狠躁视频专区| 亚洲精品视频中文字幕| 欧美一级专区| 在线观看美女网站大全免费| 国产精品久久久久高潮| 国产精品三级视频| 精品91福利视频| 黄页网站在线观看视频| 亚洲成人xxx| 日韩精品免费专区| 日本免费在线观看| 亚洲综合最新在线| 亚洲宅男天堂在线观看无病毒| 国产一区二区在线观| 一区二区三区四区不卡在线| caoporn视频在线观看| 97碰碰视频| 一区二区三区在线视频免费观看 | 日本一区中文字幕| 成人高清免费观看mv| 成人深夜直播免费观看| 一区二区三区在线视频观看58| 美国十次综合久久| 成熟丰满熟妇高潮xxxxx视频| 日韩成人中文字幕| 久久精品国产色蜜蜜麻豆| 羞羞的网站在线观看| 精品中文字幕人| 欧美日本乱大交xxxxx| 亚洲三级视频| 麻豆传媒在线免费| 亚洲第一导航| 亚洲精品午夜精品| 99久久综合精品| 超碰cao国产精品一区二区| 五月婷婷丁香色| 欧美制服第一页| 亚洲一区二区三区四区不卡| 欧洲激情视频| 成人在线免费观看| 视频三区二区一区| 正在播放国产一区| 国产视频在线观看一区二区三区| 噜噜噜天天躁狠狠躁夜夜精品 | 全亚洲最色的网站在线观看| 亚洲欧美一区二区三区国产精品| 精品久久久久久久| 黄色av免费在线观看| 九色91视频| 亚洲免费视频在线观看| 久久夜色精品一区| 日韩深夜福利| 网友自拍视频在线| 波多野结衣 作品| 高清欧美性猛交xxxx| 精品国产成人在线| 久久亚洲欧洲| 99热这里有精品| 在线视频2区| 欧美一区二区影视| 欧美电影一区二区三区| 韩国视频一区二区| 精品嫩草影院| 1024国产在线| 国产日韩av网站| 国产精品精品视频一区二区三区| 在线91免费看| 91免费看`日韩一区二区| 精品精品久久| www欧美xxxx| 77777在线| 欧美精品亚洲精品| 久久这里只有精品99| 欧美日韩国产一区二区| 青草国产精品久久久久久| 波多野结衣在线一区二区 | 一区二区高清在线| 久久精品欧洲| 成人福利免费在线观看| 成人全视频高清免费观看| 久久这里只有精品18| 日本一区二区三区在线播放| 欧美疯狂做受xxxx富婆| 成人高清免费观看| 欧美在线亚洲综合一区| 99热播精品免费| 国产日韩精品在线看| 欧美日本视频在线观看| 国产伦精品一区二区三区四区视频 | 国产精品国产亚洲精品看不卡| 国产精品网站入口| 日韩av综合网站|