娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年02月09日(星期日)

正在發(fā)生

2021年02月09日 | 基于S3C6410的ARM11學(xué)習(xí)(十五) MMU來了

發(fā)布者:快樂心跳 來源: eefocus關(guān)鍵字:S3C6410  ARM11  MMU 手機看文章 掃描二維碼
隨時隨地手機看文章

如今,已經(jīng)是到了main的世界了。下面就要來體驗ARM11的MMU,這個東西在STM32中是沒有的。之前在核心初始化過程中,是將MMU功能給關(guān)閉的。那是因為那個時候,操作的都是物理地址,所以需要將MMU關(guān)閉。


 MMU,內(nèi)存管理單元。主要是有兩個作用:


1、  將虛擬地址轉(zhuǎn)化為物理地址

2、  內(nèi)存的訪問權(quán)限管理

         clip_image002

上面這個圖就說明了MMU的作用。


有三個任務(wù)在運行,運行的地址都是0x400000,如果不進行處理,這肯定是不行的。所以加入了MMU,MMU其實就是一個頁表。將虛擬地址通過查表的方式,對應(yīng)到物理地址去。雖然三個任務(wù)的運行地址都是0x400000,但是這個地址是虛擬地址,在頁表中,將每個任務(wù)的虛擬地址對應(yīng)到不同的物理地址,這樣,就實現(xiàn)了各個任務(wù)雖然是同一個虛擬地址,但是在不同的物理地址中運行。


所以要使用MMU,就首先要建立這個頁表,這個頁表是誰建立的,就是我們自己建立的。建立虛擬內(nèi)存對應(yīng)的物理內(nèi)存的頁表,這樣,MMU才能從頁表中去找到虛擬地址對應(yīng)的物理地址。


MMU有一級轉(zhuǎn)換和二級轉(zhuǎn)換,其實就是查幾次表。對于一級轉(zhuǎn)換,就是只查一次頁表,就確定了物理地址。這個在S3C6410中,方式是段映射。對于二級轉(zhuǎn)換,就要查兩次頁表或者三次,才能確定物理地址,這個在S3C6410中。有兩種方式,一種細(xì)頁方式,一種粗頁方式。這兩種的區(qū)別就是每一頁對應(yīng)的大小不一樣而已。

         clip_image004

上圖是一級轉(zhuǎn)換描述符。通過虛擬地址的[31:20],找到對應(yīng)的轉(zhuǎn)換描述符,這個轉(zhuǎn)換描述符其實就是一個存在ram中的32位的一個數(shù)據(jù)。通過判斷這個描述符的最后兩位,判斷是什么轉(zhuǎn)換。如果是段轉(zhuǎn)換,就按照段轉(zhuǎn)換的格式去轉(zhuǎn)化物理地址。如果是頁轉(zhuǎn)換,就在去找第二級的頁表,然后再按照二級頁表的格式去轉(zhuǎn)化物理地址。


首先看下一級轉(zhuǎn)換頁表的段轉(zhuǎn)換。

clip_image006

一級頁表總包含4096個轉(zhuǎn)換描述符。因為是通過虛擬地址的31:20位尋址的。12位能夠表示的數(shù)最大是4096,所以說一級頁表總共有4096個轉(zhuǎn)換符。頁表的首地址就是TTB,這個地址是很重要的,因為有了這個地址才能知道頁表是存在什么地方的,才能通過偏移找到對應(yīng)的描述符。所以,是有一個寄存器來保存這個地址的,這個寄存器就在CP15的c2寄存器。


通過虛擬地址的高12位偏移,找到頁表中的對應(yīng)描述符,判斷描述符的最后兩位,確定是什么轉(zhuǎn)換。10的話就表示是段轉(zhuǎn)換。


判斷是段轉(zhuǎn)換后,將描述符的高12位取出,這個就是物理的基地址,在和虛擬地址的后20位拼接,就得到對應(yīng)的物理地址。


對于段轉(zhuǎn)換,每一個段代表物理的1MB地址。為什么是1MB了。因為總共是有4096個描述符,而ARM11是32位的,所以能夠表示的空間是4G,這樣除下來,不就每一段就表示1MB空間了。

        

二級轉(zhuǎn)換的原理也是一樣的。只不過需要多查幾次表。這里就大致畫個細(xì)頁的轉(zhuǎn)換圖。

clip_image008

就是通過不斷的查表,然后得到物理地址。


目前學(xué)習(xí)是基于段轉(zhuǎn)換的學(xué)習(xí),所以下面就說下段轉(zhuǎn)換。先來看看一級頁表描述符。

