現(xiàn)在全國疫情最新情況360手機優(yōu)化大師下載
本系列是對 陳莉君 老師 Linux 內(nèi)核分析與應用[1] 的學習與記錄。講的非常之好,推薦觀看
留此記錄,蜻蜓點水,可作拋磚引玉
2.1 內(nèi)存尋址

數(shù)據(jù)連續(xù)存儲和選擇讀取思想,是目前我們使用的幾乎所有機器運行背后的靈魂
計算機體系結(jié)構(gòu)中的核心問題之一,就是如何有效地進行內(nèi)存尋址; 內(nèi)存尋址技術(shù),從某種程度上代表了計算機技術(shù).
"段"的引入:
段描述了一塊有限的內(nèi)存區(qū)域,區(qū)域的起始位置存在專門的寄存器,也就是段寄存器中.
"保護模式"的引入:
訪問內(nèi)存時不能直接從段寄存器中獲得段的起始地址,而需經(jīng)過額外的轉(zhuǎn)化或檢查
"黃金時代":



Linux內(nèi)核中的C和匯編語言
-
用的GNU的擴展C -
匯編語言用的是AT&T的匯編格式與Intel的匯編格式稍有差異
在C語言中,也可以嵌入?yún)R編語言,叫做GCC嵌入式匯編
2.2 段機制
將虛地址轉(zhuǎn)換為線性地址
使用readelf和objdump解析目標文件[2]

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




(Intel)I386的體系結(jié)構(gòu)[3]
2.3 分頁機制
分頁在分段之后進行,其作用是完成從線性地址到物理地址的轉(zhuǎn)換
必須在保護模式下才能啟動分頁功能

在32位系統(tǒng)上一般默認為4K大小,也可以是2MB或4MB
64位系統(tǒng)上,可以是4KB,8KB,最大可以是256MB
分頁使得每個進程可以擁有自己獨立的虛擬地址空間
(更多可參考 為什么 Linux 默認頁大小是 4KB[4])

兩級頁表:

Linux四級分頁模式

I386體系結(jié)構(gòu)(下)[5]
2.4 動手實踐-將虛擬地址轉(zhuǎn)換成物理地址

頁全局目錄
所有的進程都共享一個內(nèi)核頁表
最新的CPU已經(jīng)支持五級頁表
64位系統(tǒng)中已經(jīng)不再用"高級內(nèi)存"
mknod命令[6]
章節(jié)測試:
<1>.操作系統(tǒng)啟動時,處理器處于保護模式 (錯)
<2>.X86中段的描述包含基地址和界限 (錯)
<3>.Intel8086的尋址范圍是1MB,80386的尋址范圍是 4GB (對)
<4>.分頁機制是在保護模式下開啟的。 (對)
<5>.在保護模式下,段的大小可以達到4GB (對)
<6>. CR3寄存器存放頁目錄基地址 (對)
<7>.x86的保護模式就是來保護操作系統(tǒng)的 (錯)
<8>. 分頁的原理使得每個進程可以擁有自己獨立的虛擬內(nèi)存空間 (對)
<9>. 分Linux之所以巧妙地繞過段機制,主要是因為將段的基址設為0,即偏移量等于線性地址 (對)
<10>. 在x86中,啟用分頁機制是通過啟用保護允許位PE而達到的 (錯)
x86 保護模式 + 分頁管理機制[7]
開啟分頁機制———《x86匯編語言:從實模式到保護模式》讀書筆記44[8]
<11>. 鏈接以后形成的地址空間是虛擬地址空間。 (對)
<12>. 虛擬地址是程序訪問存儲器所使用的邏輯地址 ;線性地址是邏輯地址到物理地址變換之間的中間層;物理地址是每一個字節(jié)單元的一個唯一的存儲器地址 (對)
<13>. CPU訪問的是虛擬地址。(對)
<14>. 80x86的控制寄存機器主要用于分段機制 (錯)
<15>. 80x86的分段機制是必選的,分頁機制是可選的 (對)
但是現(xiàn)實情況不是的,操作系統(tǒng)大多都用了分頁機制
<16>. 保護模式提供了四個特權(quán)級,Linux使用了其中的2個,0級對應內(nèi)核態(tài),2級對應用戶態(tài) (錯)
“段被分為了4個特權(quán)級,分別為0-3級,有時候我們也叫做ring0-ring3,其中,數(shù)值越小特權(quán)級越高
核心代碼和數(shù)據(jù)所在的段的特權(quán)級都比較高,一般在ring0,而用戶程序所在的段的特權(quán)級較低,一般在ring3。當?shù)吞貦?quán)級的任務試圖在未被允許的情況下訪問高特權(quán)級的段時,將會產(chǎn)生常規(guī)保護錯誤。
而處理器是如何區(qū)分所在段的特權(quán)級,進而對其進行保護的呢?這就不得不提到CPL、DPL和RPL三者了。但是在開始之前,我們需要先了解一下一致代碼段和非一致代碼段。
保護模式特權(quán)級概述[9]
操作系統(tǒng)-保護模式中的特權(quán)級[10]
<17>. 頁面大小是由操作系統(tǒng)設計者確定的 (錯)
<18>. 頁面高速緩存是一種硬件機制,專門用來支持地址轉(zhuǎn)換的 (對)
與程序員相關(guān)的CPU緩存知識[11]
<19>. intel的保護模式是在80386處理器中首次出現(xiàn)的 (錯)
<20>. 頁目錄存放在( )中。 D
A.CR0
B.CR1
C.CR2
D.CR3
“控制寄存器(Control Register)(CR0~CR3)用于控制和確定處理器的操作模式以及當前執(zhí)行任務的特性。
CR0中含有控制處理器操作模式和狀態(tài)的系統(tǒng)控制標志;
CR1保留不用;
CR2含有導致頁錯誤的線性地址;
CR3中含有頁目錄表物理內(nèi)存基地址,因此該寄存器也被稱為頁目錄基地址寄存器PDBR(Page-Directory Base address Register)。
控制寄存器 CR*[12]

