1. 程式人生 > >ARM-Linux (臨時,正式) 建立頁表的比較

ARM-Linux (臨時,正式) 建立頁表的比較



很久沒有寫部落格了,由於之前的寫關於OMAP3530文章還沒有整理。再加上一直在找工作,找到工作後又投入到另外的平臺去工作。始終在忙忙碌碌,但是對於程式碼確實漸漸疏遠。

在做專案的時候要使用DDR3分配記憶體,不經意間使用要和MMU以及TLB打交道。因此特地寫下這篇文章以備後用。(工作就是在和遺忘作鬥爭)!

Linux在啟動之初會建立臨時頁表,但是在start_kerne函式中setup_arch又會建立正真的頁表和頁目錄。那麼兩套方案是如何過渡的?假如在MMU開啟的時候把之前的臨時頁表給覆蓋了或者修改了,會不會影響後續的啟動過程?帶著這些問題分析一下。

首先來看一下基於ARM的頁表管理和MMU

的行為分析:

Arm上的linux(正式)頁表採用的是一級粗頁表結合二級小頁表實現4G空間的訪問。如上圖說明。

一級表 (1024 Entrys

二級表 (1024 Entrys

虛擬地址後12Offset定址空間是4096B 4k的空間

Arm上的linux(臨時)頁表採用的是段式頁表,每一個entry可以對映1M的空間,結合後面的20bits位(定址空間正好是1M

一級表 (4096 Entrys

虛擬地址的後20offset定址空間是1M

接著來看一下linux如何建立頁表的過程。

Head.S中有一段使用匯編編寫的初始化程式碼。Mmu.c中有一段使用c語言寫的建立頁表的程式碼。C

語言的程式碼很經典,可能彙編更經典。這裡不多分析了。可以百度文章很多分析。

關鍵問題在於一個變數swap_pgdir

1..macro    pgtbl, rd  

2.

3.       ldr   \rd, =(KERNEL_RAM_PADDR - 0x4000)  

4.

5..endm  

KERNEL_RAM_PADDR = 0 x XXXXXXXX這是記憶體的實體地址,那麼頁表的建立也在這實體地址相關的區域內。

臨時頁表使用的是段式對映,也稱之為平坦對映。那麼4G的空間劃分為1M為單位的訪問單元,需要4096Entrys。應為Arm採用32位的資料線,因此每一個Entry

佔用一個32位的區段,也就是4B

正式頁表建立的過程分為二級對映也尋找index的過程。每次把線性地址劃分為兩段,每一段都作為索引根據TLB BASE的便宜尋找下一級的索引項。最後結合虛擬地址的最後偏移(10 bit)作為依據在4K的空間內定址。

問題來了,這兩種對映會不會應為後一種對映的建立把之前的對映破壞掉,導致linux一個複雜的定址系統無法正常工作呢?答案肯定不會。

圖示比文字描述來的直接,還是直接上兩張圖說明問題:

由上圖可知:臨時頁表建立的空間和正式頁表建立的空間分別部署於不同的空間,因此不會出現覆蓋或者修改等現象。同時一二級頁表項目錄中的內容頁值得研究。最後兩位同時表現出來的控制邏輯,讓MMU翻譯地址的過程中有章可循。結合MMU中的AP位規定了訪問空間的屬性,是否可以訪問拒絕訪問等。

    最後希望圖示可以幫助讀者理解對映的意圖。文中難免有些地方會引起歧義或者不足之初,希望linux大俠指正點評。

謝謝

 

相關推薦

ARM-Linux 臨時正式 建立比較

 很久沒有寫部落格了,由於之前的寫關於OMAP3530文章還沒有整理。再加上一直在找工作,找到工作後又投入到另外的平臺去工作。始終在忙忙碌碌,但是對於程式碼確實漸漸疏遠。 在做專案的時候要使用DDR3分配記憶體,不經意間使用要和MMU以及TLB打交道。因此特地寫下這

Linux壓縮解壓縮unziptar

哪些 family top -s dir 處理 根目錄 cti font unzip tar 常用解壓縮命令: tar -zxvpf:解壓縮 tar -zcvpf: 壓縮

linux烏班圖下執行pip沒有問題執行sudo pip報錯的問題

變量 www rec res line bubuko 原來 後來 inux 最近剛裝好linux的虛擬機,在裝一個套件時提示權限不足,於是添加上了 sudo 命令,結果直接報以下錯誤, Traceback (most recent call last): File "/u

Linux基礎之命令練習Day2-useraddmoddelgroupaddmoddelchmodchown

http ack 方式 技術 配置文件 練習 文件file html useradd 作業一: 1) 新建用戶natasha,uid為1000,gid為555,備註信息為“master” 2) 修改natasha用戶的家目錄為/Natasha 3) 查看用戶信息配置文件的最

linux中firewalld之direct rules和rich rules轉發偽裝

1.firewall設定中的direct rules 這個指令可以設定火牆的預設設定是接受還是拒絕 firewall-cmd --direct --get-all-rules ##檢視所有的direct rules 這裡可以舉個例子來證明一下 環境:虛擬機器安

LinuxRedhat 6.4上安裝配置telnet服務並使用SecureCRT連線

由於之前在電腦上安裝了虛擬機器,並在虛擬機器中安裝了Linux,但是由於沒辦法直接複製螢幕內容,有時候做記錄顯得有些不方便。因此今天在電腦上安裝了一個SecureCRT,並在Linux上安裝了telnet服務,用於連線虛擬機器中的Linux,之後便可以更方便複製

建立一個物件陣列內放5個學生的資料學號成績用指向物件的指標做函式引數在max函式中找出5個學生中成績最高者並輸出其學號。

原始碼如下:主要注意友元函式的宣告 #include <iostream> #include <string> using namespace std; class Student { public:     Student(string n,flo

React原始碼分析2 — 元件和物件的建立createClasscreateElement

1 元件的建立 React受大家歡迎的一個重要原因就是可以自定義元件。這樣的一方面可以複用開發好的元件,實現一處開發,處處呼叫,另外也能使用別人開發好的元件,提高封裝性。另一方面使得程式碼結構很清晰,元件間耦合減少,方便維護。ES5建立元件時,呼叫React.

關於如何在linux環境下生成a庫和so庫附圖

一般linux環境下的連結庫分為a庫和so庫,分別表示靜態連結庫和動態連結庫,其作用是把C程式編譯好做成一種可執行連結檔案,c主程式檔案呼叫這些程式的函式介面是可以使用a庫或so庫,在主程式中只需要i

linux下使用nginx做域名對映安裝配置

安裝: 第一步:從http://nginx.org上下載相應的版本nginx-1.10.1.tar.gz     (或者wget http://nginx.org/download/nginx-1.10.1.tar.gz直接在Linux上用命令下載) 第二步:解壓壓

建立空間、建立子查詢建立的約束、事務、資料庫物件檢視、序列、索引、同義詞、PLSQL程式設計、if迴圈、資料的匯入匯出備份

DDL語句管理表 DML管理表資料 1)語法: 建立 和 刪除 表空間 / 建立使用者 create tablespace 表空間的名稱 datafile '檔案路徑' //這個檔案是儲存在伺服器端的電腦上的

