色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

KPTI實現機制及性能與開銷

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

1 KPTI概述

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

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

2 問題

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

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

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

3 KPTI實現機制

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

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

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

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

用戶空間和內核空間的PGD分布示意圖

3.2 內核空間的最小映射

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

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

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

4 性能與開銷(performance and overhead)

4.1 TLB

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

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

頁號對應頁的物理地址

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

頁屬性(dirty flag,memory type)

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

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

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

有兩種方法防止數據的泄露,第一種需要沖刷整個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關聯的TLB緩存項(TLB entry)失效,除了全局頁。

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

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

5 代碼分析

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

增加代碼行數的前三名是

mm/pti.c

arch/x86/include/asm/tlbflush.h

arch/x86/entry/calling.h

5.1 arch/x86/mm/pti.c

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

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的函數在KPTI中并不僅僅使用PCID,由于內核中的進程地址空間標示符必須從0開始。所以ASID是地址空間真正的標示符。又因為補丁中進程的地址空間有兩個部分,所以我們需要兩個PCID。kPCID內核空間使用的標示符。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 是系統調用的入口函數,用于處理系統調用時的寄存器保存操作。系統調用涉及到由用戶態到內核態的切換。所以calling.h需要修改。

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

1. SWITCH_TO_KERNEL_CR3

該宏的任務是清楚CR3存儲的PCID,并將CR3的第13置1,從而使其指向內核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該宏的任務是根據進程的ASID判斷其TLB是否需要flush, 如果不需要就在CR3中標記為no_flush。隨后將kPCID轉換為uPCID,并使CR3指向用戶PGD。這一切都在很短的時間內發生,因為它們只是對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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 處理器
    +關注

    關注

    68

    文章

    19312

    瀏覽量

    230033
  • Linux
    +關注

    關注

    87

    文章

    11312

    瀏覽量

    209701

原文標題:KPTI補丁分析

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

收藏 人收藏

    評論

    相關推薦

    WIFI的跳頻機制怎么實現的?

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

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

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

    關于C++中的函數重載機制

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

    智能電機控制優化實時性能與效率設計介紹

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

    ESP8266的性能與指標以及開發環境的搭建

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

    SDH開銷和指針

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

    頻間硬切換實現機制,以及對RNC性能的影響

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

    UCGUI的性能與資源占用

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

    聯合編碼開銷與安全性能的網絡編碼優化方案

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

    基于循環神經網絡的數據庫查詢開銷預測

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

    如何實現良好的RF性能與基本認證

    在選擇天線或天線設計并定義機械規格之前無線產品產品設計師必須清楚地了解產品必須達到的RF性能目標,以便:在現場實現良好的RF性能,以確保市場成功。通過所有監管和運營商審批。性能?;靖?/div>
    的頭像 發表于 02-14 08:59 ?3683次閱讀

    AN4850_STM32擴頻時鐘生成原理、性能與實現

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

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

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

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

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

    CPU單核性能與多核性能的區別

    CPU的單核性能與多核性能在多個方面存在顯著的差異,這些差異主要體現在處理能力、應用場景、性能瓶頸以及技術發展等方面。以下是對兩者區別的詳細探討。
    的頭像 發表于 09-02 14:42 ?6913次閱讀
    主站蜘蛛池模板: 国产 高清 无码 在线播放| 黄色天堂网| 男人边吃奶边挵进去呻吟漫画| 2018国产天天弄谢| 琪琪SEE色原网色原网站18| 岛国大片在线播放免费| 亚洲国产在线精品国偷产拍| 久久综合丁香激情久久| 二级片免费看| 一本到高清视频在线观看三区| 男女又黄又刺激B片免费网站| 高H内射NP古文| 伊人久久综在合线亚洲| 日本十八禁无遮拦啪啪漫画| 国产在线观看黄| 99久久国产综合色| 星空无限传媒视频在线观看视频| 久久综合网久久综合| 啊…嗯啊好深男男高h文| 亚洲第一综合天堂另类专| 美女脱了内裤张开腿让男人桶到爽| 粉色视频午夜网站入口| 在线观看国产精选免费| 四虎永久免费| 麻豆影视在线直播观看免费 | 一个人免费观看HD完整版| 欧美人与动交zOZ0| 好紧的小嫩嫩17p| 成人免费观看www视频| 影音先锋亚洲AV少妇熟女| 四虎国产精品高清在线观看| 两百磅美女| 国产女人乱人伦精品一区二区 | 欧美日韩免费看| 精品一区二区三区四区五区六区| 成人无码精品一区二区在线观看| 影音先锋 av天堂| 亚洲国产果果在线播放在线| 热久久免费频精品99热| 浪荡女天天不停挨CAO日常视| 国产剧情福利AV一区二区|