1. 程式人生 > >mmu以及頁表 UBOOT(1)

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)

1:0bit 是 10 表示當前條目是段頁 3:2bit是   00表示無快取 4bit是向後相容 最好為1 由於section是從0執行到4095的,並且option是0X12 所以執行完畢後,0-4095頁表項 每個頁表項就是 0XC00 | 0X12 | SECTION<<20


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 虛擬地址到實體地址的轉換。
  1. 虛擬地址的[31:20]位存放一級頁表的入口index[19:0]位存放段偏移;

  2. TTBRtranslation table base register,協處理器CP15中的一個暫存器,用於存放一級頁表的基址)暫存器中獲取一級頁表的基址;

  3. 一級頁表基址+ VA[31:20] = 該虛擬地址對應的頁表描述符的入口地址;

  4. 頁表描述符的[31:20]位為該虛擬地址對應的物理段基址;

  5. 物理段基址+ 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以及 UBOOT1

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

《 常見演算法與資料結構》符號ST1——基本介紹

符號表(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