ARM9存儲器結(jié)構(gòu)總結(jié)_第1頁
ARM9存儲器結(jié)構(gòu)總結(jié)_第2頁
ARM9存儲器結(jié)構(gòu)總結(jié)_第3頁
ARM9存儲器結(jié)構(gòu)總結(jié)_第4頁
ARM9存儲器結(jié)構(gòu)總結(jié)_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、ARM存儲器結(jié)構(gòu)ARM存儲器:片內(nèi)Flash、片內(nèi)靜態(tài)RAM、片外存儲器 映射就是一一對應(yīng)的意思。重映射就是重新分配這種一一對應(yīng)的關(guān)系。 我們可以把存儲器看成一個具有輸出和輸入口的黑盒子。輸入量是地址,輸出的是對應(yīng)地址上存儲的數(shù)據(jù)。當(dāng)然這個黑盒子是由很復(fù)雜的半導(dǎo)體電路實現(xiàn)的,具體的實現(xiàn)的方式我們現(xiàn)在不管。存儲單位一般是字節(jié)。這樣,每個字節(jié)的存儲單元對應(yīng)一個地址,當(dāng)一個合法地址從存儲器的地址總線輸入后,該地址對應(yīng)的存儲單元上存儲的數(shù)據(jù)就會出現(xiàn)在數(shù)據(jù)總線上面。 普通的單片機把可執(zhí)行代碼和數(shù)據(jù)存放到存儲器中。單片機中的CPU從儲器中取指令代碼和數(shù)據(jù)。其中存儲器中每個物理存儲單元與其地址是一一對應(yīng)而且

2、是不可變的,UGG boots。 而ARM比較復(fù)雜,ARM芯片與普通單片機在存儲器地址方面的不同在于:ARM芯片中有些物理存儲單元的地址可以根據(jù)設(shè)置變換。就是說一個物理存儲單元現(xiàn)在對應(yīng)一個地址,經(jīng)過設(shè)置以后,這個存儲單元就對應(yīng)了另外一個地址了(這就是后面要說的重新映射)。例如將0x地址上的存儲單元映射到新的地址0x上。CPU存取0x就是存取0x上的物理存儲單元。(隨便舉的例子為了說明道理,沒有實際意義) 存儲器重新映射(Memory Re-Map) 存儲器重新映射是將復(fù)位后用戶可見的存儲器中部分區(qū)域,再次映射到其他的地址上。 存儲器重新映射包括兩個方面:1、Boot Block重新映射(關(guān)于B

3、oot Block的相關(guān)內(nèi)容看我博客中的另一篇文章)。2、異常(中斷)向量重新映射 Boot Block重新映射:本來Boot Block在片內(nèi)Flash的最高8KB,但是為了與將來期間相兼容,生產(chǎn)商為了產(chǎn)品的升級換代,在新型芯片中增加內(nèi)部Flash容量時,不至于因為位于Flash高端的Boot Block的地址發(fā)生了變化而改寫其代碼,整個Boot Block都要被重新映射到內(nèi)部存儲器空間的頂部,即片內(nèi)RAM的最高8KB。(地址為:0x7FFFE0000x7FFFFFFF) 異常(中斷)向量重新映射:本來中斷向量表在片內(nèi)Flash的最低32字節(jié),重新映射時要把這32個字節(jié)再加上其后的32個字節(jié)

4、(后面這32個字節(jié)是存放快速中斷IRQ的服務(wù)程序的)共64個字節(jié)重新映射(地址為:0x0xF)重新映射到的地方有三個:內(nèi)部Flash高端的64字節(jié)空間、內(nèi)部RAM低端的64字節(jié)空間和外部RAM低端的64字節(jié)空間,再加上原來的內(nèi)部Flash低端的64字節(jié)空間,異常向量一共可以在四個地方出現(xiàn)。為了對存儲器映射進行控制,處理器設(shè)置了存儲器映射控制寄存器MEMMAP,其控制格式如下圖所示: 注:1、當(dāng)MEMMAP1:0=00時是映射到內(nèi)部Flash高端,同內(nèi)部Flash高端的Boot Block 一起又被 映射到了內(nèi)部RAM高端 2、當(dāng)MEMMAP1:0=01時相當(dāng)于沒有重新映射,異常向量表在內(nèi)部Fl

