99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

KPTI實(shí)現(xiàn)機(jī)制及性能與開銷

Linux閱碼場 ? 來源:未知 ? 作者:龔婷 ? 2018-03-13 16:30 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1 KPTI概述

KPTI(Kernel PageTable Isolation)全稱內(nèi)核頁表隔離。KPTI是由KAISER補(bǔ)丁修改而來。之前,進(jìn)程地址空間被分成了內(nèi)核地址空間和用戶地址空間。其中內(nèi)核地址空間映射到了整個物理地址空間,而用戶地址空間只能映射到指定的物理地址空間。內(nèi)核地址空間和用戶地址空間共用一個頁全局目錄表(PGD表示進(jìn)程的整個地址空間),meltdown漏洞就恰恰利用了這一點(diǎn)。攻擊者在非法訪問內(nèi)核地址和CPU處理異常的時間窗口,通過訪存微指令獲取內(nèi)核數(shù)據(jù)。為了徹底防止用戶程序獲取內(nèi)核數(shù)據(jù),可以令內(nèi)核地址空間和用戶地址空間使用兩組頁表集(也就是使用兩個PGD)。

圖1 修改后的進(jìn)程地址空間

2 問題

當(dāng)然事情并沒有那么簡單,有兩個問題:

問題1: X86架構(gòu)中,在上下文切換的間隙(注意是間隙)內(nèi)存中的一部分需要對內(nèi)核空間和用戶空間都是有效的,也就是說在切換CR3之前內(nèi)核就要開始工作了。

問題2:修改CR3時,CPU會沖刷TLB,從而帶來很大的性能問題

3 KPTI實(shí)現(xiàn)機(jī)制

在KAISER的論文中針對這兩個問題,提出了以下解決方案

3.1 影子地址空間(Shadow Address Spaces)

KPTI中每個進(jìn)程有兩個地址空間,第一個地址空間只能在內(nèi)核態(tài)下訪問,可以創(chuàng)建到內(nèi)核和用戶的映射(不過用戶空間受SMAP和SMEP保護(hù),具體可查詢Intel手冊)。第二個地址空間被稱為影子地址空間,只包含用戶空間。不過由于涉及到上下文切換,所以在影子地址空間中必須包含部分內(nèi)核地址,用來建立到中斷入口和出口的映射。

當(dāng)中斷在用戶態(tài)發(fā)生時,就涉及到切換CR3寄存器,從影子地址空間切換到用戶態(tài)的地址空間。中斷上半部的要求是盡可能的快,從而切換CR3這個操作也要求盡可能的快。為了達(dá)到這個目的,KAISER中將內(nèi)核空間的PGD和用戶空間的PGD連續(xù)的放置在一個8KB的內(nèi)存空間中。這段空間必須是8K對齊的,這樣將CR3的切換操作轉(zhuǎn)換為將CR3值的第13位(由低到高)的置位或清零操作,提高了CR3切換的速度。

用戶空間和內(nèi)核空間的PGD分布示意圖

3.2 內(nèi)核空間的最小映射

上文提到,在從影子地址空間切換到內(nèi)核地址空間的過程中,為了使得內(nèi)核在CR3切換之前就能夠開始工作,影子地址空間必須包含部分內(nèi)核地址空間。

如下圖所示,陰影處就是在陷入內(nèi)核態(tài)過程中,需要映射的內(nèi)核數(shù)據(jù)和代碼。圖a 是常規(guī)OS的進(jìn)程的地址空間。圖b和圖c是頁表隔離后的進(jìn)程地址空間,兩者的區(qū)別再與是否使用了SMAP和SMEP機(jī)制。

那么如何確定影子地址空間應(yīng)該映射那些內(nèi)核數(shù)據(jù)呢?由于中斷可能發(fā)生在用戶態(tài),所以應(yīng)該包含中斷向量表(IDT),中斷棧,中斷向量。另外內(nèi)核棧,GDTTSS也應(yīng)該映射到影子地址空間。

4 性能與開銷(performance and overhead)

4.1 TLB

在intel手冊中提到,線性地址的高位被稱為頁號(page number),低位被稱為頁偏移(page offset, 如果頁大小是4K則是低12位)。物理地址的高位被稱為頁框(page frame)。

TLB用于加速從線性地址到物理地址的轉(zhuǎn)換,本質(zhì)上還是一種緩存。TLB使用頁號來獲取線性地址所對應(yīng)的頁的基地址。TLB中的每一項包含以下內(nèi)容:

頁號對應(yīng)頁的物理地址

頁的訪問權(quán)限(R/W,U/S )

頁屬性(dirty flag,memory type)

圖4-1 基于TLB的訪存過程

