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

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

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

3天內不再提示

MMU和TLB原理相關

馬哥Linux運維 ? 來源:馬哥Linux運維 ? 作者:馬哥Linux運維 ? 2022-05-24 10:17 ? 次閱讀

073a94aa-da9d-11ec-ba43-dac502259ad0.png

最近在極客星球群里討論內存缺頁中斷問題,討論到了MMU和TLB原理相關的:

07613fc4-da9d-11ec-ba43-dac502259ad0.png

078e38da-da9d-11ec-ba43-dac502259ad0.png

今天就分享一篇TLB的好文章,希望大家夯實基本功,讓我們一起深入理解計算機系統。

TLB是translation lookaside buffer的簡稱。首先,我們知道MMU的作用是把虛擬地址轉換成物理地址。

07b397a6-da9d-11ec-ba43-dac502259ad0.jpg

MMU工作原理

虛擬地址和物理地址的映射關系存儲在頁表中,而現在頁表又是分級的。64位系統一般都是3~5級。常見的配置是4級頁表,就以4級頁表為例說明。分別是PGD、PUD、PMD、PTE四級頁表。在硬件上會有一個叫做頁表基地址寄存器,它存儲PGD頁表的首地址。

07fc2750-da9d-11ec-ba43-dac502259ad0.jpg

Linux分頁機制

MMU就是根據頁表基地址寄存器從PGD頁表一路查到PTE,最終找到物理地址(PTE頁表中存儲物理地址)。這就像在地圖上顯示你的家在哪一樣,我為了找到你家的地址,先確定你是中國,再確定你是某個省,繼續往下某個市,最后找到你家是一樣的原理。一級一級找下去。這個過程你也看到了,非常繁瑣。如果第一次查到你家的具體位置,我如果記下來你的姓名和你家的地址。下次查找時,是不是只需要跟我說你的姓名是什么,我就直接能夠告訴你地址,而不需要一級一級查找。四級頁表查找過程需要四次內存訪問。延時可想而知,非常影響性能。頁表查找過程的示例如下圖所示。以后有機會詳細展開,這里了解下即可。

081e9b46-da9d-11ec-ba43-dac502259ad0.jpg

page table walk

TLB的本質是什么

TLB其實就是一塊高速緩存。數據cache緩存地址(虛擬地址或者物理地址)和數據。TLB緩存虛擬地址和其映射的物理地址。TLB根據虛擬地址查找cache,它沒得選,只能根據虛擬地址查找。所以TLB是一個虛擬高速緩存。硬件存在TLB后,虛擬地址到物理地址的轉換過程發生了變化。虛擬地址首先發往TLB確認是否命中cache,如果cache hit直接可以得到物理地址。否則,一級一級查找頁表獲取物理地址。并將虛擬地址和物理地址的映射關系緩存到TLB中。既然TLB是虛擬高速緩存(VIVT),是否存在別名和歧義問題呢?如果存在,軟件和硬件是如何配合解決這些問題呢?

TLB的特殊

虛擬地址映射物理地址的最小單位是4KB。所以TLB其實不需要存儲虛擬地址和物理地址的低12位(因為低12位是一樣的,根本沒必要存儲)。另外,我們如果命中cache,肯定是一次性從cache中拿出整個數據。所以虛擬地址不需要offset域。index域是否需要呢?這取決于cache的組織形式。如果是全相連高速緩存。那么就不需要index。如果使用多路組相連高速緩存,依然需要index。下圖就是一個四路組相連TLB的例子。現如今64位CPU尋址范圍并沒有擴大到64位。64位地址空間很大,現如今還用不到那么大。因此硬件為了設計簡單或者解決成本,實際虛擬地址位數只使用了一部分。這里以48位地址總線為了例說明。

083bb87a-da9d-11ec-ba43-dac502259ad0.jpg

TLB的別名問題

