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

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

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

3天內不再提示

meltdown產生的主要原因是CPU的投機執行

Linux閱碼場 ? 來源:未知 ? 作者:李倩 ? 2018-04-28 09:53 ? 次閱讀

1.meltdown的補丁:KPTI(X86和AARCH64)

meltdown產生的主要原因是CPU的投機執行(speculative execution)。本質上是硬件的漏洞,那么我們如何從軟件層面進行修復呢?

1.meltdown修復的出發點

在x86中,每個進程都有一張頁表,此頁表覆蓋內核空間+用戶空間地址,在用戶態執行時,頁表中也有內核空間的地址映射,所以才使得用戶空間非法訪問內核空間地址的代碼被投機執行(之后才收到page fault)。那么,修復漏洞最簡單有效的軟件手段就是讓CPU運行在用戶態的時候,頁表不覆蓋內核空間地址。

所以,為了修復漏洞,添加一張頁表,使用戶態一張頁表,內核態一張頁表,每次從用戶態切換到內核態時也切換頁表。但在用戶態運行時完全不覆蓋內核地址也不可行,因為發生中斷、系統調用和異常時,需要切入和換出內核空間,切入和換出接口的地址是內核空間的。所以,用戶態的頁表覆蓋修改為用戶態+內核態跳轉(trampoline),一旦系統調用發生,接口代碼負責立即將頁表切換成完整的覆蓋用戶態+內核態的頁表;從系統調用中出來時,再切換回覆蓋用戶態+內核態跳轉的頁表。如下圖所示:

可以看出,修復meldown后,如果應用中系統調用很多,運行時不斷的發生中斷,每次用戶態與內核態切換時就要完成頁表的切換,開銷會很大,性能也會下降。

在AARCH64中,本來就是兩張頁表,硬件上存在TTBR0,TTBR1兩個寄存器,TTBR0中填的頁表只覆蓋用戶空間,TTBR1中填的頁表只覆蓋內核空間。但AARCH64仍然存在meltdown的漏洞,因為TTBR1仍然是覆蓋整個內核空間的,在用戶態切換到內核空間時仍然可以投機訪問到內核空間的所有地址。

所以在AARCH64中修復meltdown漏洞,采取類似x86的方法,讓TTBR1中填的頁表不覆蓋全部的內核地址空間,引入第三張頁表(trampoline),也被TTBR1指向,但此頁表只指向中斷、系統調用、異常切入和換出內核的代碼,在切換用戶態/內核態時修改TTBR1的指向即可。如下圖所示:保證在user模式(EL0)運行時,沒有一張頁表可以覆蓋整個內核空間的地址。

2.內核與用戶交界點的安全性問題

i.為什么要檢查地址范圍?access_ok?

應用程序有無數種方法可以偽造一個指向內核態的指針,所以內核在訪問用戶數據時存在一系列安全問題。

kernel space在訪問user space時,必須判斷user space地址的合法性:

2.為什么要做access_ok

比如,將kernel space的一個數據a存放到user space的地址b(*b =a;),但如果不做access_ok的檢查,是不能確保地址b一定是user space的,這樣就可以通過用一個kernel space的地址偽裝成user space地址的方式,將kernel space地址的內容修改掉(*k = a)。這樣就有無數種方法將Linux Kernel攻陷,如修改代碼邏輯突破root權限等。

有很多漏洞都是誕生在kernel和user的交界點上,所以在交界點上一定要確保地址的合法性及使用copy_from/to_user。

更多安全漏洞參考:

CVE Details

https://www.cvedetails.com/product/47/Linux-Linux-Kernel

CVE-2017-5123漏洞

https://github.com/nongiach/CVE/tree/master/CVE-2017-5123

ii.copy_from/to_user等API

3.為什么要u_k copy

比如,kernel不能直接操作user space的數據,而是操作copy_from_user后的kernel space的副本。如果直接操作user space數據,而user space的程序是多線程的,某個線程就可以在操作user space數據過程中修改這塊數據,來實現對內核的攻擊。

i.阻止內核訪問用戶的PAN和SMAP

最保險的方法是讓userspace完全不能訪問kernel space,但這是不可行的。次安全的方法,比如硬件上提供一個開關,每次在kernel space中訪問user space時打開,訪問后關閉,即可把kernel space對user space的訪問限制在copy_from/to_user這樣的API中。ARM中的PAN及x86中的SMAP即為實現此功能的機制。