一個處理器可能包含不同類型的TLB,比如專用于取指令的TLB和用于數(shù)據(jù)訪問的TLB

切換CR3時,CPU會隱式的沖刷TLB。TLB的miss penalty可以達(dá)到10 – 100 個 時鐘周期(clock cycles)。內(nèi)存中的一些頁(比如共享庫)的一些頁是由所有的進(jìn)程共享的。這些頁由頁表項的全局位(G)來標(biāo)示。共享頁并不會參與TLB的隱式?jīng)_刷。

有兩種方法防止數(shù)據(jù)的泄露,第一種需要沖刷整個TLB,而第二種則是禁用頁表項的全局位。

通過PCID的使用可以緩解由于沖刷TLB帶來的性能問題。

4.2 Process-Context Identifiers(PCID)

PCID全稱進(jìn)程上下文標(biāo)示符,CR4寄存器的PCIDE位表示是否啟用CPU的PCID功能。PCIDE=1表示啟用PCID。啟用之后,CR3(頁目基址寄存器)的低12位用來存儲PCID。每個進(jìn)程都有一個PCID,當(dāng)未啟用PCID時,CR3的低12位為全0(000H)。

Intel手冊對于TLB失效的行為作出了很詳細(xì)的解釋,在使用mov指令修改CR3時會使TLB失效(mov to CR3),具體行為如下:

如果CR4.PCIDE = 0(表示未啟用PCID),CPU會使所有與PCID 000H關(guān)聯(lián)的TLB緩存項(TLB entry)失效,除了全局頁。

如果CR4.PCIDE = 1(啟用PCID),并且源操作數(shù)的第63位=0,源操作數(shù)的0-11位為指定的PCID。那么CPU會使所有與指定PCID關(guān)聯(lián)的TLB緩存項失效。TLB中與其他PCID關(guān)聯(lián)的TLB緩存項并不會失效。

如果CR4.PCIDE=1,并且源操作數(shù)的第63位=1,CPU不會對TLB做任何的失效操作。

5 代碼分析

我們選取linux4.15版本作為演示,說明KPTI補(bǔ)丁的內(nèi)核中的分布這是4.15版本和PTI(pagetable isolation)有關(guān)的diff stat. 可以看到共涉及到45個文件的修改,插入了1636行代碼,刪除202行代碼。

增加代碼行數(shù)的前三名是

mm/pti.c

arch/x86/include/asm/tlbflush.h

arch/x86/entry/calling.h

5.1 arch/x86/mm/pti.c

pti.c是補(bǔ)丁新增的文件. 其中的入口函數(shù)是pti_init(), 該函數(shù)在init/main.c中的mm_init()函數(shù)中調(diào)用。這個文件中的函數(shù)總共分為兩種,第一種類似pti_clone_user_shared(),將內(nèi)核的頁表項復(fù)制到用戶空間。第二種類似pti_user_pagetable_walk_p4d(unsigned long address),根據(jù)參數(shù)中的虛擬地址,得到該地址相應(yīng)的頁表項指針。

void __init pti_init(void)

{

if(!static_cpu_has(X86_FEATURE_PTI))

return;

pr_info("enabled\n");

pti_clone_user_shared();

pti_clone_entry_text();

pti_setup_espfix64();

pti_setup_vsyscall();

}

5.2 arch/x86/include/asm/tlbflush.h

該文件包含一系列的有關(guān)TLB flush的函數(shù)在KPTI中并不僅僅使用PCID,由于內(nèi)核中的進(jìn)程地址空間標(biāo)示符必須從0開始。所以ASID是地址空間真正的標(biāo)示符。又因為補(bǔ)丁中進(jìn)程的地址空間有兩個部分,所以我們需要兩個PCID。kPCID內(nèi)核空間使用的標(biāo)示符。uPCID用戶空間使用的標(biāo)示符。

* ASID -[0, TLB_NR_DYN_ASIDS-1]

* the canonical identifier for an mm

*

* kPCID -[1, TLB_NR_DYN_ASIDS]

* the value we write into the PCID part of CR3; corresponds to the

* ASID+1, because PCID 0 is special.

*

* uPCID -[2048+1,2048+ TLB_NR_DYN_ASIDS]

* for KPTI each mm has two address spaces and thus needs two

* PCID values, but we can still do with a single ASID denomination

* for each mm.Corresponds to kPCID +2048.

#define CR3_HW_ASID_BITS 12

# define PTI_CONSUMED_PCID_BITS 1

/*

* 6 because 6 should be plenty and struct tlb_state will fit in two cache

* lines.

*/

#define TLB_NR_DYN_ASIDS 6

5.3 /arch/x86/entry/calling.h