clip_image010

最后兩位來表示是什么轉(zhuǎn)換。10是段轉(zhuǎn)換。

B:表示是否使能write buffer

C:  表示是否開啟cache

XN:

clip_image012

Domain: 用來說明該段屬于哪一個域,ARM11共有16個域,每個域可以設(shè)定不同的權(quán)限。將段分配到某個域,就使這段的權(quán)限和設(shè)定的域權(quán)限一樣。

P:表示段區(qū)間有ECC,ARM11不支持,所以這一位為0.

AP:訪問權(quán)限,這個配合域,說明該段地址的訪問權(quán)限。

TEX:這個目前不是很清楚作用。

APX: 提供額外的訪問權(quán)限。

S: 表示區(qū)域是否共享。0不共享,1共享。這個手冊上說,是為了多核使用的。目前用不到,設(shè)置為0.

nG:

clip_image014

NS:

Section base address:這個就是段的物理地址的高12位。


下圖是訪問權(quán)限

clip_image016

為了讓空間能夠讀寫,所以APX和AP[1:0]的值設(shè)置為011.


這里設(shè)置的訪問權(quán)限,還要配合設(shè)置的域。ARM11支持16個域,由CP15的C3來設(shè)置。在ARM11核手冊195頁,有說明:

clip_image018

寄存器的每兩個位對應(yīng)一個區(qū)域,設(shè)置不同的值,對訪問權(quán)限也不一樣。設(shè)置為00或10的話,以訪問就產(chǎn)生異常,01的話,需要檢查MMU中設(shè)置的權(quán)限。設(shè)置為11,就是不進行訪問權(quán)限的判斷。都認(rèn)為是可以訪問的。


這里為了簡單,通通設(shè)置為11。所以這個寄存器的值就是0xffffffff。


下面就要進行程序的設(shè)計了。

第一步,就是建立頁表。都使用段映射的方式,那么就要將段映射的描述符寫入到相應(yīng)的內(nèi)存中去。


首先將頁表放在ddr的第一個位置,也就是0x50000000。所以需要將這個地址寫入到TTB中。


這次就通過虛擬地址實現(xiàn)燈閃爍,所以需要建立GPIO寄存器的虛擬地址到物理地址映射。


其次,開啟MMU后,使用的就是虛擬地址了,所以還要建立程序段的頁表,不然一旦開啟MMU,CPU去取指令,這個時候發(fā)出的就是虛擬地址,但是又沒有建立虛擬地址到物理地址的映射表。這樣的話,就取不到指令了,程序就崩潰了。所以還需要對代碼區(qū)建立映射頁表。代碼區(qū)的映射就是將虛擬地址直接轉(zhuǎn)換為物理地址使用。


先確定使用GPIO的兩個寄存器地址

clip_image020

就更改前面8位的值。下面就要將這個地址給映射到0x7F000000區(qū)域去。

clip_image022

代碼也是比較簡單的。首先申明一個ttb指針,這個指針就指向一級表的基地址,也就是ddr的首地址,0x50000000。然后再申明兩個變量,一個表示虛擬地址,一個表示物理地址。


根據(jù)前面的一級段描述符格式,往對應(yīng)的內(nèi)存單元寫入數(shù)據(jù)即可。段描述符的高12位是物理地址的高12位,所以首先有一個物理地址和0xFFF00000與的操作,將物理地址的高12位寫入到段描述符中。

后面的位就進行相應(yīng)的配置即可。看看這個定義的宏。

clip_image024

設(shè)置為訪問權(quán)限是11,也就是不進行訪問權(quán)限的檢查。將域設(shè)置為0。CACHE和write BUFFER都給關(guān)掉。因為這只是對一個寄存器的操作,沒有必要使用CACHE和write BUFFER。


這里用宏定義的話,程序的易讀性好好得多,當(dāng)然也可以直接給這個描述符賦值,不用這種宏定義的方式,但是這樣程序易讀性就差了,因為要去查手冊才能知道你賦這個值有什么用。

 

這里使用*(ttb + (vaddr >> 20))來對對應(yīng)的頁描述符進行賦值。在一級頁表中,是通過虛擬地址的高12位來決定偏移是多少。高12位也就是位移20位,所以這里就是加上虛擬地址右移20位的值,也就是取出高12位的值。注意,這里是指針操作,假設(shè)這個時候虛擬地址的高12位值是5,那么寫的地址不是0x50000005,而是0x50000014。因為指針的數(shù)據(jù)類型是long型,4個字節(jié),所以加1,地址就會加4,加5,地址就會加5*4=20。