5、ash低端 3、當(dāng)MEMMAP1:0=10時映射到了內(nèi)部RAM的低端 4、當(dāng)MEMMAP1:0=11時映射到了外部RAM低端 首先說一下,S3C2440 存儲器空間并不包括NAND FLASH ,NAND FLASH只是一個外設(shè)而已。 S3C2440存儲器控制器的尋址范圍是00x3fff ffff,共1G。這1G空間分為8個BANK,BANK0BANK7。 在產(chǎn)品開發(fā)階段,一般使用BANK0控制NOR FLASH,BANK6控制SDRAM;對于成品,則會去掉NOR FLASH,而將固件放在NAND FLASH上,SDRAM不變。 對于代碼存儲,如NOR FLASH,是沒有必要訪問到具體字節(jié);而

6、對于SDRAM,因為可能保存有字節(jié)變量,必須得支持訪問到字節(jié)。這里就說一下,在32位總線寬度下,存儲器控制器是如何訪問SDRAM的字節(jié)的。 比如,使用兩片16位的SDRAM組成32位寬度的數(shù)據(jù)總線。S3C2440的地址線A0、A1不再使用,S3C2440提供了DQM0、 DQM1、 DQM2和 DQM3來選通某個字節(jié)(猜想: DQM0、 DQM1、 DQM2和 DQM3是由 A0、A1經(jīng)內(nèi)部譯碼器而得 ,這樣可以節(jié)省外部元件)。再把SDRAM的行、列地址展開,再加上 SDRAM BANK的選擇線,其實SDRAM就完全可以看做一片SRAM了 。1、S3C2440A的存儲器管理器提供訪問外部存儲器

7、的所有控制信號2、27位地址信號、32位數(shù)據(jù)信號、8個片選信號、以及讀/寫控制信號等3、總共有8個存儲器bank(bank0bank7) bank0-bank5為固定128MB; bank6和bank7的容量可編程改變,可以是2、 4、8、16、32、64、 128MB;最大共1GB4、bank0可以作為引導(dǎo)ROM其數(shù)據(jù)線寬只能是16位和32位,其它存儲器的數(shù)據(jù)線寬可以是8位、16位和32位5、7個固定存儲器bank(bank0-bank6)起始地址bank7的開始地址與bank6的結(jié)束地址相連接,但是二者的容量必須相等6、所有存儲器bank的訪問周期都是可編程的7、支持SDRAM的自刷新和掉

8、電模式8、支持大小端(軟件選擇)我們知道,在32位機器上linux操作系統(tǒng)中的進程的地址空間大小是4G,其中0-3G是用戶空間,3G-4G是內(nèi)核空間。其實,這個4G的地址空間是不存在的,也就是我們所說的虛擬內(nèi)存空間。也就是說,我們不論我們運行a.out程序多少次這些地址都是一樣的。我們知道,linux操作系統(tǒng)每個進程的地址空間都是獨立的,其實這里的獨立說得是物理空間上得獨立。當(dāng)一個程序被執(zhí)行時,該程序的內(nèi)容必須被放到進程的虛擬地址空間,對于可執(zhí)行程序的共享庫也是如此??蓤?zhí)行程序并非真正讀到物理內(nèi)存中,而只是鏈接到進程的虛擬內(nèi)存中。當(dāng)一個可執(zhí)行程序映射到進程虛擬地址空間時,一組vm_area_s

9、truct數(shù)據(jù)結(jié)構(gòu)將被產(chǎn)生。每個vm_area_struct數(shù)據(jù)結(jié)構(gòu)表示可執(zhí)行印象的一部分;是可執(zhí)行代碼,或是初始化的數(shù)據(jù),以及未初始化的數(shù)據(jù)等。一、S3C2440存儲控制器 如果大家寫過S3C2440的ARM裸機程序都應(yīng)該知道通常SDRAM的起始地址是0X,但是大家有沒有想過為什么呢?下面我將給大家做一個簡要的介紹。 查S3C2440的手冊可知S3C2440可尋址1G的地址范圍,但是S3C2440的地址線只有27根,理論上只能尋址2的27次方等于128M的地址范圍。于是S3C2440通過一個叫BANK的東東解決了這個問題。S3C2440引出了8根BANK線(對應(yīng)nGCS0 nGCS7),通過

10、這個8根線來選通和關(guān)閉不同的存儲器,這樣S3C2440最多就可以連接8個128M的存儲器,只要在某一時刻只選通一個BANK就可以實現(xiàn)1G的尋址空間每個BANK有個地址,對該BANK地址的訪問實際上就是選通該BANK,于是ARM核只要發(fā)出一個地址,然后S3C2440的儲存控制器只要把該地址解釋成兩部分:一部分是BANK地址一部分是連接到該BANK存儲器內(nèi)部的地址就可以訪問了。 而作為32位的CPU,可以使用的地址范圍理論上可以達到2的32次方等于4G,除去上述的1G地址空間,還有一部分是CPU內(nèi)部寄存器的地址,剩下的地址空間沒有使用。 下面我們來看到S3C2440存儲器的地址空間分布圖左邊的是表