calling.h 是系統(tǒng)調(diào)用的入口函數(shù),用于處理系統(tǒng)調(diào)用時的寄存器保存操作。系統(tǒng)調(diào)用涉及到由用戶態(tài)到內(nèi)核態(tài)的切換。所以calling.h需要修改。

以下一系列的匯編宏指令涉及到用戶PGD和內(nèi)核PGD的切換. 下面我們挑選幾個宏進(jìn)行說明:

1. SWITCH_TO_KERNEL_CR3

該宏的任務(wù)是清楚CR3存儲的PCID,并將CR3的第13置1,從而使其指向內(nèi)核PGD

.macro SWITCH_TO_KERNEL_CR3 scratch_reg:req

ALTERNATIVE "jmp .Lend_\@","", X86_FEATURE_PTI

mov %cr3, \scratch_reg

ADJUST_KERNEL_CR3 \scratch_reg

mov \scratch_reg,%cr3

.Lend_\@:

.endm

2. SWITCH_TO_USER_CR3_NOSTACK該宏的任務(wù)是根據(jù)進(jìn)程的ASID判斷其TLB是否需要flush, 如果不需要就在CR3中標(biāo)記為no_flush。隨后將kPCID轉(zhuǎn)換為uPCID,并使CR3指向用戶PGD。這一切都在很短的時間內(nèi)發(fā)生,因為它們只是對CR3寄存器的置位操作。

.macro SWITCH_TO_USER_CR3_NOSTACK scratch_reg:req scratch_reg2:req

ALTERNATIVE "jmp .Lend_\@","", X86_FEATURE_PTI

mov %cr3, \scratch_reg

ALTERNATIVE "jmp .Lwrcr3_\@","", X86_FEATURE_PCID

/*

* Test if the ASID needs a flush.

*/

movq \scratch_reg, \scratch_reg2

andq $(0x7FF), \scratch_reg /* mask ASID */

bt \scratch_reg, THIS_CPU_user_pcid_flush_mask

jnc .Lnoflush_\@

/* Flush needed, clear the bit */

btr \scratch_reg, THIS_CPU_user_pcid_flush_mask

movq \scratch_reg2, \scratch_reg

jmp .Lwrcr3_pcid_\@

.Lnoflush_\@:

movq \scratch_reg2, \scratch_reg

SET_NOFLUSH_BIT \scratch_reg

.Lwrcr3_pcid_\@:

/* Flip the ASID to the user version */

orq $(PTI_USER_PCID_MASK), \scratch_reg

.Lwrcr3_\@:

/* Flip the PGD to the user version */

orq $(PTI_USER_PGTABLE_MASK), \scratch_reg

mov \scratch_reg,%cr3

.Lend_\@:

.endm

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 處理器
    +關(guān)注

    關(guān)注

    68

    文章

    19884

    瀏覽量

    235002
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11509

    瀏覽量

    213674

原文標(biāo)題:KPTI補(bǔ)丁分析

