內(nèi)存管理技術(shù)一:頁表

寄存器satp

操作系統(tǒng)分為用戶模式和內(nèi)核模式曹铃,riscv架構(gòu)也分為特權(quán)架構(gòu)和非特權(quán)架構(gòu)加叁。特權(quán)架構(gòu)指的是因為定時器中斷未巫,異常和系統(tǒng)調(diào)用等情況,進程從用戶模式切換到內(nèi)核模式時筋栋,對一些特權(quán)架構(gòu)的寄存器進行一系列的操作,也是用戶態(tài)和內(nèi)核態(tài)可以進行分離的實現(xiàn)原理正驻。

Satp(Supervisor Address Translation and Protection Register)寄存器是虛擬地址轉(zhuǎn)換的一個非常重要的寄存器弊攘,下圖展示了stap寄存器的內(nèi)容。

32位操作系統(tǒng)時satp寄存器

64位操作系統(tǒng)時satp寄存器

當MODE位為0時姑曙,虛擬地址不會進行轉(zhuǎn)化襟交,此刻的虛擬地址就是物理地址。軟件會將satp寄存器的其他字段清0伤靠。MODE為不同值時捣域,會根據(jù)MODE位選擇不同結(jié)構(gòu)的頁表,如下圖所示宴合。在32位的操作系統(tǒng)下焕梅,頁表只有sv32一種結(jié)構(gòu)。在64位操作系統(tǒng)下卦洽,有sv39贞言,sv48等多種頁表結(jié)構(gòu)。

PPN存放的是最高級頁表的起始頁號(頁目錄)阀蒂,根據(jù)相應的page大小進行可以得到最高級頁表(頁目錄)的物理地址该窗。這樣cpu就可以告訴虛擬內(nèi)存地址從哪里翻譯成物理內(nèi)存地址。(頁表的地址必須為物理地址蚤霞,因為內(nèi)容本身只能存放在真正的物理地址中酗失,頁表是虛擬地址指向物理地址的媒介)每一個應用程序都有屬于自己的頁表,當cpu從一個應用程序切換到另一個應用程序的時候争便,也需要切換satp寄存器中的內(nèi)容级零。每個進程都有自己的進程描述符,在進程描述符中會定義頁目錄的地址并將該地址寫入到stap寄存器中。

頁表和多級頁表

如果直接將虛擬地址一一對應映射到物理地址奏纪,那么對于頁表機制的空間需求太大了鉴嗤。
比如全中國14億人,如果每個人的信息都是中國浙江嘉興海寧奕斯偉xxx序调,那么14億人占據(jù)的信息大小就會非常大醉锅。而如果對信息進行分類,比如同屬中國发绢,保留34個省硬耍,再保留下面的縣,那么需要保存的數(shù)據(jù)量將會變得非常斜呔啤(類似于填寫快遞收貨地址)经柴。頁表的分頁機制就是類似這種原理。


一級頁表的思路是:定位數(shù)據(jù)所在的頁和頁內(nèi)的偏移墩朦,就可以轉(zhuǎn)化成為物理地址坯认。如下圖:

3212位共計20位元素,可以表示2^20=1M個頁氓涣,一個頁的大小為4k牛哺,可以正好覆蓋虛擬內(nèi)存的1M*4K=4GB。011位共計12位可以覆蓋頁的大欣头汀:2^12=4k引润,可以表示為頁內(nèi)偏移。該方法需要為頁表分配1M(頁表數(shù)量)*4k(單個頁表的大醒魍妗)=4MB的內(nèi)存空間淳附。占用空間還是太大,于是多級頁表出現(xiàn)了凰荚。
image.png

虛擬地址和物理地址的組成

先來看虛擬地址的組成:


Sv32虛擬地址

再來看轉(zhuǎn)換后的物理地址:


Sv32物理地址

頁表要做的事情就是將虛擬地址中的20位的VPN[0]和VPN[1]經(jīng)過頁表的轉(zhuǎn)換,變成22位的PPN[0]和PPN[1]便瑟,最后的12位page offset稱作頁內(nèi)偏移缆毁,物理地址和虛擬地址的page offset是一樣的。轉(zhuǎn)換的形式如下圖所示:

頁表項PTE

頁表項(page table entry)是頁表中存儲的內(nèi)容到涂,是尋址的媒介與核心脊框。sv32中,頁表包含了2^10個PTEs践啄,每個頁表項為4個字節(jié)浇雹。下圖展示了PTE的組成。



V位表示PTE是否有效屿讽,如果V=0昭灵,則PTE中的其他位是無效的吠裆。R,W烂完,X分別表示頁的可讀试疙,可寫,可執(zhí)行權(quán)限抠蚣。當這三位都為0時祝旷,PTE中的PPN表示的是指向下一級頁表的物理頁號。下圖表示的是嘶窄,XWR在不同的權(quán)限位時怀跛,PTE的含義。