我先來思考第一個問題,別名是否存在。我們知道PIPT的數據cache不存在別名問題。物理地址是唯一的,一個物理地址一定對應一個數據。但是不同的物理地址可能存儲相同的數據。也就是說,物理地址對應數據是一對一關系,反過來是多對一關系。由于TLB的特殊性,存儲的是虛擬地址和物理地址的對應關系。因此,對于單個進程來說,同一時間一個虛擬地址對應一個物理地址,一個物理地址可以被多個虛擬地址映射。將PIPT數據cache類比TLB,我們可以知道TLB不存在別名問題。而VIVT Cache存在別名問題,原因是VA需要轉換成PA,PA里面才存儲著數據。中間多經傳一手,所以引入了些問題。

TLB的歧義問題

我們知道不同的進程之間看到的虛擬地址范圍是一樣的,所以多個進程下,不同進程的相同的虛擬地址可以映射不同的物理地址。這就會造成歧義問題。例如,進程A將地址0x2000映射物理地址0x4000。進程B將地址0x2000映射物理地址0x5000。當進程A執行的時候將0x2000對應0x4000的映射關系緩存到TLB中。當切換B進程的時候,B進程訪問0x2000的數據,會由于命中TLB從物理地址0x4000取數據。這就造成了歧義。如何消除這種歧義,我們可以借鑒VIVT數據cache的處理方式,在進程切換時將整個TLB無效。切換后的進程都不會命中TLB,但是會導致性能損失。

如何盡可能的避免flush TLB

首先需要說明的是,這里的flush理解成使無效的意思。我們知道進程切換的時候,為了避免歧義,我們需要主動flush整個TLB。如果我們能夠區分不同的進程的TLB表項就可以避免flush TLB。

我們知道Linux如何區分不同的進程?每個進程擁有一個獨一無二的進程ID。如果TLB在判斷是否命中的時候,除了比較tag以外,再額外比較進程ID該多好呢!這樣就可以區分不同進程的TLB表項。進程A和B雖然虛擬地址一樣,但是進程ID不一樣,自然就不會發生進程B命中進程A的TLB表項。所以,TLB添加一項ASID(Address Space ID)的匹配。ASID就類似進程ID一樣,用來區分不同進程的TLB表項。這樣在進程切換的時候就不需要flush TLB。但是仍然需要軟件管理和分配ASID。

0866bb06-da9d-11ec-ba43-dac502259ad0.jpg

如何管理ASID

ASID和進程ID肯定是不一樣的,別混淆二者。進程ID取值范圍很大。但是ASID一般是8或16 bit。所以只能區分256或65536個進程。我們的例子就以8位ASID說明。所以我們不可能將進程ID和ASID一一對應,我們必須為每個進程分配一個ASID,進程ID和每個進程的ASID一般是不相等的。每創建一個新進程,就為之分配一個新的ASID。當ASID分配完后,flush所有TLB,重新分配ASID。

所以,如果想完全避免flush TLB的話,理想情況下,運行的進程數目必須小于等于256。然而事實并非如此,因此管理ASID上需要軟硬結合。Linux kernel為了管理每個進程會有個task_struct結構體,我們可以把分配給當前進程的ASID存儲在這里。頁表基地址寄存器有空閑位也可以用來存儲ASID。當進程切換時,可以將頁表基地址和ASID(可以從task_struct獲得)共同存儲在頁表基地址寄存器中。當查找TLB時,硬件可以對比tag以及ASID是否相等(對比頁表基地址寄存器存儲的ASID和TLB表項存儲的ASID)。如果都相等,代表TLB hit。否則TLB miss。當TLB miss時,需要多級遍歷頁表,查找物理地址。然后緩存到TLB中,同時緩存當前的ASID。

多個進程共享

我們知道內核空間和用戶空間是分開的,并且內核空間是所有進程共享。既然內核空間是共享的,進程A切換進程B的時候,如果進程B訪問的地址位于內核空間,完全可以使用進程A緩存的TLB。但是現在由于ASID不一樣,導致TLB miss。

