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

Linux驅動技術(二) _訪問I/O內存

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

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

IO內存訪問流程

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

IO內存訪問流程 

IO內存申請/歸還

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

request_mem_region()宏函數向內存申請n個內存地址,這些地址從first開始,len長,name表示設備的名稱,成功返回非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()宏函數顧名思義就是將request_mem_region()申請的IO內存資源歸還給內核以便其他進程也可以訪問該IO內存。

  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內存映射/去映射

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

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

IO內存訪問API

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

讀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內存

  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內存

  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) 

復制IO內存

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

設置IO內存

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

2014-07-28 16:47:41

linux性能

2017-03-01 10:45:39

Linux驅動技術內存申請

2020-06-03 17:30:42

LinuxIO

2011-01-14 09:25:28

LinuxIO機制

2025-06-16 09:46:06

2017-01-19 19:14:20

Linux重定向命令

2019-09-12 08:58:26

LinuxUNIX操作系統

2021-02-22 17:06:58

Linux改動代碼

2011-02-25 09:16:00

SQLSQL Server IO

2017-03-25 21:33:33

Linux調度器

2017-01-19 19:24:29

Linux重定向

2019-02-25 08:40:28

Linux磁盤IO

2010-06-25 09:47:29

Linux系統監控

2022-04-23 16:30:22

Linux磁盤性能

2011-08-25 09:56:49

數據訪問

2020-12-01 07:08:23

Linux網絡I

2011-02-22 10:37:00

SQL ServerSQL Server 性能診斷

2020-12-08 09:30:25

CPU內存I

2011-10-17 10:01:18

IBMPower服務器

2017-03-01 14:46:53

Linux驅動技術異步通知技術
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品www | 午夜精品久久久久久久 | 色性av| 日韩一区精品 | av成人在线观看 | 成人免费区一区二区三区 | 亚洲高清在线观看 | 国产91丝袜在线18 | 91成人在线视频 | 久久久精彩视频 | 成人国产在线观看 | 欧美福利| 国产精品资源在线观看 | 黄色片在线观看网址 | 国产欧美在线 | 日韩在线免费 | 91免费高清视频 | 久久伊人精品一区二区三区 | 日韩免费| 美日韩视频 | 久久这里有精品 | 欧美成人免费在线视频 | 亚洲综合一区二区三区 | 国家一级黄色片 | 羞羞视频在线网站观看 | 最大av在线 | www..99re| www.国产 | 国产一区二区三区久久 | 亚洲+变态+欧美+另类+精品 | 午夜久久av| 亚洲高清视频在线观看 | 啪啪精品| 欧美一区二区视频 | 啪啪免费网 | 日韩欧美综合在线视频 | 成人国产免费观看 | 亚洲欧美在线一区 | 欧美日韩在线成人 | 免费一区二区三区 | 久色一区 |