U位表示的是當前頁在用戶模式下是否可用柄冲。只有當U=1時吻谋,用戶模式下才可以使用當前頁。當sstatus寄存器的SUM位為1時现横,表明supervisor模式下可以訪問user模式下的頁面滨溉。當SUM位為1,且U=1時长赞,supervisor模式下的softwatre可以訪問頁面。但是通常情況下闽撤,SUM為為0得哆,supervisor訪問user模式下的頁會產(chǎn)生錯誤,而且SUM位是否位1哟旗,贩据,supervisor模式盡量不要訪問U=1的頁面。
G位表示是否是全局映射闸餐。未能將全局映射設(shè)置為全局的饱亮,會降低性能。而將非全局映射標記會全局的舍沙,可能會導致bug近上。

RSW保留供supervisor模式下使用,此處可以暫時忽略拂铡。
每個lead PTE(即表示虛擬地址對應物理頁號的PTE)都包含A(access)和D(dirty)位壹无。其中A位表示虛擬頁在上次A被清零之后是否被讀/寫/執(zhí)行過。D位表示虛擬頁在D位上次被清零之后是否被寫過感帅。正常情況下將A和D位置1來提高效率斗锭。對于non-leaf PTE,D失球,A岖是,U位被保留用作未來的標準使用,并且必須被軟件清零。

多級頁表尋址過程

Sv32虛擬地址va被轉(zhuǎn)化成物理地址pa的過程如下:

  1. a = stap.ppn * PAGESIZE, i = LEVELS - 1(stap中的ppn字段表示的頁目錄的物理頁號豺撑,乘PAGESIZE得到的是頁目錄的物理地址烈疚。對于sv32,PAGESIZE = 2^12(4Kb), LEVELS = 2前硫,表示的是二級頁表映射胞得,i表示VPN[1], VPN[0],所以要減1)
  2. pte的地址:a + va.vpn[i]*PTESIZE(a是頁目錄的物理地址屹电,vpn[i]中存放的是index阶剑,乘PTESIZE得到了對應PTE的偏移地址,加上頁目錄的基地址之后就得到了頁目錄對應的PTE危号,可以通過PTE得到下一級頁表的)
    此時需要對pte的進行安全性的檢查牧愁,如果違反PMA和PMP的檢查,則出發(fā)一個access-fault
  3. 如果pte的V位為0外莲,或者r為0且w位為1猪半,則停止并原始的access type觸發(fā)一個page fault
  4. 如果經(jīng)過了上述的檢查,則表明PTE是有效的偷线。如果pte頁表項的r為1磨确,或者x為1,則直接跳轉(zhuǎn)到步驟5声邦。(表明此時PTE為leaf PTE乏奥,已經(jīng)尋找到了對應虛擬地址對應的物理頁號)。否則PTE中的PPN指向的是下一級頁表的物理頁號亥曹。將i = i-1邓了,如果i=0,則停止并根據(jù)原始的access type觸發(fā)一個page fault媳瞪。如果i大于等于0骗炉,a = pte.ppn * PAGESIZE(得到了下一級頁表的物理頁號*size得到了下一級頁表的物理地址),并跳轉(zhuǎn)到步驟2蛇受。
  5. 到第五步說明已經(jīng)尋找到了leaf PTE句葵。根據(jù)當前特權(quán)模式以及mstatus寄存器中的SUM和MXR(如果MXR = 0,只有l(wèi)oad被標記位可讀的頁才可以成功龙巨,如果為1笼呆,則load可讀可執(zhí)行的頁都會成功)字段的值,判斷pte中的r旨别,w诗赌,x和u位是否符合內(nèi)存訪問的請求。如果不符合秸弛,則停止并根據(jù)原始的access type觸發(fā)一個page fault铭若。
  6. 如果i>0洪碳,且pte.ppn[i-1 : 0] 不等于0,則說明這是一個未對齊的super page叼屠,停止并根據(jù)原始的access type觸發(fā)一個page fault
  7. 如果pte的a位為0瞳腌,或者memory access為store且pte的d位為0時,根據(jù)原始access type觸發(fā)一個page fault镜雨,或者:
  • 將pte的a位置1嫂侍,且如果memory access是store時,將pte的d位設(shè)為1
  • 如果access違反了PMA或者PMP的檢查荚坞,觸發(fā)一個page fault
  • 此更新和步驟2中l(wèi)oad pte的過程必須是原子的挑宠,尤其地,不能在此過程中插入store操作
  1. 到該步驟則說明虛擬地址到物理地址的轉(zhuǎn)換是成功的颓影。leaf PTE中的PPN就是最終轉(zhuǎn)換成功的物理頁號各淀,加上虛擬地址的offset就變成了物理地址。轉(zhuǎn)換后的物理地址要滿足一下特性:
  • pa.pgoff = va.pgof(物理地址的頁內(nèi)偏移與虛擬地址的頁內(nèi)偏移是一樣的)
  • 如果i>0诡挂,則說明這是一個superpage的轉(zhuǎn)換碎浇,pa.ppn[i-1 : 0] = va.vpn[i-1 : 0]。
  • pa.ppn[LEVELS-1 :i] = pte.ppn[LEVELS-1 : i](最終的物理地址的物理頁號是leaf PTE的物理頁號)