Linux螢幕上畫框和拋物線framebuffermapped

引數說明編輯 start:對映區的開始地址,設定為0時表示由系統決定對映區的起始地址。 length:對映區的長度。//長度單位是 以位元組為單位,不足一記憶體頁按一記憶體頁處理 prot:期望的記憶體保護標誌,不能與檔案的開啟模式衝突。是以下的某個值,可以通過or運算合理地組合在一起 PROT_

從 0 開始學習 Linux 系列之「27.Socket 程式設計基礎TCPUDP

Socket 介面簡介 Socket 套接字是由 BSD(加州大學伯克利分校軟體研發中心)開發的一套獨立於具體協議的網路程式設計介面,應用程式可以用這個介面進行網路通訊。要注意:Socket 不是一套通訊協議(HTTP,FTP 等是通訊協議),而是程式設計的介

關於SpringBoot的application.yml的相關配置自定義開發測試正式切換

spring boot遵循“約定優於配置”的原則,使用annotation對一些常規的配置項做預設配置,減少或不使用xml配置,讓你的專案快速執行起來。spring boot的神奇不是藉助程式碼的生成來實現的,而是通過條件註解來實現的。1.自定義配置,我們用yml配置我們自己

基於linux的APACHEweb服務指定ip和指定使用者訪問虛擬主機https加密認證網頁重寫支援的語言phpcgi正向和反向代理

APACHE Web服務 yum install httpd -y ###安裝httpd systemctl start httpd ###開啟httpd服務 /var/www/html ###apache預設配置目錄 index.html ###a

Linux 訊號詳解三sleepraise

//sleep 函式 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> #include <sys

Greenplum 在Linux下的安裝centOSRedHat

Greenplum on Linux          網傳的Greenplum安裝教程多生搬硬套,很多不必要的東西也會列出來,導致環境的配置極其麻煩;官方的安裝部署又顯得太凌亂,100多頁,讓人難以消化。本文介紹了Greenplum分散式下的安裝(Linux系統下:Ce

Linux下安裝軟體rpmyum

1、 rpm 方式安裝 掛載光碟: 前面文章已經介紹過rpm的安裝方法了,這裡就不介紹了 VMware下掛載光碟並安裝檔案 rpm –ivh 安裝軟體 rpm –e

Linux學習筆記_系統分割槽資訊磁碟空間及inode佔用檢視dffdisk

環境:centos7 需求:檢視系統分割槽表資訊,磁碟空間及inode佔用 方法: df 命令 fdisk命令 [[email protected]_PC ~]# which df /u

文件讀取草稿excelcsv

string guid dwr lda clas isn urn datarow arraylist using NPOI.XSSF.UserModel; using System; using System.Collections.Generic; using Syst