本篇內(nèi)容主要講解“Linux IO內(nèi)存的訪問(wèn)是怎樣的”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Linux IO內(nèi)存的訪問(wèn)是怎樣的”吧!
成都創(chuàng)新互聯(lián)公司主打移動(dòng)網(wǎng)站、成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、網(wǎng)站改版、網(wǎng)絡(luò)推廣、網(wǎng)站維護(hù)、空間域名、等互聯(lián)網(wǎng)信息服務(wù),為各行業(yè)提供服務(wù)。在技術(shù)實(shí)力的保障下,我們?yōu)榭蛻舫兄Z穩(wěn)定,放心的服務(wù),根據(jù)網(wǎng)站的內(nèi)容與功能再?zèng)Q定采用什么樣的設(shè)計(jì)。最后,要實(shí)現(xiàn)符合網(wǎng)站需求的內(nèi)容、功能與設(shè)計(jì),我們還會(huì)規(guī)劃穩(wěn)定安全的技術(shù)方案做保障。
IO內(nèi)存訪問(wèn)流程
我們知道,為了管理最重要的系統(tǒng)資源并讓物理地址對(duì)進(jìn)程透明,Linux使用了內(nèi)存映射機(jī)制,就是一個(gè)進(jìn)程如果想訪問(wèn)一個(gè)物理內(nèi)存地址(eg.SFR地址),那么首先就是將其映射成虛擬地址。
IO內(nèi)存申請(qǐng)/歸還
Linux提供一組函數(shù)用于申請(qǐng)和釋放IO內(nèi)存的范圍,這兩個(gè)API在訪問(wèn)IO內(nèi)存的時(shí)候并不是必須的,但是建議使用,他們可以檢查申請(qǐng)的資源是否可用,增加IO訪問(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。
/** * 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()宏函數(shù)顧名思義就是將request_mem_region()申請(qǐng)的IO內(nèi)存資源歸還給內(nèi)核以便其他進(jìn)程也可以訪問(wèn)該IO內(nèi)存。
/** * 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內(nèi)存映射/去映射
申請(qǐng)了IO資源,接下來(lái)就是進(jìn)行物理地址到虛擬地址的映射。內(nèi)核提供的API如下
static inline void __iomem *ioremap(unsigned long port, unsigned long size)
static inline void iounmap(volatile void __iomem *addr)
IO內(nèi)存訪問(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
unsigned int ioread8(void *addr) unsigned int ioread16(void *addr) unsigned int ioread32(void *addr)
寫(xiě)IO
void iowrite8(u8 val,void *addr) void iowrite16(u8 val,void *addr) void iowrite32(u8 val,void *addr)
讀一串IO內(nèi)存
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)
寫(xiě)一串IO內(nèi)存
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)
復(fù)制IO內(nèi)存
void memcpy_fromio(void *dest,void *source,unsigned long len) void memcpy_toio(void *dest,void *source,unsigned long len)
設(shè)置IO內(nèi)存
void memset_io(void *addr,u8 value,unsigned int len)
到此,相信大家對(duì)“Linux IO內(nèi)存的訪問(wèn)是怎樣的”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
網(wǎng)站題目:LinuxIO內(nèi)存的訪問(wèn)是怎樣的
當(dāng)前路徑:http://jinyejixie.com/article48/johiep.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、網(wǎng)站改版、網(wǎng)站建設(shè)、軟件開(kāi)發(fā)、商城網(wǎng)站、服務(wù)器托管
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)