在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

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

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

Linux閱碼場 ? 來源:未知 ? 作者:龔婷 ? 2018-03-13 16:30 ? 次閱讀

1 KPTI概述

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

圖1 修改后的進程地址空間

2 問題

當然事情并沒有那么簡單,有兩個問題:

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

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

3 KPTI實現(xiàn)機制

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

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

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

當中斷在用戶態(tài)發(fā)生時,就涉及到切換CR3寄存器,從影子地址空間切換到用戶態(tài)的地址空間。中斷上半部的要求是盡可能的快,從而切換CR3這個操作也要求盡可能的快。為了達到這個目的,KAISER中將內(nèi)核空間的PGD和用戶空間的PGD連續(xù)的放置在一個8KB的內(nèi)存空間中。這段空間必須是8K對齊的,這樣將CR3的切換操作轉換為將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的進程的地址空間。圖b和圖c是頁表隔離后的進程地址空間,兩者的區(qū)別再與是否使用了SMAP和SMEP機制。

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

4 性能與開銷(performance and overhead)

4.1 TLB

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

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

頁號對應頁的物理地址

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

頁屬性(dirty flag,memory type)

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

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

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

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

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

4.2 Process-Context Identifiers(PCID)

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

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

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

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

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

5 代碼分析

我們選取linux4.15版本作為演示,說明KPTI補丁的內(nèi)核中的分布這是4.15版本和PTI(pagetable isolation)有關的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是補丁新增的文件. 其中的入口函數(shù)是pti_init(), 該函數(shù)在init/main.c中的mm_init()函數(shù)中調(diào)用。這個文件中的函數(shù)總共分為兩種,第一種類似pti_clone_user_shared(),將內(nèi)核的頁表項復制到用戶空間。第二種類似pti_user_pagetable_walk_p4d(unsigned long address),根據(jù)參數(shù)中的虛擬地址,得到該地址相應的頁表項指針。

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

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

* 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的切換. 下面我們挑選幾個宏進行說明:

1. SWITCH_TO_KERNEL_CR3

該宏的任務是清楚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該宏的任務是根據(jù)進程的ASID判斷其TLB是否需要flush, 如果不需要就在CR3中標記為no_flush。隨后將kPCID轉換為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)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 處理器
    +關注

    關注

    68

    文章

    19813

    瀏覽量

    233626
  • Linux
    +關注

    關注

    87

    文章

    11465

    瀏覽量

    212840

原文標題:KPTI補丁分析

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

收藏 人收藏

    評論

    相關推薦
    熱點推薦

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

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

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

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

    關于C++中的函數(shù)重載機制

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

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

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

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

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

    SDH開銷和指針

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

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

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

    UCGUI的性能與資源占用

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

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

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

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

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

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

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

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

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

    影響高速信號鏈設計性能機制

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

    聆思CSK6芯片性能與應用前景分析

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

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

    CPU的單核性能與多核性能在多個方面存在顯著的差異,這些差異主要體現(xiàn)在處理能力、應用場景、性能瓶頸以及技術發(fā)展等方面。以下是對兩者區(qū)別的詳細探討。
    的頭像 發(fā)表于 09-02 14:42 ?1.2w次閱讀
    主站蜘蛛池模板: 1024手机看片国产旧版你懂的 | 国产又粗又大又爽又免费 | 97色偷偷| 一级aaaaa毛片免费视频 | 日本黄视频在线播放 | 成年大片免费视频播放手机不卡 | 天天综合网久久 | 亚洲一区在线免费观看 | 色午夜影院 | 国产黄大片在线观看 | 成年女人毛片 | 久久思re热9一区二区三区 | 天天舔天天爽 | 国产农村妇女毛片精品久久久 | 久久精品香蕉视频 | 日韩欧美卡一卡二卡新区 | 成人在线网站 | 日日摸人人看97人人澡 | 天天做天天添婷婷我也去 | 免费一级成人毛片 | 欧美成人3d动漫在线播放网站 | 男人和女人做免费做爽爽视频 | 亚洲一区二区三区高清 | 海棠高h粗暴调教双性男男 韩国韩宝贝2020vip福利视频 | 加勒比精品久久一区二区三区 | 男操女免费视频 | 亚洲狠狠色丁香婷婷综合 | 久久久久国产精品免费免费 | 欧美福利在线播放 | 九九re| 国产精品9999久久久久仙踪林 | 在线视频这里只有精品 | 日韩第五页 | 色噜噜综合网 | 国产一级αv片免费观看 | 欧美一级片网址 | 成年人三级视频 | 综合色区 | 天天草综合 | 午夜啪 | 天堂电影在线观看免费入口 |