Linux 內核分析與應用 2 - 內存尋址

本系列是對 陳莉君 老師 Linux 內核分析與應用 [1] 的學習與記錄。講的非常之好,推薦觀看

留此記錄,蜻蜓點水, 可作拋磚引玉


2.1 內存尋址

數據連續存儲和選擇讀取思想, 是目前我們使用的幾乎所有機器運行背後的靈魂

計算機體系結構中的核心問題之一, 就是如何有效地進行內存尋址; 內存尋址技術, 從某種程度上代表了計算機技術.

"段" 的引入:

段描述了一塊有限的內存區域, 區域的起始位置存在專門的寄存器, 也就是段寄存器中.

"保護模式" 的引入:

訪問內存時不能直接從段寄存器中獲得段的起始地址, 而需經過額外的轉化或檢查

"黃金時代":

Linux 內核中的 C 和彙編語言

在 C 語言中, 也可以嵌入彙編語言, 叫做 GCC 嵌入式彙編


2.2 段機制

將虛地址轉換爲線性地址

使用 readelf 和 objdump 解析目標文件

MMU: 內存管理單元, 和 CPU 是在一起的. MMU 把虛地址轉化成物理地址, 送給存儲器.

(Intel)I386 的體系結構


2.3 分頁機制

分頁在分段之後進行, 其作用是完成從線性地址到物理地址的轉換

必須在保護模式下才能啓動分頁功能

在 32 位系統上一般默認爲 4K 大小, 也可以是 2MB 或 4MB

64 位系統上, 可以是 4KB,8KB, 最大可以是 256MB

分頁使得每個進程可以擁有自己獨立的虛擬地址空間

(更多可參考 爲什麼 Linux 默認頁大小是 4KB)

兩級頁表:

Linux 四級分頁模式

I386 體系結構(下)


2.4 動手實踐 - 將虛擬地址轉換成物理地址

頁全局目錄

所有的進程都共享一個內核頁表

最新的 CPU 已經支持五級頁表

64 位系統中已經不再用 "高級內存"

mknod 命令


章節測試:

<1>. 操作系統啓動時,處理器處於保護模式  (錯)

<2>.X86 中段的描述包含基地址和界限 (錯)

<3>.Intel8086 的尋址範圍是 1MB,80386 的尋址範圍是 4GB (對)

<4>. 分頁機制是在保護模式下開啓的。(對)

<5>. 在保護模式下,段的大小可以達到 4GB (對)

<6>. CR3 寄存器存放頁目錄基地址  (對)

<7>.x86 的保護模式就是來保護操作系統的  (錯)

<8>. 分頁的原理使得每個進程可以擁有自己獨立的虛擬內存空間 (對)

<9>. 分 Linux 之所以巧妙地繞過段機制,主要是因爲將段的基址設爲 0,即偏移量等於線性地址  (對)

<10>. 在 x86 中,啓用分頁機制是通過啓用保護允許位 PE 而達到的  (錯)

x86   保護模式 + 分頁管理機制

開啓分頁機制———《x86 彙編語言:從實模式到保護模式》讀書筆記 44

<11>. 鏈接以後形成的地址空間是虛擬地址空間。(對)

<12>. 虛擬地址是程序訪問存儲器所使用的邏輯地址  ;線性地址是邏輯地址到物理地址變換之間的中間層;物理地址是每一個字節單元的一個唯一的存儲器地址  (對)

<13>. CPU 訪問的是虛擬地址。(對)

<14>. 80x86 的控制寄存機器主要用於分段機制  (錯)

<15>. 80x86 的分段機制是必選的,分頁機制是可選的 (對)

但是現實情況不是的, 操作系統大多都用了分頁機制

<16>. 保護模式提供了四個特權級,Linux 使用了其中的 2 個,0 級對應內核態,2 級對應用戶態  (錯)

段被分爲了 4 個特權級,分別爲 0-3 級,有時候我們也叫做 ring0-ring3,其中,數值越小特權級越高
核心代碼和數據所在的段的特權級都比較高,一般在 ring0,而用戶程序所在的段的特權級較低,一般在 ring3。當低特權級的任務試圖在未被允許的情況下訪問高特權級的段時,將會產生常規保護錯誤。
而處理器是如何區分所在段的特權級,進而對其進行保護的呢?這就不得不提到 CPL、DPL 和 RPL 三者了。但是在開始之前,我們需要先了解一下一致代碼段和非一致代碼段。

保護模式特權級概述

操作系統 - 保護模式中的特權級

<17>. 頁面大小是由操作系統設計者確定的  (錯)

<18>. 頁面高速緩存是一種硬件機制,專門用來支持地址轉換的  (對)

與程序員相關的 CPU 緩存知識

<19>. intel 的保護模式是在 80386 處理器中首次出現的  (錯)

<20>. 頁目錄存放在( )中。D

A.CR0

B.CR1

C.CR2

D.CR3

控制寄存器 (Control Register)(CR0~CR3)用於控制和確定處理器的操作模式以及當前執行任務的特性。
CR0 中含有控制處理器操作模式和狀態的系統控制標誌;
CR1 保留不用;
CR2 含有導致頁錯誤的線性地址;
CR3 中含有頁目錄表物理內存基地址,因此該寄存器也被稱爲頁目錄基地址寄存器 PDBR(Page-Directory Base address Register)。

控制寄存器 CR*

控制寄存器

<21>. 一個 32 位虛擬地址被分爲 a、b、c 三個域,其中 a、b 用於一個 2 級頁表系統,c 爲頁內偏移地址,則頁面數爲( )。D

A. a+b

B. a×b

C. 2a×b

D. 2a+b

<22>. 以下( )處理器不是馮諾伊曼體系 (普林斯頓體系) 結構   C(屬於哈佛體系)

A. Intel X86

B. AMD

C. ARM

D. MIPS

<23>. 如下縮寫,( )是中斷描述符表  B

A. GDT

B. IDT

C. LDT

D. RPL

中斷描述符表

中斷機制和中斷描述符表、中斷和異常的處理

<23>. “段:偏移量” 的形式描述的是( ) B

A. 物理地址

B. 虛擬地址

C. 線性地址

D. 段地址

虛擬地址轉換與段分割

參考資料

[1]

Linux 內核分析與應用: https://next.xuetangx.com/course/XIYOU08091001441/1516763

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/GK5NkJoRXIGaJmo_PAVsCQ