我們針對內核空間這種全局共享的映射關系稱之為global映射。針對每個進程的映射稱之為non-global映射。所以,我們在最后一級頁表中引入一個bit(non-global (nG) bit)代表是不是global映射。當虛擬地址映射物理地址關系緩存到TLB時,將nG bit也存儲下來。當判斷是否命中TLB時,當比較tag相等時,再判斷是不是global映射,如果是的話,直接判斷TLB hit,無需比較ASID。當不是global映射時,最后比較ASID判斷是否TLB hit。

08865434-da9d-11ec-ba43-dac502259ad0.jpg

什么時候應該flush TLB

我們再來最后的總結,什么時候應該flush TLB。

當ASID分配完的時候,需要flush全部TLB,ASID的管理可以使用bitmap管理,flush TLB后clear整個bitmap。

當我們建立頁表映射的時候,就需要flush虛擬地址對應的TLB表項。

第一印象可能是修改頁表映射的時候才需要flush TLB,但是實際情況是只要建立映射就需要flush TLB。原因是,建立映射時你并不知道之前是否存在映射,例如,建立虛擬地址A到物理地址B的映射,我們并不知道之前是否存在虛擬地址A到物理地址C的映射情況,所以就統一在建立映射關系的時候flush TLB。

審核編輯 :李倩

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

    關注

    31

    文章

    5401

    瀏覽量

    122802
  • 計算機系統
    +關注

    關注

    0

    文章

    290

    瀏覽量

    24472
  • MMU
    MMU
    +關注

    關注

    0

    文章

    92

    瀏覽量

    18575