11、示CPU從NOR FLASH啟動時的地址空間圖,右邊是CPU從NAND FLASH啟動時的地址空間圖。從圖中可以看出SDRAM接在BANK6上面,地址為0X,這就解釋了開始最開始的那個問題。問題又來了為什么CPU從NAND和NOR啟動時地址空間不同?這是因為NOR是線性結(jié)構(gòu),跟普通的內(nèi)存差不多,它接在BANK0上。而NAND則是另外一種結(jié)構(gòu),S3C2440有專用的NAND控制器和地址線來連接,它不能接在BANK0上。CPU啟動時必定從0地址開始執(zhí)行程序,而從NAND啟動時,0地址沒有存儲器,那CPU怎么辦呢?于是就出現(xiàn)了一種叫“起步石”(stepping stone)的東東,它是S3C2440

12、內(nèi)部的一塊4K的存儲器,當(dāng)從NAND啟動時,0地址線會連接到起步石上面,同時CPU會通過內(nèi)部的硬件將NAND FLASH開始的4K數(shù)據(jù)復(fù)制到起步石里面。起步石里面的程序一般設(shè)計為對SDRAM進行初始化,然后將NAND里面的部分程序復(fù)制到SDARM,然后跳到SDRAM開始執(zhí)行程序。所以當(dāng)做U-BOOT移植使其支持從NAND的啟動時,需要對NAND的前4K程序做處理。 下面我們再來看看S3C440存儲控制器一般所接外設(shè)的訪問地址和部分寄存器的訪問地址二、S3C2440MMU1.MMU的作用 我們再第一部分討論的全部都是物理地址,注意不要與這部分要將的虛擬地址給混淆起來。 內(nèi)存管理單元(Memory

13、 ManagerUnit)簡稱MMU。它負責(zé)將虛擬地址轉(zhuǎn)換成物理地址,然后傳給上部分介紹的存儲管理器進行尋址。 現(xiàn)代的多用戶多進程操作系統(tǒng)通過MMU使各個用戶進程都有自己的獨立的地址空間:地址映射功能使得每個進程擁有“看起來”一樣的地址空間,而內(nèi)存訪問權(quán)限的檢查可以保護每個進程所用的內(nèi)存不會被其他進程破壞。 我來打個蹩腳的例子。甲同學(xué)(進程甲)去一個圖書管理員那兒去借名為“內(nèi)存”的一本書,說他7點鐘要用。圖書管理員給甲同學(xué)一個牌子上面寫著哪個層樓房哪個房間有這本書,不過這塊牌子只能7點鐘去取書,且只能借三個小時(權(quán)限),而乙同學(xué)同樣要借這本書不過是12點,圖書館同樣給乙同學(xué)一塊牌子,不同的時這

14、塊牌子只能12點鐘去取書也只能借三個小時。結(jié)果是甲乙同學(xué)都借到了這本書,他們都感覺擁有了這本書,在他們擁有這本書的期間不會被其他同學(xué)打擾。實際上這里的同學(xué)就代表進程,圖書管理員代表是內(nèi)核,牌子代表的是虛擬地址,書代表實際的內(nèi)存,而MMU完成的工作就是拿到同學(xué)的牌子幫同學(xué)找到書的過程。 虛擬地址最終要轉(zhuǎn)成物理地址才能讀寫實際的數(shù)據(jù),這通過將虛擬地址空間、物理地址空間劃分為一個同樣大小的一塊塊小空間,然后為著兩類小空間建立映射空間,有可能多塊虛擬地址映射到同一塊物理地址空間,或者有些虛擬地址空間映射具體物理地址空間上去。啟動MMU后,CPU對外發(fā)出虛擬地址,然后MMU將虛擬地址轉(zhuǎn)成物理地址再進行訪

15、問。2.虛擬地址空間到物理空間的轉(zhuǎn)換過程 在ARM CPU中使用頁表的方式進行轉(zhuǎn)換。linux內(nèi)核一般使用兩級頁表的方式。頁表是個什么東東,他就像我們的書上的目錄,有主目錄,次目錄。當(dāng)我們要找一個知識點的時候先找到主目錄,然后再找到次目錄再找到相應(yīng)的知識點。每一個進程都會在內(nèi)存里面創(chuàng)建一個目錄,目錄的存放地址保存起來。當(dāng)需要訪問目錄時,就會將目錄放到CPU的一個專用寄存器里面,然后MMU讀取這個寄存器里面的值就會幫我們找到我們要訪問的物理地址。頁表是怎樣建立的呢?實際上它就是在內(nèi)存的一個地址內(nèi)存放了第一級目錄的內(nèi)存地址,然后在第一個級的目錄的內(nèi)存內(nèi)又存放了實際的物理地址。 椐了解 NOR FL

