chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

1 KPTI概述

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

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

2 問(wèn)題

當(dāng)然事情并沒(méi)有那么簡(jiǎn)單,有兩個(gè)問(wèn)題:

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

問(wèn)題2:修改CR3時(shí),CPU會(huì)沖刷TLB,從而帶來(lái)很大的性能問(wèn)題

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

在KAISER的論文中針對(duì)這兩個(gè)問(wèn)題,提出了以下解決方案

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

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

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

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

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

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

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

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

4 性能與開(kāi)銷(xiāo)(performance and overhead)

4.1 TLB

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

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

頁(yè)號(hào)對(duì)應(yīng)頁(yè)的物理地址

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

頁(yè)屬性(dirty flag,memory type)

圖4-1 基于TLB的訪存過(guò)程

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

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

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

通過(guò)PCID的使用可以緩解由于沖刷TLB帶來(lái)的性能問(wèn)題。

4.2 Process-Context Identifiers(PCID)

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

Intel手冊(cè)對(duì)于TLB失效的行為作出了很詳細(xì)的解釋?zhuān)谑褂胢ov指令修改CR3時(shí)會(huì)使TLB失效(mov to CR3),具體行為如下:

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

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

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

5 代碼分析

我們選取linux4.15版本作為演示,說(shuō)明KPTI補(bǔ)丁的內(nèi)核中的分布這是4.15版本和PTI(pagetable isolation)有關(guān)的diff stat. 可以看到共涉及到45個(gè)文件的修改,插入了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)用。這個(gè)文件中的函數(shù)總共分為兩種,第一種類(lèi)似pti_clone_user_shared(),將內(nèi)核的頁(yè)表項(xiàng)復(fù)制到用戶空間。第二種類(lèi)似pti_user_pagetable_walk_p4d(unsigned long address),根據(jù)參數(shù)中的虛擬地址,得到該地址相應(yīng)的頁(yè)表項(xià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開(kāi)始。所以ASID是地址空間真正的標(biāo)示符。又因?yàn)檠a(bǔ)丁中進(jìn)程的地址空間有兩個(gè)部分,所以我們需要兩個(gè)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)用時(shí)的寄存器保存操作。系統(tǒng)調(diào)用涉及到由用戶態(tài)到內(nèi)核態(tài)的切換。所以calling.h需要修改。

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

1. SWITCH_TO_KERNEL_CR3

該宏的任務(wù)是清楚CR3存儲(chǔ)的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。這一切都在很短的時(shí)間內(nèi)發(fā)生,因?yàn)樗鼈冎皇菍?duì)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)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 處理器
    +關(guān)注

    關(guān)注

    68

    文章

    19896

    瀏覽量

    235363
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11511

    瀏覽量

    213872

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

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

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

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

    TMS37157無(wú)源低頻芯片的性能與簡(jiǎn)介

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

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

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

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

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

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

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

    SDH開(kāi)銷(xiāo)和指針

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

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

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

    UCGUI的性能與資源占用

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

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

    一種聯(lián)合編碼開(kāi)銷(xiāo)與安全性能的網(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'>開(kāi)銷(xiāo)</b>與安全<b class='flag-5'>性能</b>的網(wǎng)絡(luò)編碼優(yōu)化方案

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

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

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

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

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

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

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

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

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

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

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

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