3.內存碎片避免

什么是碎片?

Internal fragmentation:申請32個字節,但是buddy要給1頁-> slab。

External fragmentation : 申請2n連續頁,但是系統盡管空閑內存很多,由于非連續,也無法滿足。

內存連續的好處:一方面可服務需要連續內存的申請(如CMA本身就需要連續內存);另一方面,利用MMU支持巨頁的技術,提高TLB命中率,內存訪問遍歷Page table的開銷被減小。

早期的buddy算法不區分申請內存的類型,如下圖紅色頁面被不可移動的頁申請走,如內核中kmalloc申請內存。但周圍很多頁都是空閑的,并且紅色的頁面一直不釋放,導致紅色頁面和空閑白色頁面無法合并到一起。所以,Linux后期采用將不可移動的頁面與可移動的頁面分開,將空閑的內存分為可移動(一般為用戶程序的內存),可回收(一般為文件系統的緩存),不可移動(一般為kernel的內存)。這樣避免了不可移動的與可移動的頁面混合在一起,從而使可移動的頁面能夠merge在一起,提供出更大的連續內存。

4.分migration type的意義

如上圖所示,在每個ZONE的空閑內存free list中,分成UNMOVABLE、MOVABLE、RECLAIMABLE類型,分別管理,注意此三種類型的內存一直在動態的變化。比如,Linux剛剛啟動時,默認情況下內存都是可移動的,此時有內核模塊調用kmalloc申請一頁不可移動內存,Linux內核不會只從可移動內存中申請一頁作為不可移動的,而是一次性申請出較大一塊內存作為不可移動的使用(如210個頁面),所以可移動的則不再會被不可移動的所污染。如果210個頁面不夠用,則再次申請出一塊作為不可移動內存使用。同時,不可移動的內存不再使用時也會被釋放,釋放掉后仍然可再次作為可移動的內存(fallback)。

如上圖紅色行所示,比如申請不可移動內存,但此時沒有,則會先從可回收中去找,可回收中還是找不到則從可移動中去找。

CMA比較特殊,如下圖代碼所示,可移動的如果申請不到則會從CMA中去找,如果CMA中也申請不到,則會從fallback表中尋找內存(上圖中綠色行所示)。

(對應第一次課:CMA內存在不使用時,會服務于可移動頁面的內存申請。)

Linux內核中“內存緊湊技術”,類似于磁盤碎片整理。當申請比較大的連續內存時或申請巨頁時,內核啟用Memory compaction機制,如下圖所示:紅色部分為被申請掉的內存,白色的部分為空閑內存。Memory compaction將前面的紅色部分移動到后面的白色部分,使空閑內存變連續。

如下圖所示,在echo 1 > compact_memory后可以看出低階的空閑內存變少,而高階的空閑內存變多。

總結

migrate type是anti-fragmentation:申請內存時歸類,把可移動與不可移動的分開,屬于一種預防技術。

compaction是de-fragmentation:已經發生碎片,做整理。

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

    關注

    68

    文章

    10863

    瀏覽量

    211782
  • Linux
    +關注

    關注

    87

    文章

    11304

    瀏覽量

    209524
  • 內存管理
    +關注

    關注

    0

    文章

    168

    瀏覽量

    14141

原文標題:郝健: Linux內存管理學習筆記-第6節課

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

