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

Linux驅(qū)動技術(shù)(二) _訪問I/O內(nèi)存

系統(tǒng) Linux 系統(tǒng)運維
ARM是對內(nèi)存空間和IO空間統(tǒng)一編址的,所以,通過讀寫SFR來控制硬件也就變成了通過讀寫相應(yīng)的SFR地址來控制硬件。這部分地址也被稱為I/O內(nèi)存。x86中對I/O地址和內(nèi)存地址是分開編址的,這樣的IO地址被稱為I/O端口。本文只討論IO內(nèi)存的訪問。

ARM是對內(nèi)存空間和IO空間統(tǒng)一編址的,所以,通過讀寫SFR來控制硬件也就變成了通過讀寫相應(yīng)的SFR地址來控制硬件。這部分地址也被稱為I/O內(nèi)存。x86中對I/O地址和內(nèi)存地址是分開編址的,這樣的IO地址被稱為I/O端口。本文只討論IO內(nèi)存的訪問。

IO內(nèi)存訪問流程

我們知道,為了管理最重要的系統(tǒng)資源并讓物理地址對進程透明,Linux使用了內(nèi)存映射機制,就是一個進程如果想訪問一個物理內(nèi)存地址(eg.SFR地址),那么首先就是將其映射成虛擬地址。   

IO內(nèi)存訪問流程 

IO內(nèi)存申請/歸還

Linux提供一組函數(shù)用于申請和釋放IO內(nèi)存的范圍,這兩個API在訪問IO內(nèi)存的時候并不是必須的,但是建議使用,他們可以檢查申請的資源是否可用,增加IO訪問的安全性,如果可用則申請成功,并標志為已用,其他驅(qū)動想在這個進程歸還資源前申請就會失敗。

request_mem_region()宏函數(shù)向內(nèi)存申請n個內(nèi)存地址,這些地址從first開始,len長,name表示設(shè)備的名稱,成功返回非NULL失敗返回NULL。

  1. /** 
  2.  * request_mem_region - create a new busy resource region 
  3.  * @start: resource start address 
  4.  * @n: resource region size 
  5.  * @name: reserving caller's ID string 
  6.  */ 
  7.  
  8. struct resource * request_mem_region(resource_size_t start, resource_size_t n,const char *name 

release_mem_region()宏函數(shù)顧名思義就是將request_mem_region()申請的IO內(nèi)存資源歸還給內(nèi)核以便其他進程也可以訪問該IO內(nèi)存。

  1. /** 
  2.  * release_mem_region - release a previously reserved resource region 
  3.  * @start: resource start address 
  4.  * @n: resource region size 
  5.  */ 
  6.  
  7. void release_mem_region(resource_size_t start, resource_size_t n,const char *name 

IO內(nèi)存映射/去映射

申請了IO資源,接下來就是進行物理地址到虛擬地址的映射。內(nèi)核提供的API如下

  1. static inline void __iomem *ioremap(unsigned long port, unsigned long size
  1. static inline void iounmap(volatile void __iomem *addr) 

IO內(nèi)存訪問API

ARM的SFR是32bit的,我們在經(jīng)過了ioremap之后其實就可以直接通過強制類型轉(zhuǎn)換來讀取獲取的虛擬地址,但是這種方法不夠安全,一不小心就會讀錯位,為此,內(nèi)核同樣提供的標準的API來讀寫IO內(nèi)存,不但代碼的安全性更高,可讀性也得到了改善。

讀IO

  1. unsigned int ioread8(void *addr) 
  2. unsigned int ioread16(void *addr) 
  3. unsigned int ioread32(void *addr) 

寫IO

  1. void iowrite8(u8 val,void *addr) 
  2. void iowrite16(u8 val,void *addr) 
  3. void iowrite32(u8 val,void *addr) 

讀一串IO內(nèi)存

  1. void ioread8_rep(void *addr,void *buf,unsigned long len) 
  2. void ioread16_rep(void *addr,void *buf,unsigned long len) 
  3. void ioread32_rep(void *addr,void *buf,unsigned long len) 

寫一串IO內(nèi)存

  1. void iowrite8_rep(void *addr,const void *buf,unsigned long len) 
  2. void iowrite16_rep(void *addr,const void *buf,unsigned long len) 
  3. void iowrite32_rep(void *addr,const void *buf,unsigned long len) 

復(fù)制IO內(nèi)存

  1. void memcpy_fromio(void *dest,void *source,unsigned long len) 
  2. void memcpy_toio(void *dest,void *source,unsigned long len) 

設(shè)置IO內(nèi)存

  1. void memset_io(void *addr,u8 value,unsigned int len)  
責(zé)任編輯:龐桂玉 來源: 嵌入式Linux中文站
相關(guān)推薦

2014-07-28 16:47:41

linux性能

2017-03-01 10:45:39

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

2020-06-03 17:30:42

LinuxIO

2011-01-14 09:25:28

LinuxIO機制

2025-06-16 09:46:06

2021-02-22 17:06:58

Linux改動代碼

2017-01-19 19:14:20

Linux重定向命令

2019-09-12 08:58:26

LinuxUNIX操作系統(tǒng)

2011-02-25 09:16:00

SQLSQL Server IO

2017-01-19 19:24:29

Linux重定向

2019-02-25 08:40:28

Linux磁盤IO

2010-06-25 09:47:29

Linux系統(tǒng)監(jiān)控

2022-04-23 16:30:22

Linux磁盤性能

2017-03-25 21:33:33

Linux調(diào)度器

2011-08-25 09:56:49

數(shù)據(jù)訪問

2020-12-01 07:08:23

Linux網(wǎng)絡(luò)I

2011-02-22 10:37:00

SQL ServerSQL Server 性能診斷

2020-12-08 09:30:25

CPU內(nèi)存I

2011-10-17 10:01:18

IBMPower服務(wù)器

2017-03-01 14:46:53

Linux驅(qū)動技術(shù)異步通知技術(shù)
點贊
收藏

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

主站蜘蛛池模板: 玖玖视频网| 日韩欧美久久 | 国产高清在线观看 | 欧美午夜在线 | 国产精品久久久久久久久久免费看 | 午夜在线观看视频 | av网站免费 | 97色伦网 | 成人欧美一区二区三区在线播放 | 福利av在线 | 2019精品手机国产品在线 | 欧美成人一区二区三区 | 国产精品欧美一区二区 | 国产精品久久久久不卡 | 亚洲网视频 | 国产亚洲成av人片在线观看桃 | 精品国产一区二区国模嫣然 | 久久久久亚洲精品 | 久久视频精品 | 91在线精品秘密一区二区 | 99re在线视频 | 国产1区2区3区 | 久久久久久久国产精品 | 夜夜夜操| 亚洲国产欧美在线 | 欧美精品一区三区 | 伊人伊人伊人 | 亚洲一区二区三区免费 | 羞羞网站在线免费观看 | 青青99| 久久av网 | 欧美高清视频在线观看 | 超碰美女在线 | 婷婷综合五月天 | 久久久久国产 | 精品区 | 精品国产91乱码一区二区三区 | 久久曰视频 | 怡红院怡春院一级毛片 | 欧美精品在欧美一区二区少妇 | 真人毛片|