<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Linux設(shè)備驅(qū)動(dòng)之I/O端口與I/O內(nèi)存

          Linux設(shè)備驅(qū)動(dòng)之I/O端口與I/O內(nèi)存

          作者: 時(shí)間:2016-10-10 來源:網(wǎng)絡(luò) 收藏

          一、統(tǒng)一編址與獨(dú)立編址

          本文引用地址:http://www.ex-cimer.com/article/201610/306046.htm

          從CPU連出來一把線:數(shù)據(jù)總線、地址總線、控制總線,這把線上掛著N個(gè)接口,有相同的,有不同的,名字叫做存儲(chǔ)器接口、中斷控制接口、DMA接口、并行接口、串行接口、AD接口……一個(gè)設(shè)備要想接入,就用自己的接口和總線上的某個(gè)匹配接口對接……于是總線上出現(xiàn)了各種設(shè)備:、硬盤,鼠標(biāo)、鍵盤,顯示器……

          對于CPU而言,如果它要發(fā)數(shù)據(jù)到某個(gè)設(shè)備,其實(shí)是發(fā)到對應(yīng)的接口,接口電路里有多個(gè)寄存器(也稱為),訪問設(shè)備實(shí)際上是訪問相關(guān)的,所有的信息會(huì)由接口轉(zhuǎn)給它的設(shè)備。那么CPU會(huì)準(zhǔn)備數(shù)據(jù)到數(shù)據(jù)總線,但是諸多接口,該發(fā)給誰呢?這時(shí)就須要為各接口分配一個(gè)地址,然后把地址放在地址總線上,需要的控制信息放到控制總線上,就可以和設(shè)備通信了。

          對一個(gè)系統(tǒng)而言,通常會(huì)有多個(gè)外設(shè),每個(gè)外設(shè)的接口電路中,又會(huì)有多個(gè),每個(gè)端口都需要一個(gè)地址,為他們標(biāo)識(shí)一個(gè)具體的地址值,是系統(tǒng)必須解決的事,與此同時(shí),你還有個(gè)條,可能是512M或1G或更大的金士頓、現(xiàn)代DDR2之類,他們的每一個(gè)地址也都需要分配一個(gè)標(biāo)識(shí)值,另外,很多外設(shè)有自己的、緩沖區(qū),就像你的內(nèi)存條一樣,你同樣需要為它們分配內(nèi)存……你的CPU可能需要和它們的每一個(gè)字節(jié)都打交道,所以:別指望偷懶,它們的每一寸土地都要規(guī)劃好!這聽起來就很煩,做起來可能就直接導(dǎo)致腦細(xì)胞全部陣亡。但事情總是得有人去做,ARM可能會(huì)這樣做:他這次設(shè)計(jì)的CPU是32位的,最多也就能尋址2^32=4G空間,于是把這4GB空間丟給內(nèi)存和端口,讓他們瓜分。但英特爾或許有更好的分配方式……

          1、地址的概念

          1)物理地址:CPU地址總線傳來的地址,由硬件電路控制其具體含義。物理地址中很大一部分是留給內(nèi)存條中的內(nèi)存的,但也常被映射到其他存儲(chǔ)器上(如顯存、BIOS等)。在程序指令中的虛擬地址經(jīng)過段映射和頁面映射后,就生成了物理地址,這個(gè)物理地址被放到CPU的地址線上。

          物理地址空間,一部分給物理RAM(內(nèi)存)用,一部分給總線用,這是由硬件設(shè)計(jì)來決定的,因此在32 bits地址線的x86處理器中,物理地址空間是2的32次方,即4GB,但物理RAM一般不能上到4GB,因?yàn)檫€有一部分要給總線用(總線上還掛著別的許多設(shè)備)。在PC機(jī)中,一般是把低端物理地址給RAM用,高端物理地址給總線用。

          2)總線地址:總線的地址線或在地址周期上產(chǎn)生的信號。外設(shè)使用的是總線地址,CPU使用的是物理地址。

          物理地址與總線地址之間的關(guān)系由系統(tǒng)的設(shè)計(jì)決定的。在x86平臺(tái)上,物理地址就是總線地址,這是因?yàn)樗鼈児蚕硐嗤牡刂房臻g——這句話有點(diǎn)難理解,詳見下面的“獨(dú)立編址”。在其他平臺(tái)上,可能需要轉(zhuǎn)換/映射。比如:CPU需要訪問物理地址是0xfa000的單元,那么在x86平臺(tái)上,會(huì)產(chǎn)生一個(gè)PCI總線上對0xfa000地址的訪問。因?yàn)槲锢淼刂泛涂偩€地址相同,所以憑眼睛看是不能確定這個(gè)地址是用在哪兒的,它或者在內(nèi)存中,或者是某個(gè)卡上的存儲(chǔ)單元,甚至可能這個(gè)地址上沒有對應(yīng)的存儲(chǔ)器。

          3)虛擬地址:現(xiàn)代操作系統(tǒng)普遍采用虛擬內(nèi)存管理(Virtual Memory Management)機(jī)制,這需要MMU(Memory Management Unit)的支持。MMU通常是CPU的一部分,如果處理器沒有MMU,或者有MMU但沒有啟用,CPU執(zhí)行單元發(fā)出的內(nèi)存地址將直接傳到芯片引腳上,被內(nèi)存芯片(物理內(nèi)存)接收,這稱為物理地址(Physical Address),如果處理器啟用了MMU,CPU執(zhí)行單元發(fā)出的內(nèi)存地址將被MMU截獲,從CPU到MMU的地址稱為虛擬地址(Virtual Address),而MMU將這個(gè)地址翻譯成另一個(gè)地址發(fā)到CPU芯片的外部地址引腳上,也就是將虛擬地址映射成物理地址。

          中,進(jìn)程的4GB(虛擬)內(nèi)存分為用戶空間、內(nèi)核空間。用戶空間分布為0~3GB(即PAGE_OFFSET,在0X86中它等于0xC0000000),剩下的1G為內(nèi)核空間。程序員只能使用虛擬地址。系統(tǒng)中每個(gè)進(jìn)程有各自的私有用戶空間(0~3G),這個(gè)空間對系統(tǒng)中的其他進(jìn)程是不可見的。

          CPU發(fā)出取指令請求時(shí)的地址是當(dāng)前上下文的虛擬地址,MMU再從頁表中找到這個(gè)虛擬地址的物理地址,完成取指。同樣讀取數(shù)據(jù)的也是虛擬地址,比如mov ax, var. 編譯時(shí)var就是一個(gè)虛擬地址,也是通過MMU從也表中來找到物理地址,再產(chǎn)生總線時(shí)序,完成取數(shù)據(jù)的。

          2、編址方式

          1)外設(shè)都是通過讀寫設(shè)備上的寄存器來進(jìn)行的,外設(shè)寄存器也稱為“I/O端口”,而IO端口有兩種編址方式:獨(dú)立編址和統(tǒng)一編制。

          統(tǒng)一編址:外設(shè)接口中的IO寄存器(即IO端口)與主存單元一樣看待,每個(gè)端口占用一個(gè)存儲(chǔ)單元的地址,將主存的一部分劃出來用作IO地址空間,如,在PDP-11中,把最高的4K主存作為IO設(shè)備寄存器地址。端口占用了存儲(chǔ)器的地址空間,使存儲(chǔ)量容量減小。

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

          如,Samsung的S3C2440,是32位ARM處理器,它的4GB地址空間被外設(shè)、RAM等瓜分:

          0x8000 1000 LED 8*8點(diǎn)陣的地址

          0x4800 0000 ~ 0x6000 0000 SFR(特殊暫存器)地址空間

          0x3800 1002 鍵盤地址

          0x3000 0000 ~ 0x3400 0000 SDRAM空間

          0x2000 0020 ~ 0x2000 002e IDE

          0x1900 0300 CS8900

          獨(dú)立編址(單獨(dú)編址):IO地址與存儲(chǔ)地址分開獨(dú)立編址,I/O端口地址不占用存儲(chǔ)空間的地址范圍,這樣,在系統(tǒng)中就存在了另一種與存儲(chǔ)地址無關(guān)的IO地址,CPU也必須具有專用與輸入輸出操作的IO指令(IN、OUT等)和控制邏輯。獨(dú)立編址下,地址總線上過來一個(gè)地址,設(shè)備不知道是給IO端口的、還是給存儲(chǔ)器的,于是處理器通過MEMR/MEMW和IOR/IOW兩組控制信號來實(shí)現(xiàn)對I/O端口和存儲(chǔ)器的不同尋址。如,intel 80x86就采用單獨(dú)編址,CPU內(nèi)存和I/O是一起編址的,就是說內(nèi)存一部分的地址和I/O地址是重疊的。

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

          對于x86架構(gòu)來說,通過IN/OUT指令訪問。PC架構(gòu)一共有65536個(gè)8bit的I/O端口,組成64K個(gè)I/O地址空間,編號從0~0xFFFF,有16位,80x86用低16位地址線A0-A15來尋址。連續(xù)兩個(gè)8bit的端口可以組成一個(gè)16bit的端口,連續(xù)4個(gè)組成一個(gè)32bit的端口。I/O地址空間和CPU的物理地址空間是兩個(gè)不同的概念,例如I/O地址空間為64K,一個(gè)32bit的CPU物理地址空間是4G。如,在Intel 8086+Redhat9.0 下用“more /proc/ioports”可看到:


          上一頁 1 2 3 4 下一頁

          評論


          相關(guān)推薦

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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();