偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Linux驅(qū)動(dòng)技術(shù)(二) _訪(fǎng)問(wèn)I/O內(nèi)存

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

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

IO內(nèi)存訪(fǎng)問(wèn)流程

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

IO內(nèi)存訪(fǎng)問(wèn)流程 

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

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

request_mem_region()宏函數(shù)向內(nèi)存申請(qǐng)n個(gè)內(nèi)存地址,這些地址從first開(kāi)始,len長(zhǎng),name表示設(shè)備的名稱(chēng),成功返回非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()申請(qǐng)的IO內(nèi)存資源歸還給內(nèi)核以便其他進(jìn)程也可以訪(fǎng)問(wèn)該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)存映射/去映射

申請(qǐng)了IO資源,接下來(lái)就是進(jìn)行物理地址到虛擬地址的映射。內(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)存訪(fǎng)問(wèn)API

ARM的SFR是32bit的,我們?cè)诮?jīng)過(guò)了ioremap之后其實(shí)就可以直接通過(guò)強(qiáng)制類(lèi)型轉(zhuǎn)換來(lái)讀取獲取的虛擬地址,但是這種方法不夠安全,一不小心就會(huì)讀錯(cuò)位,為此,內(nèi)核同樣提供的標(biāo)準(zhǔn)的API來(lái)讀寫(xiě)IO內(nèi)存,不但代碼的安全性更高,可讀性也得到了改善。

讀IO

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

寫(xiě)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) 

寫(xiě)一串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é)任編輯:龐桂玉 來(lái)源: 嵌入式Linux中文站
相關(guān)推薦

2014-07-28 16:47:41

linux性能

2017-03-01 10:45:39

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

2025-07-14 00:20:00

2020-06-03 17:30:42

LinuxIO

2011-01-14 09:25:28

LinuxIO機(jī)制

2025-06-16 09:46:06

2021-02-22 17:06:58

Linux改動(dòng)代碼

2019-09-12 08:58:26

LinuxUNIX操作系統(tǒng)

2017-01-19 19:14:20

Linux重定向命令

2011-02-25 09:16:00

SQLSQL Server IO

2019-02-25 08:40:28

Linux磁盤(pán)IO

2017-01-19 19:24:29

Linux重定向

2010-06-25 09:47:29

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

2022-04-23 16:30:22

Linux磁盤(pán)性能

2017-03-25 21:33:33

Linux調(diào)度器

2011-08-25 09:56:49

數(shù)據(jù)訪(fǎng)問(wèn)

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ù)器
點(diǎn)贊
收藏

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