上一期中我們介紹了armv8-a架構中的異常級別,從這一期開始的接下來四期我們將介紹armv8-a的儲存模型。第一期我們將介紹儲存模型中位址轉換和訪存控制的一般概念,第二期我們將介紹快取相關的基本概念,最後兩期我們將介紹armv8-a架構中的位址轉換、訪存控制和快取機制。本期中我們介紹處理器中位址轉換機制和訪問控制的一般概念。
處理器執行程式時,需要從物理儲存器中取得所需的指令和資料。對於處理器中的位址轉換,輸入資料為應用程式空間中的位址(指令位址或資料位址),輸出為資料匯流排上的位址。前者稱為邏輯位址,後者稱為實體地址。處理器需要將邏輯位址轉換為實體地址。
處理器所能訪問的物理儲存空間分配的方式主要有連續分配和離散分配兩種方式。連續分配指執行在處理器上的程序將其使用的資料和指令儲存在記憶體中的連續區域裡面,這種方式不夠靈活,可能會產生大量記憶體碎片,整合記憶體碎片的開銷比較大。離散分配方式將程序使用的儲存空間離散地分布在記憶體裡,常用的分配方式有段式、頁式和段頁式。
段式分配方式通過分段機制將程式劃分為不同的程式段,如**段、資料段等。分段機制通過將段基址與偏移量相加得到對應的實體地址,偏移量不能超過段長,否則會產生越界中斷。在分段機制中,訪問控制由段描述符實現。段描述符儲存了段基址、段長和訪問段的最低特權等級等資訊,只有當前訪問段描述符的程序有足夠的特權等級才能訪問該段的段描述符。
頁式分配方式通過分頁機制將邏輯位址空間劃分為固定大小的頁,將實體地址空間劃分為固定大小的頁框,頁框和頁的大小是一樣的。分頁機制將邏輯位址空間中的頁離散地對映為實體地址空間中的頁框,從而完成從邏輯位址到實體地址的轉換。頁和段的區別在於頁的大小是固定的,而段的大小是可變的。很多risc [2]處理器處理器不支援分段機制,只支援分頁機制,所以我們著重介紹分頁機制。
在分頁機制中,邏輯位址到實體地址的轉換是通過頁表來實現的。頁表中儲存了頁號到頁框號的轉換關係。邏輯位址被分為頁號和頁偏移,頁號指示邏輯位址空間中的不同的頁,頁偏移指示頁內的邏輯位址。通過頁號可以找到對應的頁框號,頁框號指示了物理儲存空間中的頁框,頁框號和頁偏移拼接則可以得到實體地址。頁表可以有多級,乙個典型的二級頁表如下圖所示[3]:
在上圖中,外部頁表(也叫頁目錄)用於索引頁表在物理儲存空間中的基位址,而外部頁表的基位址則儲存在外部頁表暫存器中。用基位址和偏移相加的方式可以對外部頁表和頁表進行索引。通過用外部頁號作為偏移索引可以得到頁表基址。在頁表中通過用外部頁內位址作為偏移索引可以得到邏輯頁對應的物理頁框號。物理頁框號(b)和頁內位址(d)拼接在一起可以得到實體地址。
由於頁表儲存於主存中且需要被經常訪問,若處理器每次訪問主存都要先訪問主存中的頁表則訪存的時間開銷很大,因此處理器一般為頁表設計了專門的頁面快取記憶體,其中儲存了常用的頁表項。當頁面快取記憶體命中時,可以實現邏輯位址到實體地址的直接轉換,節省了訪問記憶體頁表的開銷;當頁面快取記憶體不命中時,仍然需要訪問記憶體頁表。
分頁機制也支援訪問控制。外部頁表項和頁表項中可以包含訪問控制位,這些訪問控制位可以控制程序對外部頁表項和頁表項的讀寫許可權。
段頁式分配方式結合了段式分配方式和頁式分配方式,即在位址轉換時,首先將邏輯位址用分段機制轉換為線性位址,再對線性位址用分頁機制找到對應的實體地址,乙個典型的段頁式位址轉換機制如下圖所示[1]:
其中邏輯位址為機器指令使用的位址,用於指定運算元或指令的位置。邏輯位址一般由段選擇符和偏移量共同決定。通過段選擇符可以找到段描述符[2],段描述符中包含段基址、段長和訪問許可權資訊等段的性質。其中段基址加上偏移量的算術和就形成了線性位址。線性位址再通過分頁機制找到對應的實體地址。
參考文獻
[1] 《深入分析linux核心源**》陳莉軍編著。
[2] 體系結構/4679327
[3]
極樂技術週報 第十九期
極樂技術週報 第十九期 為什麼程式設計師總是搞混萬聖節和聖誕節?因為.oct 31 dec 25。驗證碼就如同馬奇諾防線一樣,阻擋了爬蟲工程師的正面進攻。隨著爬蟲和反爬蟲雙方圍繞驗證碼的不斷較量,最終導致了驗證碼識別難度的不斷上公升。鏈結位址 一直以來,使用純 css 實現波浪效果都是十分困難的。因...
大話IT第十九期 戴爾收購物件大猜想
讓人唏噓的不只是娛樂圈的分分合合,it界的分分合合也不遜色 為什麼這麼說呢?大家先來看看這段戴爾 emc版的 十年 或許就明白了 十年 獻給dell emc舉案齊眉的過往 作詞 戴爾 作曲 圖斯 表演者 戴爾 圖斯 十年之前,我不轉銷你你不收購我 我們還是一樣陪在企業級客戶左右 走過擁擠的華爾街頭 ...
Python30期第十九天課程總結
1.處理符號 2.計算表示式 3.操作表示式 4.移除括號 5.main函式當中不寫邏輯,只呼叫相關的功能1.search 通過正則匹配出第乙個物件返回,通過group取出物件中的值 2.match 驗證使用者輸入內容 了解 3.split 切割 4.sub 替換 正規表示式,替換的字串,原字串,可...