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

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

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

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

MMU和TLB原理相關(guān)

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

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

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

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

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

今天就分享一篇TLB的好文章,希望大家夯實(shí)基本功,讓我們一起深入理解計(jì)算機(jī)系統(tǒng)。

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

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

MMU工作原理

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

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

Linux分頁機(jī)制

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

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

page table walk

TLB的本質(zhì)是什么

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

TLB的特殊

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

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

TLB的別名問題

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

TLB的歧義問題

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

如何盡可能的避免flush TLB

首先需要說明的是,這里的flush理解成使無效的意思。我們知道進(jìn)程切換的時(shí)候,為了避免歧義,我們需要主動(dòng)flush整個(gè)TLB。如果我們能夠區(qū)分不同的進(jìn)程的TLB表項(xiàng)就可以避免flush TLB。

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

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

如何管理ASID

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

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

多個(gè)進(jìn)程共享

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

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

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

什么時(shí)候應(yīng)該flush TLB

我們再來最后的總結(jié),什么時(shí)候應(yīng)該flush TLB。

當(dāng)ASID分配完的時(shí)候,需要flush全部TLB,ASID的管理可以使用bitmap管理,flush TLB后clear整個(gè)bitmap。

當(dāng)我們建立頁表映射的時(shí)候,就需要flush虛擬地址對應(yīng)的TLB表項(xiàng)。

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

審核編輯 :李倩

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5362

    瀏覽量

    120900
  • 計(jì)算機(jī)系統(tǒng)

    關(guān)注

    0

    文章

    289

    瀏覽量

    24161
  • MMU
    MMU
    +關(guān)注

    關(guān)注

    0

    文章

    91

    瀏覽量

    18331

原文標(biāo)題:深入理解TLB原理

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    32位單片機(jī)相關(guān)資料和解決方案參考指南

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

    Vishay發(fā)布新款精密薄膜MELF電阻

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

    昂寶單片機(jī)相關(guān)資料

    昂寶單片機(jī)相關(guān)資料
    發(fā)表于 11-25 14:50 ?0次下載

    合宙LuatOS應(yīng)用,與時(shí)間相關(guān)那些事

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

    ad怎么把原理圖和pcb相關(guān)聯(lián)

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

    TI模擬前端(AFE)被動(dòng)均衡的介紹及相關(guān)考慮

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

    相關(guān)器抑制干擾信號(hào)的原理是什么

    相關(guān)器抑制干擾信號(hào)的原理主要基于信號(hào)的相關(guān)特性,特別是在擴(kuò)頻通信等應(yīng)用中,其過程可以概括為以下幾點(diǎn): 一、基本原理 相關(guān)器,也稱為相關(guān)接收器,利用信號(hào)的自
    的頭像 發(fā)表于 08-08 11:23 ?780次閱讀

    ESP32-DOWD代碼燒寫后不斷報(bào)錯(cuò)怎么解決?

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

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

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

    請問ESP32如何實(shí)現(xiàn)Flash到ram重映射這種功能呢?

    拷貝到對應(yīng)ram內(nèi)存中,當(dāng)在線標(biāo)定時(shí),會(huì)直接操作ram中相應(yīng)的地址,以實(shí)現(xiàn)參數(shù)在線修改。 請問ESP32如何實(shí)現(xiàn)Flash到ram重映射這種功能呢? 通常的做法是使用重映射,或者使用mmu。 但是esp32的mmu無法將flash地址重映射到指定的ram區(qū)域里。
    發(fā)表于 06-14 06:31

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

    近日,韓國上市PCB制造商TLB (KOSDAQ:356860)成功開發(fā)出CXL內(nèi)存模塊PCB,并已獨(dú)家向三星電子和SK海力士提供了6款以上的首批樣品。
    的頭像 發(fā)表于 05-30 11:30 ?880次閱讀

    請問STM32MP13X的MMU和Cache如何使能?

    STM32MP13X的MMU和Cache如何使能?修改了hal_conf里的DATA_CACHE_ENABLE的宏console里還是顯示沒開,在設(shè)置里的Define symbols把NO_CACHE_USE刪了好像還是不行。。。
    發(fā)表于 03-12 06:46

    鴻蒙輕內(nèi)核源碼分析:MMU 協(xié)處理器

    ? Cortex?-A Series Version: 4.0 Programmer’s Guide》。 在這些 C15 寄存器中和 MMU 關(guān)系較大的有 C2、C7、C17 寄存器,這些寄存器的作用,從上圖可以看出,分別是: C
    的頭像 發(fā)表于 02-20 14:28 ?645次閱讀
    鴻蒙輕內(nèi)核源碼分析:<b class='flag-5'>MMU</b> 協(xié)處理器

    PPTC的相關(guān)參數(shù)介紹

    熱敏電阻,又稱為自恢復(fù)保險(xiǎn)絲,是一種具有正溫度系數(shù)的熱敏電阻。當(dāng)電流通過PPTC時(shí),其阻值會(huì)隨著溫度的升高而增大。PPTC廣泛應(yīng)用于電路保護(hù)、過流保護(hù)、過熱保護(hù)等領(lǐng)域。本文將對PPTC的相關(guān)參數(shù)進(jìn)行
    的頭像 發(fā)表于 02-16 16:12 ?3278次閱讀
    PPTC的<b class='flag-5'>相關(guān)</b>參數(shù)介紹

    緩存大小對CPU性能的影響解析

    為了保證L1訪問延時(shí)可以做的足夠低,通常需要設(shè)計(jì)L1的associativity盡量小。因此在Sunny Cove之前通常為8 way。這里Sunny Cove增加了一個(gè)cycle的L1訪問延時(shí),不確定是由TLB的改動(dòng)引起的還是L1 associativity由8 way增加到12 way。
    發(fā)表于 01-24 12:41 ?9286次閱讀
    緩存大小對CPU性能的影響解析
    主站蜘蛛池模板: 国产成人免费不卡在线观看| 国产成人免费片在线视频观看| 调教椅上的调教SM总裁被调教| 亚洲高清中文字幕| 亚洲精品嫩草研究院久久| 制服丝袜第一页| 黄色软件色多多| 六级黄色片| 色欲天天婬色婬香影院| 憋尿调教绝望之岛| 久久成人午夜电影mp4| 欧洲内射XXX高清| 亚洲裸舞 hd| 黄色aa大片| 伊人久久久久久久久香港| 敌伦小芳的第一次| 丝袜美女自摸| yy8090韩国理伦片在线| 久久免费精品一区二区| 新版孕妇bbwbbwbbw| 果冻传媒妈妈要儿子| 伊人久久影院大香线蕉| 国产小视频免费看| 欧美亚洲另类丝袜自拍动漫| WWW国产亚洲精品久久| 涩涩网站在线看| 国产亚洲精品a在线观看app | 浪小辉军警服务员VIDEOS| 中国xxxxxz| 欧美性喷潮xxxx| 国产精品人妻在线观看| 日韩AV爽爽爽久久久久久 | 二次元美女扒开内裤喷水| 男人插女人动态图| 草草色| 亚州三级久久电影| 乱爱性全过程免费视频| 国产成人a一在线观看| 在线免费看a| 美女脱了内裤张开腿让男人爽 | 花蝴蝶在线直播观看|