文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    WIFI的跳頻機(jī)制怎么實(shí)現(xiàn)的?

    WIFI的跳頻機(jī)制怎么實(shí)現(xiàn)的?想了解WIFI的跳頻機(jī)制怎么實(shí)現(xiàn)的。網(wǎng)上資料比較少??!有些WIFI模塊好像都是固定工作在一個頻段的,要改頻段得自己設(shè)置,不知道WIFI有沒有通用的一些跳頻
    發(fā)表于 03-15 17:55

    TMS37157無源低頻芯片的性能與簡介

    ` 本帖最后由 冒汗的心情 于 2016-3-22 09:54 編輯 TMS37157芯片的性能與簡介目錄`
    發(fā)表于 03-22 09:53

    關(guān)于C++中的函數(shù)重載機(jī)制

    ,在名字相同的前提下,只要形參列表不同就可以進(jìn)行函數(shù)的重載,這個不同函數(shù)的判別在編譯的時候.所以是一種靜態(tài)的機(jī)制.(相對于另一種虛函數(shù)機(jī)制是一種動態(tài)機(jī)制).函數(shù)重載的意義是為了減少同類函數(shù)起名字的
    發(fā)表于 10-01 17:18

    智能電機(jī)控制優(yōu)化實(shí)時性能與效率設(shè)計介紹

    的電機(jī)類型與控制機(jī)制,以極低的成本提高電機(jī)的精度、性能、電源效率和使用一系列狀態(tài)簡化控制復(fù)雜性。所支持的狀態(tài)越多,對位置的控制精確度就越高,但這同時也意味著需要更復(fù)雜的處理過程壽命。
    發(fā)表于 07-08 06:35

    ESP8266的性能與指標(biāo)以及開發(fā)環(huán)境的搭建

    這一章將描述ESP8266的性能與指標(biāo),以及開發(fā)環(huán)境的搭建。
    發(fā)表于 02-08 06:08

    SDH開銷和指針

    1.掌握段層監(jiān)控的實(shí)現(xiàn)——段開銷各字節(jié)功能。 2.掌握通道層監(jiān)控的實(shí)現(xiàn)——通道開銷各字節(jié)功能。3.掌握基本告警和性能的監(jiān)測是由哪些
    發(fā)表于 07-31 11:05 ?7次下載

    頻間硬切換實(shí)現(xiàn)機(jī)制,以及對RNC性能的影響

    頻間硬切換實(shí)現(xiàn)機(jī)制,以及對RNC性能的影響頻間硬切換包括異頻同覆蓋小區(qū)之間的異頻小區(qū)負(fù)載平衡所引起的頻間硬切換和異頻相鄰小區(qū)由于覆蓋范圍和UE的
    發(fā)表于 06-30 09:45 ?1145次閱讀

    UCGUI的性能與資源占用

    UCGUI的性能與資源占用
    發(fā)表于 10-26 08:54 ?6次下載

    聯(lián)合編碼開銷與安全性能的網(wǎng)絡(luò)編碼優(yōu)化方案

    一種聯(lián)合編碼開銷與安全性能的網(wǎng)絡(luò)編碼優(yōu)化方案。該方案首先在基于預(yù)選擇機(jī)制的小生境遺傳算法的基礎(chǔ)上加入了預(yù)處理機(jī)制。其次,構(gòu)建了新的適應(yīng)度函數(shù)。最后采用了一種更科學(xué)的種群規(guī)模的確定方式。
    發(fā)表于 11-28 17:38 ?0次下載
    聯(lián)合編碼<b class='flag-5'>開銷</b>與安全<b class='flag-5'>性能</b>的網(wǎng)絡(luò)編碼優(yōu)化方案

    基于循環(huán)神經(jīng)網(wǎng)絡(luò)的數(shù)據(jù)庫查詢開銷預(yù)測

    數(shù)據(jù)庫負(fù)載管理、性能調(diào)優(yōu)中,開銷預(yù)測模型是提高其效率的關(guān)鍵技術(shù).首先,由于數(shù)據(jù)庫系統(tǒng)的復(fù)雜性和計算機(jī)資源的競爭。很難精確地估計不同操作的開銷.其次。由于查詢計劃結(jié)構(gòu)的復(fù)雜性,現(xiàn)有研究更多使用籠統(tǒng)
    發(fā)表于 12-18 15:45 ?1次下載
    基于循環(huán)神經(jīng)網(wǎng)絡(luò)的數(shù)據(jù)庫查詢<b class='flag-5'>開銷</b>預(yù)測

    如何實(shí)現(xiàn)良好的RF性能與基本認(rèn)證

    在選擇天線或天線設(shè)計并定義機(jī)械規(guī)格之前無線產(chǎn)品產(chǎn)品設(shè)計師必須清楚地了解產(chǎn)品必須達(dá)到的RF性能目標(biāo),以便:在現(xiàn)場實(shí)現(xiàn)良好的RF性能,以確保市場成功。通過所有監(jiān)管和運(yùn)營商審批。性能?;靖?/div>
    的頭像 發(fā)表于 02-14 08:59 ?4111次閱讀

    AN4850_STM32擴(kuò)頻時鐘生成原理、性能與實(shí)現(xiàn)

    AN4850_STM32擴(kuò)頻時鐘生成原理、性能與實(shí)現(xiàn)
    發(fā)表于 11-21 17:06 ?8次下載
    AN4850_STM32擴(kuò)頻時鐘生成原理、<b class='flag-5'>性能與</b><b class='flag-5'>實(shí)現(xiàn)</b>

    影響高速信號鏈設(shè)計性能機(jī)制

    電子發(fā)燒友網(wǎng)站提供《影響高速信號鏈設(shè)計性能機(jī)制.pdf》資料免費(fèi)下載
    發(fā)表于 11-28 11:08 ?0次下載
    影響高速信號鏈設(shè)計<b class='flag-5'>性能</b>的<b class='flag-5'>機(jī)制</b>

    聆思CSK6芯片性能與應(yīng)用前景分析

    聆思CSK6芯片性能與應(yīng)用前景分析
    的頭像 發(fā)表于 05-15 09:11 ?1306次閱讀

    CPU單核性能與多核性能的區(qū)別

    CPU的單核性能與多核性能在多個方面存在顯著的差異,這些差異主要體現(xiàn)在處理能力、應(yīng)用場景、性能瓶頸以及技術(shù)發(fā)展等方面。以下是對兩者區(qū)別的詳細(xì)探討。
    的頭像 發(fā)表于 09-02 14:42 ?1.3w次閱讀