原文標題:深入理解TLB原理

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    電源箱的相關技術

    電源箱相關技術發展創新 ? 電源箱作為電力系統的重要組成部分,其技術發展與創新一直備受關注。以下是電源箱相關技術的主要發展創新點: ? 一、智能化技術 ? ? 智能監控與管理 ?:隨著物聯網(IoT
    的頭像 發表于 03-10 15:56 ?200次閱讀

    請問jh7110的MMU TLB是否緩存無效PTE?是否支持ASID?

    jh7110的MMU TLB是否緩存無效PTE?是否支持ASID?
    發表于 03-10 07:20

    先進封裝中TSV工藝需要的相關設備

    Hello,大家好,我們來分享下先進封裝中TSV需要的相關設備。
    的頭像 發表于 02-19 16:39 ?689次閱讀
    先進封裝中TSV工藝需要的<b class='flag-5'>相關</b>設備

    32位單片機相關資料和解決方案參考指南

    電子發燒友網站提供《32位單片機相關資料和解決方案參考指南.pdf》資料免費下載
    發表于 01-21 14:00 ?0次下載
    32位單片機<b class='flag-5'>相關</b>資料和解決方案參考指南

    Vishay發布新款精密薄膜MELF電阻

    近日,威世科技(Vishay Intertechnology, Inc.)宣布正式推出三款經過AEC-Q200認證的精密薄膜MELF電阻,分別為MMU 0102、MMA 0204和MMB 0207
    的頭像 發表于 12-24 10:53 ?441次閱讀

    昂寶單片機相關資料

    昂寶單片機相關資料
    發表于 11-25 14:50 ?0次下載

    合宙LuatOS應用,與時間相關那些事

    ()函數了。 接下來,我會講一些與這個函數以及其他時間函數相關的知識。 一、時間戳相關 os.time()這個函數,只能獲取當前時間戳;如果客戶希望獲取的是當前時間,即相應的年月日時分秒,可以使用os.date()函數。 參考下面的示例**:** ? 關于位數: 比較遺憾
    的頭像 發表于 09-25 07:25 ?517次閱讀
    合宙LuatOS應用,與時間<b class='flag-5'>相關</b>那些事

    ad怎么把原理圖和pcb相關

    在Altium Designer(簡稱AD)中,將原理圖和PCB相關聯是一個重要的設計步驟,它確保了從邏輯設計到物理實現的順利過渡。以下是實現原理圖和PCB相關聯的步驟: 一、分配元件封裝 檢查并
    的頭像 發表于 09-02 16:34 ?1.2w次閱讀

    針對小站應用AFE77xx的相關應用細則

    電子發燒友網站提供《針對小站應用AFE77xx的相關應用細則.pdf》資料免費下載
    發表于 08-28 10:55 ?0次下載
    針對小站應用AFE77xx的<b class='flag-5'>相關</b>應用細則

    TI模擬前端(AFE)被動均衡的介紹及相關考慮

    電子發燒友網站提供《TI模擬前端(AFE)被動均衡的介紹及相關考慮.pdf》資料免費下載
    發表于 08-27 11:30 ?0次下載
    TI模擬前端(AFE)被動均衡的介紹及<b class='flag-5'>相關</b>考慮

    相關器抑制干擾信號的原理是什么

    相關器抑制干擾信號的原理主要基于信號的相關特性,特別是在擴頻通信等應用中,其過程可以概括為以下幾點: 一、基本原理 相關器,也稱為相關接收器,利用信號的自
    的頭像 發表于 08-08 11:23 ?1151次閱讀

    ESP32-DOWD代碼燒寫后不斷報錯怎么解決?

    div:2 load:0x3fff0030,len:6732 ho 0 tail 12 room 4 load:0x80000000,len:970735623 1150 mmu set
    發表于 06-20 06:31

    esp32-c3燒efuse復位后無法計算sha256,必須重新上電,為什么?

    chip detected by RDID (00204016), skip. D (32) bootloader_flash: mmu set block paddr=0x00000000
    發表于 06-19 07:00

    請問ESP32如何實現Flash到ram重映射這種功能呢?

    拷貝到對應ram內存中,當在線標定時,會直接操作ram中相應的地址,以實現參數在線修改。 請問ESP32如何實現Flash到ram重映射這種功能呢? 通常的做法是使用重映射,或者使用mmu。 但是esp32的mmu無法將flash地址重映射到指定的ram區域里。
    發表于 06-14 06:31

    TLB成功開發出CXL內存模塊PCB,并向三星和SK海力士提供首批樣品

    近日,韓國上市PCB制造商TLB (KOSDAQ:356860)成功開發出CXL內存模塊PCB,并已獨家向三星電子和SK海力士提供了6款以上的首批樣品。
    的頭像 發表于 05-30 11:30 ?1206次閱讀
    主站蜘蛛池模板: 三级网站视频 | 色综合久久中文字幕网 | 欧美一级在线观看 | 手机在线完整视频免费观看 | 激情久久久久久久久久 | 免费播放视频 | 宅男69免费永久网站 | 最新人妖shemaletube人妖 最新日本免费一区二区三区中文 | 亚洲成年人免费网站 | 中文字幕va | 激情五月综合婷婷 | 思思久99久女女精品 | 麻豆国产三级在线观看 | 国产性夜夜春夜夜爽 | 狠狠色噜噜噜噜狠狠狠狠狠狠奇米 | www.黄黄黄 | 成人v片| 黄色网 在线播放 | 一级毛片视屏 | 97人摸人人澡人人人超一碰 | 2017亚洲男人天堂 | 色老头在线精品视频在线播放 | 中文字幕日韩三级 | 久青草国产在线视频_久青草免 | 天天色综合久久 | 羞羞视频靠逼视频大全 | 成人在线观看网站 | 麒麟色欧美影院在线播放 | 国模在线观看 | 91久久夜色精品国产网站 | 亚洲伊人久久大香线蕉结合 | 狠狠色噜噜综合社区 | 欧美人与物另类 | 男人的天堂一区二区视频在线观看 | 国产精品毛片一区二区三区 | 天天做天天爱夜夜爽 | xx肥妇人爽妇网 | 天堂中文在线免费观看 | 日韩视频 中文字幕 视频一区 | 黄色一级片视频 | 免费日本黄色网址 |