91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Linux IO內存的訪問是怎樣的

發布時間:2021-12-24 14:01:00 來源:億速云 閱讀:208 作者:iii 欄目:系統運維

本篇內容主要講解“Linux IO內存的訪問是怎樣的”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Linux IO內存的訪問是怎樣的”吧!

IO內存訪問流程

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

Linux IO內存的訪問是怎樣的

IO內存申請/歸還

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

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

/**  * request_mem_region - create a new busy resource region  * @start: resource start address  * @n: resource region size  * @name: reserving caller's ID string  */  struct resource * request_mem_region(resource_size_t start, resource_size_t n,const char *name)

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

/**  * release_mem_region - release a previously reserved resource region  * @start: resource start address  * @n: resource region size  */  void release_mem_region(resource_size_t start, resource_size_t n,const char *name)

IO內存映射/去映射

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

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

IO內存訪問API

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

讀IO

unsigned int ioread8(void *addr) unsigned int ioread16(void *addr) unsigned int ioread32(void *addr)

寫IO

void iowrite8(u8 val,void *addr) void iowrite16(u8 val,void *addr) void iowrite32(u8 val,void *addr)

讀一串IO內存

void ioread8_rep(void *addr,void *buf,unsigned long len) void ioread16_rep(void *addr,void *buf,unsigned long len) void ioread32_rep(void *addr,void *buf,unsigned long len)

寫一串IO內存

void iowrite8_rep(void *addr,const void *buf,unsigned long len) void iowrite16_rep(void *addr,const void *buf,unsigned long len) void iowrite32_rep(void *addr,const void *buf,unsigned long len)

復制IO內存

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

設置IO內存

void memset_io(void *addr,u8 value,unsigned int len)

到此,相信大家對“Linux IO內存的訪問是怎樣的”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

韩城市| 天门市| 澄迈县| 张家港市| 桂林市| 永城市| 慈溪市| 阿图什市| 六盘水市| 沁阳市| 敦化市| 通榆县| 方正县| 兴宁市| 阜平县| 荔浦县| 海原县| 武夷山市| 昭通市| 东乌珠穆沁旗| 资溪县| 桑植县| 师宗县| 敦煌市| 屏东市| 台州市| 泗水县| 上杭县| 宁乡县| 浦城县| 杭锦后旗| 玉环县| 大安市| 旌德县| 衢州市| 陈巴尔虎旗| 从江县| 高青县| 鸡东县| 河东区| 喜德县|