這樣,就建立好了GPIO的頁表。訪問虛擬地址0xc7000000,也就是訪問物理地址0x7f000000。整個段空間是1Mb。

接著就要建立代碼區(qū)的頁表。


這個時候,代碼已經(jīng)是在內(nèi)存中運行的了。所以,直接將內(nèi)存的所有地址空間進行映射,空間是64MB大小。

clip_image026

這里使用的宏

clip_image028

其實就是多一個開啟CACHE和WRITE BUFFER。


內(nèi)存映射是映射一片區(qū)域,從0x50000000地址開始到0x54000000這64M的虛擬地址給映射到0x50000000地址開始到0x54000000這64M物理地址上去。這樣,即使使用虛擬地址去取ddr中數(shù)據(jù),也是能夠取到的。


因為一個段是映射的1MB空間,所以總共需要64個段,十六進制也就是0x40。所以在while里面判斷是虛擬地址要小于0x54000000。再者,每一個段表示1MB空間,所以虛擬地址和物理地址都要加1MB。也就是0x100000。


這樣,就將頁表給建立好了。如果還需要使用其他地址區(qū)域,就都得為這些區(qū)域建立映射表。

下面就要來開啟MMU了。


之前說過,有一個TTB是很重要的,保存的是一級頁表的首地址。首先就應(yīng)該先要設(shè)置這個TTB。往CP15的C2寄存器里面寫入這個值就好了,因為這個寄存器就是保存的TTB。

然后是設(shè)置域的權(quán)限,將域的權(quán)限設(shè)置為11,不進行訪問權(quán)限檢查。設(shè)置CP15的c3寄存器。


最后打開MMU。設(shè)置CP15的c1寄存器組的c0。


是對CP15進行操作,用C語言是實現(xiàn)不了的,使用嵌入?yún)R編。

clip_image030

這樣,就設(shè)置好了MMU,并打開了MMU。之后使用的地址都是虛擬地址了。而且該虛擬地址必須是要在頁表中建立的,不然的話,就會產(chǎn)生異常。


后面使用虛擬地址來讓燈閃爍。

clip_image032

代碼和之前代碼一樣,不過只是地址變量,寄存器使用的地址是虛擬地址了,也不是物理地址了。

clip_image034

總結(jié)一下,MMU的作用其實就是地址的轉(zhuǎn)換,將虛擬地址轉(zhuǎn)換為物理地址。不過在bootloader開發(fā)階段,這個MMU是不使用的。因為在這階段,要配置大量的寄存器來對硬件進行一些初始化,如果使用MMU的話,就要對這些寄存器的地址都要建立頁表,使CPU能夠訪問到。這就比較麻煩了。不過在跑操作系統(tǒng)的時候,這個又是很需要的。這讓內(nèi)存管理變得方便。進程都使用虛擬地址,操作系統(tǒng)對這些虛擬地址進行映射到具體的物理地址上去,就感覺每個進程都是可以訪問到4G空間的。


對比STM32:

STM32沒有MMU,只有MPU,對內(nèi)存保護。相當(dāng)于實現(xiàn)了MMU的一半功能。

關(guān)鍵字:S3C6410  ARM11  MMU 引用地址:基于S3C6410的ARM11學(xué)習(xí)(十五) MMU來了

上一篇:基于S3C6410的ARM11學(xué)習(xí)(十七) 串口走起來
下一篇:基于S3C6410的ARM11學(xué)習(xí)(十四) 終于到main了

推薦閱讀