64位操作系統(tǒng)的多級頁表轉(zhuǎn)換

32位操作系統(tǒng)的頁表轉(zhuǎn)換只有sv32一種璃俗,已經(jīng)在2.3.4中詳細講述奴璃。64位操作系統(tǒng)根據(jù)satp寄存器的MODE位可以分為sv39和sv48等多種頁表轉(zhuǎn)換方式,但原理其實和sv32差不多城豁。sv39采用的是三級頁表溺健,sv48為四級頁表,下圖分別展示了在sv39和sv48時的虛擬地址钮蛛,物理地址和頁表項pte。




下圖來自MIT的xv6操作系統(tǒng)課程對sv39三級頁表映射方案從虛擬地址到物理地址地址轉(zhuǎn)換的總結(jié)剖膳。


image.png

Page fault

產(chǎn)生page fault的情況有很多種魏颓,比如因為懶加載機制,并沒有給當前虛擬地址分配物理地址吱晒;根據(jù)地址轉(zhuǎn)換的安全性檢查甸饱,也會產(chǎn)生page fault;或者pte因為物理存儲機制被存放至磁盤空間仑濒,也需要page fault進行swap等等叹话。本章節(jié)將會講述產(chǎn)生page fault的原因,后續(xù)章節(jié)中會講述xvisor是如何具體處理page fault的墩瞳。下圖展示了在地址轉(zhuǎn)換的過程中出現(xiàn)page fault的情形:


image.png

內(nèi)核空間的處理比較簡單驼壶,也不容易出現(xiàn)page fault的情況,只要處理vmalloc即可喉酌。對于用戶空間來說热凹,page fault的處理要考慮的情況比較多泵喘。首先要對虛擬地址的合法性進行檢查。如果一個地址不在合法的VMA區(qū)間內(nèi)般妙,就判定為bad area纪铺,并處罰segmentation fault。如果在地址合法的情況下碟渺,首先考慮是否是因為用戶控件的malloc懶加載機制鲜锚。
因為malloc是動態(tài)分配內(nèi)存機制,并且為了節(jié)省內(nèi)存苫拍,內(nèi)核并不會立刻為其分配物理內(nèi)存芜繁,而是只是對vma進行信息記錄。當?shù)刂氛嬲皇褂玫降臅r候怯疤,處罰page fault浆洗,通過mmap建立對應的heap和stack內(nèi)存區(qū)域的映射。在x86的實現(xiàn)機制中集峦,還有一種情況(riscv的linux需要考證)伏社,就是在pte頁表項的P位為0時,表明該頁表項是存在的塔淤。只是從內(nèi)存空間拷貝至了外部磁盤空間摘昌,需要調(diào)用swap_page將頁面的內(nèi)容拷貝回內(nèi)存。

參考資料:

MIT操作系統(tǒng)課程
蘭新宇:linux內(nèi)核和虛擬化博客
riscv特權(quán)架構(gòu)文檔
微信讀書:qemu/kvm源碼解析與應用
《系統(tǒng)虛擬化》

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末高蜂,一起剝皮案震驚了整個濱河市聪黎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌备恤,老刑警劉巖稿饰,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異露泊,居然都是意外死亡喉镰,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門惭笑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來侣姆,“玉大人,你說我怎么就攤上這事沉噩∞嘧冢” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵川蒙,是天一觀的道長蚜厉。 經(jīng)常有香客問我,道長畜眨,這世上最難降的妖魔是什么弯囊? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任痰哨,我火速辦了婚禮,結(jié)果婚禮上匾嘱,老公的妹妹穿的比我還像新娘斤斧。我一直安慰自己,他們只是感情好霎烙,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布撬讽。 她就那樣靜靜地躺著,像睡著了一般悬垃。 火紅的嫁衣襯著肌膚如雪游昼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天尝蠕,我揣著相機與錄音烘豌,去河邊找鬼。 笑死看彼,一個胖子當著我的面吹牛廊佩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播靖榕,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼标锄,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了茁计?” 一聲冷哼從身側(cè)響起料皇,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎星压,沒想到半個月后践剂,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡娜膘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年舷手,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片劲绪。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖盆赤,靈堂內(nèi)的尸體忽然破棺而出贾富,到底是詐尸還是另有隱情,我是刑警寧澤牺六,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布颤枪,位于F島的核電站,受9級特大地震影響淑际,放射性物質(zhì)發(fā)生泄漏畏纲。R本人自食惡果不足惜扇住,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盗胀。 院中可真熱鬧艘蹋,春花似錦、人聲如沸票灰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽屑迂。三九已至浸策,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間惹盼,已是汗流浹背庸汗。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留手报,地道東北人蚯舱。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像昧诱,于是被迫代替她去往敵國和親晓淀。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容