mmu以及頁表 UBOOT(1)
mmu的主要作用就是實現程序隔離
主要功能是
1 虛擬地址到實體地址的轉換
訪問某個程序1的虛擬地址A。mmu轉換為實體地址B訪問。
訪問某個程序2的虛擬地址A。mmu轉換為實體地址C的訪問。
保證不同空間上的同一個虛擬地址訪問對映到不同的實體記憶體。
2 記憶體許可權控制的實現
在頁表項中將某些不需要的bit項變成訪問控制位,控制記憶體的訪問。
在ARM中使用CP15協處理來控制MMU。
CR0 (有兩個物理暫存器) 分別用於記錄ARM的架構以及CACHE型別等等資訊
CR1 控制暫存器,控制各種行為,包括開啟關閉 MMU ,CACHE控制,控制異常向量的位置(0X0還是0XFFFF0000)
CR2 一級頁表基地址
CR3 域的訪問許可權
...
....
以及其他CRx暫存器
UBOOT 部分:
下面的主要參考樹莓派的BCM2835晶片,arm的架構是arm1176。
參考的手冊是
arm1176jzfs.pdf ARM手冊
BCM2835-ARM-Peripherals.pdf 晶片手冊
MMU提供4K 16K 1M 16M段管理
首先來看以1M作為對映。
每一個頁表條目(4位元組)代表的每一個頁面是1M大小,為了表示4GB的空間,所以一共需要 4096MB/1MB * 4位元組頁表條目=4KB的大小。
也就是從page_table開始的4KB大小的記憶體每四個位元組存放一個頁表條目,一共4096項,每一項代表1MB的空間。如下圖
(對於arm1176jzfs CP15的c1暫存器的bit23控制AP位,AP位開,地址轉換相容ARMV4 V5,AP關,地址轉換採用ARMV6架構 )
具體的每個條目的每一項參看晶片手冊比較好,這裡只講兩個重要的。
[0:1] 表示當前條目的型別 00表示無效對映 10表示段頁1M或者16M,具體是16M還是1M由第18bit控制
[2:3]表示緩衝快取型別
[11:10] 表示當前頁面的訪問許可權
[31:20] 表示這個條目對映的 物理空間的記憶體地址,因為條目是1M為單位,因此後20bit一定是0,恰好可以用來做一些標記位
用樹莓派uboot初始化的時候頁表操作來演示,如果開啟MMU,則呼叫了
for (i = 0; i < 4096; i++)
set_section_dcache(i, DCACHE_OFF);
執行第一次的初始化
其中set_section_dcache函式如下
void set_section_dcache(int section, enum dcache_option option)
{
u32 *page_table = (u32 *)gd->arch.tlb_addr;
u32 value = TTB_SECT_AP;//0XC00
/* Add the page offset */
//#define MMU_SECTION_SHIFT 20
value |= ((u32)section << MMU_SECTION_SHIFT);
/* Add caching bits */
value |= option;
/* Set PTE */
page_table[section] = value;
}
首先value=TTB_SEC_AP=0xC00
DCACHE_OFF =0x12=0b 1(4bit) 0(3bit) 0(2bit) 1(1bit) 0(0bit)
0x0000c12 0x0010c12 0x0020c12 0x0030c12 0x0040c12...... 0xFFE0c12 0xFFF0c12
一共4096項
設定完畢以後。又呼叫dram_bank_mmu_setup這次主要是將有效的記憶體設定為DCACHE_WRITEBACK
前面我們設定頁表的時候,一共設定了4GB大小的記憶體空間,但是這其中很多是無效或者其他IO空間。
比如樹莓派一共有512M記憶體,除去 64MB大小的GPU空間,那麼剩下448MB的記憶體,因此將這448M空間設定為DCACHE_WRITEBACK。
隨後直接開啟了MMU,這樣就進入了虛擬地址空間,因為實體地址和虛擬地址是一一對應的,因此不需要考慮程式碼重定位的問題。
對於1M段mmu 虛擬地址到實體地址的轉換。-
虛擬地址的[31:20]位存放一級頁表的入口index,[19:0]位存放段偏移;
-
從TTBR(translation table base register,協處理器CP15中的一個暫存器,用於存放一級頁表的基址)暫存器中獲取一級頁表的基址;
-
一級頁表基址+ VA[31:20] = 該虛擬地址對應的頁表描述符的入口地址;
-
頁表描述符的[31:20]位為該虛擬地址對應的物理段基址;
-
物理段基址+ VA[19:0]段偏移= 實體地址
比如當前的虛擬地址是 0X123ABCDE。
1 那麼0X123就是一級頁表的索引 ABCDE就是段內的偏移
2 取得c2暫存器,一級頁表的地址0XA0000000。
3 一級頁表的地址0XA0000000+VA[31:20](0X123)=0XA0000123(實體地址)
4 0XA0000ABC實體地址中得到 關於該段的四位元組描述 0X1230C12。 得到頁表描述的[31:20]為0X123
5 物理段基地址+va[19:0]偏移 得到真實訪問的實體地址 0X123+0XABCDEF得到最終的實體地址 0X123ABCDEF
實際上 虛擬地址和實體地址 是一樣的。
那既然虛擬地址和實體地址是一樣的,為什麼又要開啟MMU多此一舉呢?我認為可能是為了使用DCACHE和ICACHE功能,這樣能夠加速UBOOT的啟動和一些執行。
對於多級頁表,道理是差不多的。
在UBOOT裡面由於是一對一對映,所以就和訪問實體地址是一樣的。比如有一些IO地址,只需要直接訪問就可以了。
所以UBOOT裡面直接操作串列埠輸出是沒有問題的。
相關推薦
mmu以及頁表 UBOOT(1)
mmu的主要作用就是實現程序隔離 主要功能是 1 虛擬地址到實體地址的轉換 訪問某個程序1的虛擬地址A。mmu轉換為實體地址B訪問。 訪問某個程序2的虛擬地址A。mmu轉換為實體地址C的訪問。 保證不同空間上的同一個虛擬地址訪問對映到不同的實體記憶體。 2 記憶體許可權控
(十二)Hibernate中的多表操作(1):單向多對一
art 保存 int gen round t對象 情況 映射文件 拋出異常 由“多”方可知“一”方的信息,比如多個員工使用同一棟公寓,員工可以知道公寓的信息,而公寓無法知道員工的信息。 案例一: pojo類 public class Department {
09-hibernate單表操作(1)
hbm.xml ive eat ring sets () 16px bin 提交 1,單一主鍵 2,基本類型 3,對象類型 4,組件屬性 5,單表操作 單一主鍵 常用生成策略: assigned 有程序員生成(手工) native 由數據庫底層,如果是mysql是in
《 常見演算法與資料結構》符號表ST(1)——基本介紹
符號表(Symbol Table) 本系列文章主要介紹常用的演算法和資料結構的知識,記錄的是《Algorithms I/II》課程的內容,採用的是“演算法(第4版)”這本紅寶書作為學習教材的,語言是java。這本書的名氣我不用多說吧?豆瓣評分9.4,我自
[Android] 多Activity的建立註冊以及相互切換基礎(1)
今天學習了建立第二個Activity 以及從Main_Activity切換到Second_Activity 下面是關於這個過程的一個總結: 建立一個新的xml佈局檔案,(res>layout)寫好佈局類容建立一個新的Activity類(Class)(src>Se
Scala學習筆記之 --- Array、ArrayBuffer以及遍歷陣列(1)
Array 在Scala中,Array代表的含義與Java中類似,也是長度不可改變的陣列。此外,由於Scala與Java都是執行在JVM中,雙方可以互相呼叫,因此Scala陣列的底層實際上是Java陣列。例如字串陣列在底層就是Java的String[],整數陣
單鏈表相關(1)從尾到頭列印連結串列、刪除一個無頭連結串列的非尾結點
1、從尾到頭列印連結串列 2、刪除一個無頭連結串列的非尾結點 單鏈表結構以及Find函式參見 2016-1-2 13:56 發表部落格 void Print_T_to_H(SListNode*&am
Oracle筆記多表查詢(1)
本次預計講解的知識點 1、 多表查詢的操作、限制、笛卡爾積的問題; 2、 統計函式及分組統計的操作; 3、 子查詢的操作,並且結合限定查詢、資料排序、多表查詢、統計查詢一起完成各個複雜查詢的操作; 一、多表查詢的基本概念 在之前所使用的查詢操作之中,都是從一張表之中查詢出所
虛擬儲存器(1)——虛存概念及頁、頁表和地址翻譯基礎
一、前言 虛擬儲存器,感覺很難,至少說很複雜,裡面涉及到的東西也比較枯燥。當然,如果能徹底搞清楚,對繼續學習作業系統原理是百利無一害的。 玩C或C++的人,經常通過&a的方式獲取變數地址,並將其賦值給指標變數,也通常用printf打
關於MMU的頁表的理解 (轉)
MMU的主要軟體配置和控制模組有:頁表;轉換旁路緩衝器(TLB);域和訪問許可權;cache和寫緩衝器;CP15:c1控制暫存器;快速上下文切換擴充套件。 ARMMMU硬體採用2級頁表結構:一級頁表(L1)和二級頁表(L2) 一級頁表只有一個L1主頁表
uboot命令(1):mmc命令
當前 .com 設備 十六進制 mci rgs 開發平臺 通過 硬件 版權聲明 更新:2017-06-07博主:LuckyAlan聯系:[email protected]/* */聲明:吃水不忘挖井人,轉載請註明出處! 1 文章介紹 今天在進行Android分區
GitHub使用教程——(1)使用GitHub創建簡歷展示頁
git github"如果我比別人看得遠,那是因為我站在巨人的肩膀上"這是加利利的第一篇文章系統環境:CentOS6.6桌面版工具:VNC及Xshell流程: 創建倉庫位置——初始化倉庫——配置用戶名及郵箱——下載簡歷模板——編輯簡歷——GitHub上創建倉庫——上傳本地代碼到遠程倉庫——使用托管源
線性表及其實現(1)
結構 span 1.5 logs cnblogs 一元多項式 lin wid -s 線性表及其實現(1) 多項式的表示: 【例】一元多項式及其運算 一元多項式: 主要運算:多項式相加、相減、相乘等。 【分析】如何表示多項式? ? 多項式項數n
在STM32上實現NTFS之4:GPT分區表的C語言實現(1):主GPT表頭的實現
center mbr分區 sum 對齊 字節數 決定 容器 alt 水平 題外話:在荒廢了很久沒有更新之後……某日突然收到讀者的站內信!內容大體是詢問GPT分區表信息的讀取方式,筆者激動萬分之下,決定繼續解剖NTFS……其實GPT嚴格上不算是NTFS的內容, GPT和M
服務(1)====一個lamp的腳本以及基於lamp安裝wordpress
服務lamp word press博客#!/bin/bash #部署一個LAMP的環境 #文檔整理人:dingxue #整理日期:2017-10-6 #提取部署好yum環境,也可以使用網絡yum操作 #說明:本文檔部署環境的機器是:Linux redhat_6.5_x64 #請將所需的源
FPGA小白學習之路(1) System Verilog的概念以及與verilog的對比
函數返回 enable 傳遞 轉換操作符 st2 輸出 時間值 擴展 isa 轉自CSDN:http://blog.csdn.net/gtatcs/article/details/8970489 SystemVerilog語言簡介 SystemVerilog是一種硬件描
13.Django之數據庫models&orm連表操作補充以及其他知識點補充(二)
http 但是 int migrate .py app migration esp rfi 一.外鍵關聯。假如說,現在有兩張表,一張user表,這個表中存放了用戶賬戶信息,還有一張usertype表,這張表存放了用戶賬戶的類型。from django.db import
提高篇(1):RMQ問題與ST表
style 總結 線段 區間 選擇 線段樹 支持 ins 例題 RMQ是英文Range Minimum/Maximum Query的縮寫,是詢問某個區間內的最值,這裏講一種解法:ST算法 ST算法通常用在要多次(10^6級別)詢問區間最值的問題中,相比於線段樹,它實現更簡
數據結構筆記(1)-線性表
常數時間 順序表 復雜度 個數 shadow col ces 序表 ESS 1.順序表是一種隨機存取結構。 存取結構:存取結構是在一個數據結構上對查找操作的時間性能的一種描述。(1)隨機存取結構:指在一個數據結構上進行查找的時間性能是O(1),即查找任意一個數據元素的時間
表、棧和隊列(1)
移除 clas for循環 set 基本 棧和隊列 返回 異常 -m 目錄 1、抽象數據類型 2、表ADT 2.1、表的簡單數組實現 2.2、簡單鏈表 3、Java Collections API中的表 3.1、Collection接口 3.2、Iterator接口 3