記者從省發(fā)改委獲悉,2017年鄭州市新能源汽車產(chǎn)量達到3.1萬輛,同比增長17.1%。?據(jù)介紹,鄭州市共有汽車及零部件規(guī)模以上企業(yè)150余家,其中整車企業(yè)6家,分別為宇通客車、上汽乘用車鄭州分公司、東風(fēng)日產(chǎn)鄭州分公司、鄭州日產(chǎn)、海馬汽車、少林客車。2017年,鄭州市汽車產(chǎn)量54.1萬輛,占全省產(chǎn)量的96.5%;實現(xiàn)主營業(yè)務(wù)收入1102.5億元,同比增長3%。宇通...
無論你接受與否,自動駕駛時代離我們已經(jīng)越來越近。而L4甚至L5自動駕駛技術(shù)普及之后,車內(nèi)就沒有了真正意義上的駕駛員——冰冷的汽車在路上“橫沖直撞”,讓道路上尚未進化到自動駕駛時代的行人多少還是有些恐懼。  作為自動駕駛技術(shù)的載體,自動駕駛汽車必須同人類之間建立足夠的互信,才能夠被周圍大眾所接受,從而在共有空間內(nèi)“和諧共處”。為了解決...
轉(zhuǎn)換速率:每秒鐘采樣的次數(shù)。常用單位: SPS(每秒次) KSPS(每秒千次) MSPS(每秒百萬次)。越快越好。轉(zhuǎn)換精度:轉(zhuǎn)換結(jié)果的有效位數(shù)(二進制)。單位:位AVR的片上ADC:最高轉(zhuǎn)換速率:15kSPS最高轉(zhuǎn)換精度:10位AVR片上ADC的特點:10 位 精度0.5 LSB 的非線性度± 2 LSB 的絕對精度65 - 260 μs 的轉(zhuǎn)換時間最高分辨率時采樣率高達15 kS...
在學(xué)c語言的時候,經(jīng)典的hello world程序,是通過printf函數(shù)實現(xiàn)了。有了這個函數(shù),就可以隨意的向屏幕打印數(shù)據(jù)了。在嵌入式中,其實也是可以用printf函數(shù)的,不過需要稍微麻煩點的移植。畢竟,在嵌入式中,所有實現(xiàn)的都要自己來弄,不在向PC程序開發(fā)一樣,很多庫函數(shù),操作系統(tǒng)已經(jīng)搞好,就用就行了。首先,是要去下載能實現(xiàn)printf的源代碼。這里用的是...

史海拾趣

問答坊 | AI 解惑

倒車?yán)走_芯片(GM3101)的PDF中文資料

GM微電子推出面向倒車?yán)走_應(yīng)用、采用ASIC設(shè)計的GM3101專用芯片。該芯片能有效降低倒車?yán)走_產(chǎn)品開發(fā)的技術(shù)門檻,顯著提高產(chǎn)品的靈敏度、可靠性和穩(wěn)定性,可完全替代傳統(tǒng)單片機方案,其成本僅相當(dāng)于單片機方案的60%。能讓你迅速的推出功能完善、性能 ...…

查看全部問答∨

樓主老大加油

老大加油呀!有什么資料大家共享呀!!!相當(dāng)感謝!!! kongxiangdongkxd@163.com…

查看全部問答∨

LED接法問題!

最近想把模型車 接上LED燈 總計4個白色LED等,需要怎么接?用9V的電池,需要接電阻? 本人新手,有不對的請勿噴。:Q…

查看全部問答∨

請問把2GHz的信號變頻到500GHz的系統(tǒng)框圖如何實現(xiàn)啊??

發(fā)射機要把2GHz的信號變頻到500GHz,接收機又要把500GHz下變頻到2GHz。 但是老師說:沒有這么高頻率的混頻器和倍頻器,叫我另外想辦法。 想不出來,急啊! 請求各位幫助,萬分感謝!!…

查看全部問答∨

求助SD卡

本人想用SD卡,哪位好心的大俠有IAR 調(diào)試過的SD卡程序,請發(fā)一份啊。跪求。。。。   hkwelding@126.com…

查看全部問答∨

matlab中二極管 模型

 這是matlab中二極管的模型,請問并聯(lián)的這個電阻的阻值是大還是小。。。…

查看全部問答∨

91無線發(fā)布2012年第二季度的《移動應(yīng)用發(fā)展趨勢報告(Android版)》

91無線移動應(yīng)用數(shù)據(jù)研究中心近期發(fā)布了2012年第二季度的《移動應(yīng)用發(fā)展趨勢報告(Android版)》,數(shù)據(jù)統(tǒng)計時間為2012年4月至2012年6月。報告顯示,截止2012年6月底,91無線上線總應(yīng)用數(shù)超過48萬,下載量約為21億次。本季度進入TOP200應(yīng)用數(shù)最多的小 ...…

查看全部問答∨

keil4在編譯時出現(xiàn)了空間不足

有哪位大神幫忙解決一下這個問題 …

查看全部問答∨
小廣播
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 白玉县| 祁连县| 巴彦淖尔市| 延边| 库尔勒市| 巴东县| 临清市| 常宁市| 彭山县| 黄龙县| 平邑县| 买车| 蓝山县| 浙江省| 株洲市| 安塞县| 衡南县| 甘洛县| 双辽市| 望谟县| 柳林县| 革吉县| 汪清县| 甘孜县| 顺平县| 秭归县| 吴旗县| 化隆| 天全县| 金平| 汶上县| 巫溪县| 永清县| 乌海市| 原平市| 福州市| 德保县| 乐都县| 额敏县| 侯马市| 泾源县|