ARM-Linux (臨時,正式) 建立頁表的比較
很久沒有寫部落格了,由於之前的寫關於OMAP3530文章還沒有整理。再加上一直在找工作,找到工作後又投入到另外的平臺去工作。始終在忙忙碌碌,但是對於程式碼確實漸漸疏遠。
在做專案的時候要使用DDR3分配記憶體,不經意間使用要和MMU以及TLB打交道。因此特地寫下這篇文章以備後用。(工作就是在和遺忘作鬥爭)!
Linux在啟動之初會建立臨時頁表,但是在start_kerne函式中setup_arch又會建立正真的頁表和頁目錄。那麼兩套方案是如何過渡的?假如在MMU開啟的時候把之前的臨時頁表給覆蓋了或者修改了,會不會影響後續的啟動過程?帶著這些問題分析一下。
首先來看一下基於ARM的頁表管理和MMU
Arm上的linux(正式)頁表採用的是一級粗頁表結合二級小頁表實現4G空間的訪問。如上圖說明。
一級表 (1024 Entrys)
二級表 (1024 Entrys)
虛擬地址後12位Offset定址空間是4096B 4k的空間
Arm上的linux(臨時)頁表採用的是段式頁表,每一個entry可以對映1M的空間,結合後面的20bits位(定址空間正好是1M)
一級表 (4096 Entrys)
虛擬地址的後20位offset定址空間是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為單位的訪問單元,需要4096個Entrys。應為Arm採用32位的資料線,因此每一個Entry
正式頁表建立的過程分為二級對映也尋找index的過程。每次把線性地址劃分為兩段,每一段都作為索引根據TLB BASE的便宜尋找下一級的索引項。最後結合虛擬地址的最後偏移(10 bit)作為依據在4K的空間內定址。
問題來了,這兩種對映會不會應為後一種對映的建立把之前的對映破壞掉,導致linux一個複雜的定址系統無法正常工作呢?答案肯定不會。
圖示比文字描述來的直接,還是直接上兩張圖說明問題:
由上圖可知:臨時頁表建立的空間和正式頁表建立的空間分別部署於不同的空間,因此不會出現覆蓋或者修改等現象。同時一二級頁表項目錄中的內容頁值得研究。最後兩位同時表現出來的控制邏輯,讓MMU翻譯地址的過程中有章可循。結合MMU中的AP位規定了訪問空間的屬性,是否可以訪問拒絕訪問等。
最後希望圖示可以幫助讀者理解對映的意圖。文中難免有些地方會引起歧義或者不足之初,希望linux大俠指正點評。
謝謝
相關推薦
ARM-Linux (臨時,正式) 建立頁表的比較
很久沒有寫部落格了,由於之前的寫關於OMAP3530文章還沒有整理。再加上一直在找工作,找到工作後又投入到另外的平臺去工作。始終在忙忙碌碌,但是對於程式碼確實漸漸疏遠。 在做專案的時候要使用DDR3分配記憶體,不經意間使用要和MMU以及TLB打交道。因此特地寫下這
Linux壓縮解壓縮(unzip,tar)
哪些 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-useradd(mod,del),groupadd(mod,del),chmod,chown,
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 這裡可以舉個例子來證明一下 環境:虛擬機器安
在Linux(Redhat 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 — 元件和物件的建立(createClass,createElement)
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螢幕上畫框和拋物線(framebuffer,mapped)
引數說明編輯 start:對映區的開始地址,設定為0時表示由系統決定對映區的起始地址。 length:對映區的長度。//長度單位是 以位元組為單位,不足一記憶體頁按一記憶體頁處理 prot:期望的記憶體保護標誌,不能與檔案的開啟模式衝突。是以下的某個值,可以通過or運算合理地組合在一起 PROT_
從 0 開始學習 Linux 系列之「27.Socket 程式設計基礎(TCP,UDP)」
Socket 介面簡介 Socket 套接字是由 BSD(加州大學伯克利分校軟體研發中心)開發的一套獨立於具體協議的網路程式設計介面,應用程式可以用這個介面進行網路通訊。要注意:Socket 不是一套通訊協議(HTTP,FTP 等是通訊協議),而是程式設計的介
關於SpringBoot的application.yml的相關配置(自定義,開發,測試,正式)切換
spring boot遵循“約定優於配置”的原則,使用annotation對一些常規的配置項做預設配置,減少或不使用xml配置,讓你的專案快速執行起來。spring boot的神奇不是藉助程式碼的生成來實現的,而是通過條件註解來實現的。1.自定義配置,我們用yml配置我們自己
基於linux的APACHE(web服務,指定ip和指定使用者訪問,虛擬主機,https加密認證,網頁重寫),支援的語言(php,cgi),正向和反向代理
APACHE Web服務 yum install httpd -y ###安裝httpd systemctl start httpd ###開啟httpd服務 /var/www/html ###apache預設配置目錄 index.html ###a
Linux 訊號詳解三(sleep,raise)
//sleep 函式 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> #include <sys
Greenplum 在Linux下的安裝(centOS,RedHat)
Greenplum on Linux 網傳的Greenplum安裝教程多生搬硬套,很多不必要的東西也會列出來,導致環境的配置極其麻煩;官方的安裝部署又顯得太凌亂,100多頁,讓人難以消化。本文介紹了Greenplum分散式下的安裝(Linux系統下:Ce
Linux下安裝軟體(rpm,yum)
1、 rpm 方式安裝 掛載光碟: 前面文章已經介紹過rpm的安裝方法了,這裡就不介紹了 VMware下掛載光碟並安裝檔案 rpm –ivh 安裝軟體 rpm –e
Linux學習筆記_系統分割槽資訊,磁碟空間及inode佔用檢視(df,fdisk)
環境:centos7 需求:檢視系統分割槽表資訊,磁碟空間及inode佔用 方法: df 命令 fdisk命令 [[email protected]_PC ~]# which df /u
文件讀取草稿(excel,csv)
string guid dwr lda clas isn urn datarow arraylist using NPOI.XSSF.UserModel; using System; using System.Collections.Generic; using Syst