16、ASH 是容量小,速度快,穩(wěn)定性好,適合做程序存儲器。NAND FLASH 總?cè)萘看?,適合做數(shù)據(jù)存儲器是不能從NAND FLASH啟動的,NAND FLASH是的讀寫時序是不能直接有ARM硬件產(chǎn)生的,要讀寫NAND FLASH是要通過程序來實現(xiàn)的,很明顯能看出來的就是NAND FLASH只有8個數(shù)據(jù)、地址復(fù)用的數(shù)據(jù)地址接口2410/2440可以直接從NAND FLASH啟動的,因為它把NAND前面的4K映射到了RAM的空間NOR FLASH地址線和數(shù)據(jù)線分開,來了地址和控制信號,數(shù)據(jù)就出來。NAND Flash地址線和數(shù)據(jù)線在一起,需要用程序來控制,才能出數(shù)據(jù)。通俗的說,就是光給地址不行,要先

17、命令,再給地址,才能讀到NAND的數(shù)據(jù)。而且都是在一個總線完成的。結(jié)論是:ARM無法從NAND直接啟動。除非裝載完程序,才能使用NAND Flash.裝載程序只能從mask rom 或者Nor flash.三星的2410可以從NF啟動程序,它會把第一塊的前4KB復(fù)制到內(nèi)部SRAM中,然后從SRAM執(zhí)行,也就是說,你需要編寫一個長度小于4K的引導(dǎo)程序,作用是將主程序拷貝到SDRAM中運行(NF地址不是線性的,程序不能直接運行,必須拷貝到線性RAM中) 從Nand Flash啟動U-BOOT的基本原理前4K的問題如果S3C2410被配置成從Nand Flash啟動(配置由硬件工程師在電路板設(shè)置),

18、 S3C2410的Nand Flash控制器有一個特殊的功能,在S3C2410上電后,Nand Flash控制器會自動的把Nand Flash上的前4K數(shù)據(jù)搬移到4K內(nèi)部RAM中,并把0x設(shè)置內(nèi)部RAM的起始地址,CPU從內(nèi)部RAM的0x位置開始啟動。這個過程不需要程序干涉。程序員需要完成的工作,是把最核心的啟動程序放在Nand Flash的前4K中。啟動程序的安排由于Nand Flash控制器從Nand Flash中搬移到內(nèi)部RAM的代碼是有限的,所以在啟動代碼的前4K里,我們必須完成S3C2410的核心配置以及把啟動代碼(U-BOOT)剩余部分搬到RAM中運行。u-boot源碼不支持從na

19、nd flash啟動,可是s3c2410支持從nand flash啟動,開發(fā)板(sbc-2410x)加電后s3c2410將nand flash的前4k(保存有u-boot的部分功能-拷貝功能-把nand flash中的內(nèi)容拷貝到SDRAM)拷貝到sram(s3c2410芯片內(nèi)的sram)。這就需要修改u-boot源碼,增加u-boot的功能: 使u-boot在得到執(zhí)行權(quán)后能夠?qū)⑵渥陨砜截惖介_發(fā)板上SDRAM中,以便處理器能夠執(zhí)行u-boot。Nand Flash的命令、地址、數(shù)據(jù)都通過I/O口發(fā)送,管腳復(fù)用,這樣做的好處是,可以明顯減少NAND FLASH的管腳數(shù)目,將來如果設(shè)計者想將NAND FLASH更換為更高密度、更大容量的,也不必改動電路板。 Linux將4GB的線性地址空間劃分成兩部分,從0x到0xBFFFFFFF共3GB空間作為用戶空間由用戶進程獨占,這部分線性地址空間并沒有固定映射到物理內(nèi)存空間上;從0xC到0xFFFFFFFF的第4GB線性地址空間作為內(nèi)核空間,在嵌入式系統(tǒng)中,這部分線性地址空間除了映射物理內(nèi)存空間之外還要映射處理器內(nèi)部外設(shè)寄存器空間等I/O空間。0xChigh_memory之間的內(nèi)核邏輯地址空間專用來固定映射系統(tǒng)中的物理內(nèi)存,也就是說0xChigh_memory之間空間大小與系統(tǒng)的物理內(nèi)存空間大小是相同的(當(dāng)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論