在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM體系結(jié)構(gòu)下面內(nèi)存和i/o映射區(qū)別

            ARM體系結(jié)構(gòu)下面內(nèi)存和i/o映射區(qū)別

            作者: 時(shí)間:2016-11-20 來(lái)源:網(wǎng)絡(luò) 收藏
            (1)關(guān)于IO與內(nèi)存空間:

            在X86處理器中存在著I/O空間的概念,I/O空間是相對(duì)于內(nèi)存空間而言的,它通過特定的指令in、out來(lái)訪問。端口號(hào)標(biāo)識(shí)了外設(shè)的寄存器地址。Intel語(yǔ)法的in、out指令格式為:
            IN 累加器, {端口號(hào)│DX}
            OUT {端口號(hào)│DX},累加器
            目前,大多數(shù)嵌入式微控制器ARM、PowerPC等中并不提供I/O空間,而僅存在內(nèi)存空間。內(nèi)存空間可以直接通過地址、指針來(lái)訪問,程序和程序運(yùn)行中使用的變量和其他數(shù)據(jù)都存在于內(nèi)存空間中。
            即便是在X86處理器中,雖然提供了I/O空間,如果由我們自己設(shè)計(jì)電路板,外設(shè)仍然可以只掛接在內(nèi)存空間。此時(shí),CPU可以像訪問一個(gè)內(nèi)存單元那樣訪問外設(shè)I/O端口,而不需要設(shè)立專門的I/O指令。因此,內(nèi)存空間是必須的,而I/O空間是可選的。

            本文引用地址:http://www.biyoush.com/article/201611/318962.htm

            (2)inb和outb:

            在Linux設(shè)備驅(qū)動(dòng)中,宜使用Linux內(nèi)核提供的函數(shù)來(lái)訪問定位于I/O空間的端口,這些函數(shù)包括:
            · 讀寫字節(jié)端口(8位寬)
            unsigned inb(unsigned port);
            void outb(unsigned char byte, unsigned port);
            · 讀寫字端口(16位寬)
            unsigned inw(unsigned port);
            void outw(unsigned short word, unsigned port);
            · 讀寫長(zhǎng)字端口(32位寬)
            unsigned inl(unsigned port);
            void outl(unsigned longword, unsigned port);
            · 讀寫一串字節(jié)
            void insb(unsigned port, void *addr, unsigned long count);
            void outsb(unsigned port, void *addr, unsigned long count);
            · insb()從端口port開始讀count個(gè)字節(jié)端口,并將讀取結(jié)果寫入addr指向的內(nèi)存;outsb()將addr指向的內(nèi)存的count個(gè)字節(jié)連續(xù)地寫入port開始的端口。
            · 讀寫一串字
            void insw(unsigned port, void *addr, unsigned long count);
            void outsw(unsigned port, void *addr, unsigned long count);
            · 讀寫一串長(zhǎng)字
            void insl(unsigned port, void *addr, unsigned long count);
            void outsl(unsigned port, void *addr, unsigned long count);
            上述各函數(shù)中I/O端口號(hào)port的類型高度依賴于具體的硬件平臺(tái),因此,只是寫出了unsigned。

            (3)readb和writeb:
            在設(shè)備的物理地址被映射到虛擬地址之后,盡管可以直接通過指針訪問這些地址,但是工程師宜使用Linux內(nèi)核的如下一組函數(shù)來(lái)完成設(shè)備內(nèi)存映射的虛擬地址的讀寫,這些函數(shù)包括:
            · 讀I/O內(nèi)存
            unsigned int ioread8(void *addr);
            unsigned int ioread16(void *addr);
            unsigned int ioread32(void *addr);
            與上述函數(shù)對(duì)應(yīng)的較早版本的函數(shù)為(這些函數(shù)在Linux 2.6中仍然被支持):
            unsigned readb(address);
            unsigned readw(address);
            unsigned readl(address);
            · 寫I/O內(nèi)存
            void iowrite8(u8 value, void *addr);
            void iowrite16(u16 value, void *addr);
            void iowrite32(u32 value, void *addr);
            與上述函數(shù)對(duì)應(yīng)的較早版本的函數(shù)為(這些函數(shù)在Linux 2.6中仍然被支持):
            void writeb(unsigned value, address);
            void writew(unsigned value, address);
            void writel(unsigned value, address);

            (4)把I/O端口映射到“內(nèi)存空間”:
            void *ioport_map(unsigned long port, unsigned int count);
            通過這個(gè)函數(shù),可以把port開始的count個(gè)連續(xù)的I/O端口重映射為一段“內(nèi)存空間”。然后就可以在其返回的地址上像訪問I/O內(nèi)存一樣訪問這些I/O端口。當(dāng)不再需要這種映射時(shí),需要調(diào)用下面的函數(shù)來(lái)撤消:
            void ioport_unmap(void *addr);
            實(shí)際上,分析ioport_map()的源代碼可發(fā)現(xiàn),所謂的映射到內(nèi)存空間行為實(shí)際上是給開發(fā)人員制造的一個(gè)“假象”,并沒有映射到內(nèi)核虛擬地址,僅僅是為了讓工程師可使用統(tǒng)一的I/O內(nèi)存訪問接口訪問I/O端口。



            評(píng)論


            技術(shù)專區(qū)

            關(guān)閉