控制寄存器[13]
<21>. 一個32位虛擬地址被分為a、b、c三個域,其中a、b用于一個2級頁表系統(tǒng),c為頁內(nèi)偏移地址,則頁面數(shù)為( )。D
A. a+b
B. a×b
C. 2a×b
D. 2a+b
<22>. 以下( )處理器不是馮諾伊曼體系(普林斯頓體系)結(jié)構(gòu) C(屬于哈佛體系)
A. Intel X86
B. AMD
C. ARM
D. MIPS
<23>. 如下縮寫,( )是中斷描述符表 B
A. GDT
B. IDT
C. LDT
D. RPL
中斷描述符表[14]
中斷機制和中斷描述符表、中斷和異常的處理[15]
<23>. “段:偏移量”的形式描述的是( ) B
A. 物理地址
B. 虛擬地址
C. 線性地址
D. 段地址
虛擬地址轉(zhuǎn)換與段分割[16]
參考資料
Linux 內(nèi)核分析與應用: https://next.xuetangx.com/course/XIYOU08091001441/1516763
[2]使用readelf和objdump解析目標文件: https://www.jianshu.com/p/863b279c941e
[3](Intel)I386的體系結(jié)構(gòu): http://wwww.kerneltravel.net/journal/ii/part1.htm
[4]為什么 Linux 默認頁大小是 4KB: https://draveness.me/whys-the-design-linux-default-page/
[5]I386體系結(jié)構(gòu)(下): http://wwww.kerneltravel.net/journal/ii/part2.htm
[6]mknod命令: https://blog.csdn.net/a1010256340/article/details/83088870
[7]x86 保護模式 + 分頁管理機制: https://www.cnblogs.com/dongguolei/p/7865381.html
[8]開啟分頁機制———《x86匯編語言:從實模式到保護模式》讀書筆記44: https://blog.csdn.net/longintchar/article/details/52198391
[9]保護模式特權(quán)級概述: https://www.cnblogs.com/tcctw/p/11332551.html
[10]操作系統(tǒng)-保護模式中的特權(quán)級: https://blog.51cto.com/13475106/2462286
[11]與程序員相關(guān)的CPU緩存知識: https://coolshell.cn/articles/20793.html
[12]控制寄存器 CR*: https://www.cnblogs.com/coderCaoyu/p/3616055.html
[13]控制寄存器: https://baike.baidu.com/item/%E6%8E%A7%E5%88%B6%E5%AF%84%E5%AD%98%E5%99%A8/9335215
[14]中斷描述符表: https://baike.baidu.com/item/%E4%B8%AD%E6%96%AD%E6%8F%8F%E8%BF%B0%E7%AC%A6%E8%A1%A8
[15]中斷機制和中斷描述符表、中斷和異常的處理: https://blog.csdn.net/jnu_simba/article/details/11722703
[16]虛擬地址轉(zhuǎn)換與段分割: https://zhuanlan.zhihu.com/p/56172609
本文由 mdnice 多平臺發(fā)布