收藏 人收藏

    評論

    相關推薦

    尖峰電流的形成,產生尖峰電流的主要原因

    尖峰電流的形成產生尖峰電流的主要原因尖峰電流的抑制方法
    發表于 03-16 11:57

    產生EMI干擾的主要原因是什么?

    產生EMI干擾的主要原因是什么?EMI干擾分為哪幾類?
    發表于 04-25 09:53

    PCB加工電鍍金層發黑的主要原因是什么?

    PCB加工電鍍金層發黑的主要原因是什么?
    發表于 04-26 06:59

    噪聲產生主要原因是什么?如何排除噪聲?

    噪聲產生主要原因是什么?如何排除噪聲?
    發表于 06-04 06:13

    變換系統中發生腐蝕的主要原因是什么?

    變換系統中發生腐蝕的主要原因是什么?氨合成反應分為哪幾種反應?
    發表于 07-22 07:11

    電子設備誤動作的主要原因是什么

    什么是諧波電壓?電子設備誤動作的主要原因是什么?
    發表于 09-26 07:28

    斬波電路電流能夠連續的主要原因是什么?

    斬波電路電流能夠連續的主要原因是什么?
    發表于 05-11 17:08

    電池膨脹主要原因

    電池膨脹主要原因 不同種類的電池,產生膨脹的原因是不一
    發表于 10-19 14:20 ?5676次閱讀

    電動車電池膨脹主要原因

    電動車電池膨脹主要原因     不同種類的電池,產生膨脹的原因是不一樣的,針對
    發表于 11-11 09:27 ?7436次閱讀

    LED為什么會產生熱量?LED發熱的幾個主要原因是什么?

    LED為什么會產生熱量?LED發熱的幾個主要原因是什么? 與傳統光源一樣,半導體發光二極體(LED)在工作期間也會產生熱量,其多少
    發表于 11-13 10:01 ?3269次閱讀

    產生Congestion的主要原因

    Congestion也分為幾種情況,和前端密切相關的是Logic Congestion(更多關于后端Congetsion問題,查看文末參考文章),主要原因是RTL設計問題導致,這種問題的現象從后端看上去就是Cell數沒多少,就是線密。
    的頭像 發表于 08-18 10:57 ?2039次閱讀

    錫膏焊接后PCBA焊點產生空洞的原因是什么?

    從SMT貼片加工的角度來看,空洞率是不可避免的。任何廠家也不能說自己的貼片焊接焊點沒有一點空洞。那么空洞是怎么產生的呢?空洞的原因是什么?通過佳金源錫膏廠家的工程師解釋,空洞的產生主要原因
    的頭像 發表于 09-25 17:26 ?1321次閱讀
    錫膏焊接后PCBA焊點<b class='flag-5'>產生</b>空洞的<b class='flag-5'>原因是</b>什么?

    放大電路中產生零點漂移的主要原因是什么

    放大電路中產生零點漂移的主要原因是什么? 放大電路是電子設備中常用的一種電路,用于放大信號的幅度。然而,放大電路中常常會出現零點漂移的問題,即輸出信號在沒有輸入信號時并不為零,而是存在一個偏移值
    的頭像 發表于 02-06 15:23 ?3455次閱讀

    焊接質量缺陷產生主要原因

    創想焊縫跟蹤小編將與大家一起探討焊接質量缺陷產生主要原因。 材料選擇不當 焊接質量缺陷的主要原因之一是材料選擇不當。焊接材料包括焊條、電極、焊絲、焊劑等,如果選擇的焊接材料與基材不匹配,或者焊接材料的質量
    的頭像 發表于 05-15 09:41 ?665次閱讀
    焊接質量缺陷<b class='flag-5'>產生</b>的<b class='flag-5'>主要原因</b>

    華納云:企業遷移到云端的主要原因是什么?

    企業遷移到云端的主要原因是什么?原因不止一個。削減成本通常被認為是主要原因——但盡管通過云遷移降低成本無疑是一種誘人的可能性,但創新潛力才是更大的獎勵。云計算通過支持企業創新而產生的價
    的頭像 發表于 09-14 17:38 ?290次閱讀
    主站蜘蛛池模板: 亚洲一区二区三区高清| 日韩特级片| 日本黄色激情视频| 国产二三区| 伊在线视频| 日本xxxx18vr69| 亚洲国产色婷婷精品综合在线观看| 免费日韩毛片| 天天插狠狠干| 女人本色高清在线观看wwwwww国产| 种子在线搜索| 久久e| 久久狠狠第一麻豆婷婷天天| 扒开末成年粉嫩的小缝强文| 四虎影视最新| freesexvideo性大全| 视频 在线| 色多多最新地址福利地址| 可以免费看的黄色片| 片免费观看在线看| vvvv98国产成人综合青青| 日韩一级精品视频在线观看| 亚洲午夜精品久久久久久成年 | 男啪女色黄无遮挡免费观看| 2021色噜噜狠狠综曰曰曰| 黄色一级毛片看一级毛片| 天天撸夜夜操| 99热.com| 成年片免费网址网站| 在线视频毛片| 农村女人的一级毛片| 国产美女视频爽爽爽| 国产精品一区在线播放| 好硬好大好爽女房东在线观看| 亚洲欧美啪啪| 欧美色综合高清视频在线| 九草伊人| 三级网站免费| 久热福利视频| 色狠狠网| 精品精品国产理论在线观看|