色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 一文讀懂Linux下如何訪問(wèn)I/O端口和I/O內(nèi)存

          一文讀懂Linux下如何訪問(wèn)I/O端口和I/O內(nèi)存

          作者: 時(shí)間:2017-12-27 來(lái)源:網(wǎng)絡(luò) 收藏

            一、端口

          本文引用地址:http://cafeforensic.com/article/201712/373670.htm

            端口(port)是接口電路中能被CPU直接訪問(wèn)的寄存器的地址。幾乎每一種外設(shè)都是通過(guò)讀寫設(shè)備上的寄存器來(lái)進(jìn)行的。CPU通過(guò)這些地址即端口向接口電路中的寄存器發(fā)送命令,讀取狀態(tài)和傳送數(shù)據(jù)。外設(shè)寄存器也稱為“端口”,通常包括:控制寄存器、狀態(tài)寄存器和數(shù)據(jù)寄存器三大類,而且一個(gè)外設(shè)的寄存器通常被連續(xù)地編址。

            二、IO內(nèi)存

            例如,在PC上可以插上一塊圖形卡,有2MB的存儲(chǔ)空間,甚至可能還帶有ROM,其中裝有可執(zhí)行代碼。

              

           

            三、IO端口和IO內(nèi)存的區(qū)分及聯(lián)系

            這兩者如何區(qū)分就涉及到硬件知識(shí),X86體系中,具有兩個(gè)地址空間:IO空間和內(nèi)存空間,而RISC指令系統(tǒng)的CPU(如ARM、PowerPC等)通常只實(shí)現(xiàn)一個(gè)物理地址空間,即內(nèi)存空間。

            內(nèi)存空間:內(nèi)存地址尋址范圍,32位操作系統(tǒng)內(nèi)存空間為2的32次冪,即4G。

            IO空間:X86特有的一個(gè)空間,與內(nèi)存空間彼此獨(dú)立的地址空間,32位X86有64K的IO空間。

            IO端口:當(dāng)寄存器或內(nèi)存位于IO空間時(shí),稱為IO端口。一般寄存器也俗稱端口,或者說(shuō)I/O ports,這個(gè)I/O端口可以被映射在Memory Space,也可以被映射在I/O Space。

            IO內(nèi)存:當(dāng)寄存器或內(nèi)存位于內(nèi)存空間時(shí),稱為IO內(nèi)存。

            四、外設(shè)IO端口物理地址的編址方式

            CPU對(duì)外設(shè)IO端口物理地址的編址方式有兩種:一種是I/O映射方式(I/O-mapped),另一種是內(nèi)存映射方式(Memory-mapped)。而具體采用哪一種則取決于CPU的體系結(jié)構(gòu)。

            1、統(tǒng)一編址

            RISC指令系統(tǒng)的CPU(如,PowerPC、m68k、ARM等)通常只實(shí)現(xiàn)一個(gè)物理地址空間(RAM)。在這種情況下,外設(shè)I/O端口的物理地址就被映射到CPU的單一物理地址空間中,而成為內(nèi)存的一部分。此時(shí),CPU可以象訪問(wèn)一個(gè)內(nèi)存單元那樣訪問(wèn)外設(shè)I/O端口,而不需要設(shè)立專門的外設(shè)I/O指令。

            統(tǒng)一編址也稱為“I/O內(nèi)存”方式,外設(shè)寄存器位于“內(nèi)存空間”(很多外設(shè)有自己的內(nèi)存、緩沖區(qū),外設(shè)的寄存器和內(nèi)存統(tǒng)稱“I/O空間”)。

            2、獨(dú)立編址

            而另外一些體系結(jié)構(gòu)的CPU(典型地如X86)則為外設(shè)專門實(shí)現(xiàn)了一個(gè)單獨(dú)地地址空間,稱為“I/O地址空間”或者“I/O端口空間”。這是一個(gè)與CPU地RAM物理地址空間不同的地址空間,所有外設(shè)的I/O端口均在這一空間中進(jìn)行編址。CPU通過(guò)設(shè)立專門的I/O指令(如X86的IN和OUT指令)來(lái)訪問(wèn)這一空間中的地址單元(也即I/O端口)。與RAM物理地址空間相比,I/O地址空間通常都比較小,如x86 CPU的I/O空間就只有64KB(0-0xffff)。這是“I/O映射方式”的一個(gè)主要缺點(diǎn)。

            獨(dú)立編址也稱為“I/O端口”方式,外設(shè)寄存器位于“I/O(地址)空間”。

            3、優(yōu)缺點(diǎn)

            獨(dú)立編址主要優(yōu)點(diǎn)是:

            1)I/O端口地址不占用存儲(chǔ)器空間;使用專門的I/O指令對(duì)端口進(jìn)行操作,I/O指令短,執(zhí)行速度快。

            2)并且由于專門I/O指令與存儲(chǔ)器訪問(wèn)指令有明顯的區(qū)別,使程序中I/O操作和存儲(chǔ)器操作層次清晰,程序的可讀性強(qiáng)。

            3)同時(shí),由于使用專門的I/O指令訪問(wèn)端口,并且I/O端口地址和存儲(chǔ)器地址是分開的,故I/O端口地址和存儲(chǔ)器地址可以重疊,而不會(huì)相互混淆。

            4)譯碼電路比較簡(jiǎn)單(因?yàn)镮/0端口的地址空間一般較小,所用地址線也就較少)。

            其缺點(diǎn)是:只能用專門的I/0指令,訪問(wèn)端口的方法不如訪問(wèn)存儲(chǔ)器的方法多。

            統(tǒng)一編址優(yōu)點(diǎn):

            1)由于對(duì)I/O設(shè)備的訪問(wèn)是使用訪問(wèn)存儲(chǔ)器的指令,所以指令類型多,功能齊全,這不僅使訪問(wèn)I/O端口可實(shí)現(xiàn)輸入/輸出操作,而且還可對(duì)端口內(nèi)容進(jìn)行算術(shù)邏輯運(yùn)算,移位等等;

            2)另外,能給端口有較大的編址空間,這對(duì)大型控制系統(tǒng)和數(shù)據(jù)通信系統(tǒng)是很有意義的。

            這種方式的缺點(diǎn)是端口占用了存儲(chǔ)器的地址空間,使存儲(chǔ)器容量減小,另外指令長(zhǎng)度比專門I/O指令要長(zhǎng),因而執(zhí)行速度較慢。

            究竟采用哪一種取決于系統(tǒng)的總體設(shè)計(jì)。在一個(gè)系統(tǒng)中也可以同時(shí)使用兩種方式,前提是首先要支持I/O獨(dú)立編址。Intel的x86微處理器都支持I/O 獨(dú)立編址,因?yàn)樗鼈兊闹噶钕到y(tǒng)中都有I/O指令,并設(shè)置了可以區(qū)分I/O訪問(wèn)和存儲(chǔ)器訪問(wèn)的控制信號(hào)引腳。而一些微處理器或單片機(jī),為了減少引腳,從而減 少芯片占用面積,不支持I/O獨(dú)立編址,只能采用存儲(chǔ)器統(tǒng)一編址。

            五、下訪問(wèn)IO端口

            對(duì)于某一既定的系統(tǒng),它要么是獨(dú)立編址、要么是統(tǒng)一編址,具體采用哪一種則取決于CPU的體系結(jié)構(gòu)。 如,PowerPC、m68k等采用統(tǒng)一編址,而X86等則采用獨(dú)立編址,存在IO空間的概念。

            目前,大多數(shù)嵌入式微控制器如ARM、PowerPC等并不提供I/O空間,僅有內(nèi)存空間,可直接用地址、指針訪問(wèn)。但對(duì)于內(nèi)核而言,它可能用于不同的CPU,所以它必須都要考慮這兩種方式,于是它采用一種新的方法,將基于I/O映射方式的或內(nèi)存映射方式的I/O端口通稱為“I/O區(qū)域”(I/O region),不論你采用哪種方式,都要先申請(qǐng)IO區(qū)域:request_resource(),結(jié)束時(shí)釋放它:release_resource()。

            IO region是一種IO資源,因此它可以用resource結(jié)構(gòu)類型來(lái)描述。

            訪問(wèn)IO端口有2種途徑:I/O映射方式(I/O-mapped)、內(nèi)存映射方式(Memory-mapped)。前一種途徑不映射到內(nèi)存空間,直接使用 intb()/outb()之類的函數(shù)來(lái)讀寫IO端口;后一種MMIO是先把IO端口映射到IO內(nèi)存(“內(nèi)存空間”),再使用訪問(wèn)IO內(nèi)存的函數(shù)來(lái)訪問(wèn) IO端口。

            1、I/O映射方式

            直接使用IO端口操作函數(shù):在設(shè)備打開或驅(qū)動(dòng)模塊被加載時(shí)申請(qǐng)IO端口區(qū)域,之后使用inb(),outb()等進(jìn)行端口訪問(wèn),最后在設(shè)備關(guān)閉或驅(qū)動(dòng)被卸載時(shí)釋放IO端口范圍。

            in、out、ins和outs匯編語(yǔ)言指令都可以訪問(wèn)I/O端口。內(nèi)核中包含了以下輔助函數(shù)來(lái)簡(jiǎn)化這種訪問(wèn):

            inb( )、inw( )、inl( )

            分別從I/O端口讀取1、2或4個(gè)連續(xù)字節(jié)。后綴“b”、“w”、“l(fā)”分別代表一個(gè)字節(jié)(8位)、一個(gè)字(16位)以及一個(gè)長(zhǎng)整型(32位)。

            inb_p( )、inw_p( )、inl_p( )

            分別從I/O端口讀取1、2或4個(gè)連續(xù)字節(jié),然后執(zhí)行一條“啞元(dummy,即空指令)”指令使CPU暫停。

            outb( )、outw( )、outl( )

            分別向一個(gè)I/O端口寫入1、2或4個(gè)連續(xù)字節(jié)。

            outb_p( )、outw_p( )、outl_p( )

            分別向一個(gè)I/O端口寫入1、2或4個(gè)連續(xù)字節(jié),然后執(zhí)行一條“啞元”指令使CPU暫停。

            insb( )、insw( )、insl( )

            分別從I/O端口讀入以1、2或4個(gè)字節(jié)為一組的連續(xù)字節(jié)序列。字節(jié)序列的長(zhǎng)度由該函數(shù)的參數(shù)給出。

            outsb( )、outsw( )、outsl( )

            分別向I/O端口寫入以1、2或4個(gè)字節(jié)為一組的連續(xù)字節(jié)序列。

            流程如下:

              

           


          上一頁(yè) 1 2 下一頁(yè)

          關(guān)鍵詞: Linux I/O

          評(píng)論


          相關(guān)推薦

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

          關(guān)閉