最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

MMU如何通過虛擬地址找到物理地址-下

2023-10-14 16:18 作者:補給站Linux內(nèi)核  | 我要投稿

接著上文:MMU如何通過虛擬地址找到物理地址?

5,虛擬內(nèi)存到物理內(nèi)存的推導(dǎo) 本文只介紹最普遍的64位地址,四級頁表,每個頁表4k的這種情況。

linux內(nèi)核將一個進程的內(nèi)存映射表建立好之后,在該進程被調(diào)度運行的時候,會將PGD的物理地址放置到MMU的頁表基地址寄存器中,在X86_64架構(gòu)下,該寄存器為CR3,ARM64架構(gòu)下,該寄存器為ttbr0_el1和ttbr1_el1,接下來的尋址過程中,就不需要linux來干預(yù)了,MMU會通過PGD-PUD-PMD-PTE-PAGE-OFFSET這個過程,根據(jù)虛擬地址,找到其對應(yīng)的物理地址。那么這個過程是怎樣的呢?

1)我們首先來拆分一下虛擬地址,以“filemap-addr:0x7fc3d3e4c000為例”,0x7fc3d3e4c000被分為5個部分,其中 ? 0-11bit為頁內(nèi)偏移地址,根據(jù)頁基地址+偏移量找到對應(yīng)的物理內(nèi)存;? 12-20bit為PTE的索引,該索引可以找到物理內(nèi)存頁面的基地址;? 21-29bit為PMD的索引,該索引可以找到PTE的頁基地址;? 30-38bit為PUG的索引,該索引可以找到PMD的頁基地址;? 39-47bit為PGD的索引,該索引可以找到PUD的頁基地址。首先我們使用命令bc來得到0x7fc3d3e4c000的二進制:

我們將該地址按上述規(guī)則拆分一下:PGD索引:11111111,需要左移12bit,得到11111111000,即0x7f8 PUD索引:100001111,需要左移12bit,得到100001111000,即0x878 PMD索引:010011111,需要左移12bit,得到010011111000,0x4f8 PTE索引:001001100,需要左移12bit,得到001001100000,即0x260

注意,PGD,PUD.PMD,PTE的索引都要左移12bit,可以看出來PGD的索引7f8,pud的索引878,PMD的索引4f8,PTE的索引260,都能和vtop給的信息對應(yīng)上。

我們再使用rd命令直接從內(nèi)存中讀取信息看一下:

從這個過程中,我們可以看到MMU有兩個數(shù)據(jù)信息,即PGD的基地址47de000和虛擬地址0x7fc3d3e4c000,MMU通過PGD+0x7f8找到PUD的地址5f7c000,通過PUD+878得到PMD的地址0x5f66000,通過PMD+4f8得到PTE的地址0x5f64000,通過PTE+260得到物理頁面的地址28ba000,本例沒有頁內(nèi)偏移量,索引0x7fc3d3e4c000對應(yīng)的物理地址就是28ba000。2)g-addr:0x4c82f0 轉(zhuǎn)換成二進制

獲取索引:

可以看出PGD和PUD的索引為0,PMD索引為0x10,PTE的索引為0x640,都能和vtop給的信息對應(yīng)上。

在得到頁面的基地址0x1f4ed000后,再加上該變量在頁內(nèi)的偏移量之后0x2f0,得到該變量的物理地址0x1f4ed2f0。使用rd命令直接從內(nèi)存中讀取信息看一下

最后再看一下該變量的值:

與代碼中賦值相同。


【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【749907784】整理了一些個人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書、實戰(zhàn)項目及代碼)?

零聲白金VIP體驗卡(含基礎(chǔ)架構(gòu)/高性能存儲/golang/QT/音視頻/Linux內(nèi)核)課程:?



3)stack-addr:0x7ffe03a8ef1c 轉(zhuǎn)換成二進制

獲取索引

可以看出來PGD的索引7f8,pud的索引fc0,PMD的索引0e8,PTE的索引470,都能和vtop給的信息對應(yīng)上。

在得到頁面的基地址0x2940000后,再加上該變量在頁內(nèi)的偏移量之后0xf1c,得到該變量的物理地址2940f1c。使用rd命令直接從內(nèi)存中讀取信息看一下:

4)heap-addr:0x11226f0 最后,我們再看一下堆內(nèi)變量0x11226f0,先轉(zhuǎn)換成二進制:

獲取索引:

可以看出PGD和PUD的索引為0,PMD索引為0x40,PTE的索引為0x910,都能和vtop給的信息對應(yīng)上。

在得到頁面的基地址28b9000后,再加上該變量在頁內(nèi)的偏移量之后0x6f0,得到該變量的物理地址28b96f0。使用rd命令直接從內(nèi)存中讀取信息看一下


最后再看一下物理內(nèi)存中的值:

與代碼中賦值相符。6,內(nèi)存映射 我們在查閱內(nèi)存映射關(guān)系的資料的時候,通常會找到一個這樣一個圖:

這個圖很清楚的表示了PGD,PUD,PMD和PTE的關(guān)系,下面我們把本例中涉及到的地址數(shù)據(jù)填充進去,效果看起來會更直觀和清晰。

7,總結(jié)

總結(jié)起來,一個變量的尋址過程就是,在編譯或運行時被分配虛擬地址和物理內(nèi)存,內(nèi)核為該虛擬地址和物理內(nèi)存的地址以該進程的PGD表為基礎(chǔ),建立映射關(guān)系,并將PGD的物理地址交給MMU,MMU根據(jù)映射關(guān)系通過虛擬地址找到物理地址,并按照程序的要求讀寫其中的內(nèi)容。

1)編譯和鏈接 在本例中有四種類型的變量:? filemap-addr:0x7fc3d3e4c000 內(nèi)存映射文件虛擬地址 ? g-addr:0x4c82f0 全局變量虛擬地址 ? stack-addr:0x7ffe03a8ef1c 棧內(nèi)變量虛擬地址 ? heap-addr:0x11226f0 堆內(nèi)變量虛擬地址 其中內(nèi)存映射文件的虛擬地址是內(nèi)核執(zhí)行mmap的時候分配的,棧和堆都是在進程創(chuàng)建的時候分配的物理內(nèi)存并指定了虛擬內(nèi)存地址,棧內(nèi)變量和堆內(nèi)變量的虛擬地址就是堆棧的虛擬地址加上偏移量獲得。全局變量的地址是在編譯鏈接的過程中指定的,本例的全局變量沒有初始化,所以放在a.out的bss區(qū),bss區(qū)的起始虛擬地址為00000000004c82a0:

全局變量g的虛擬地址為:

2)內(nèi)存頁表的建立 在進程創(chuàng)建的時候,內(nèi)核會為a.out的每個section分配物理內(nèi)存,堆棧也要分配物理內(nèi)存,同時根據(jù)為進程創(chuàng)建物理內(nèi)存和虛擬內(nèi)存的映射關(guān)系。最后,把PGD的物理地址放到MMU的頁表基地址寄存器中,剩下的事兒交給MMU??梢岳斫鉃閺奶摂M內(nèi)存到物理內(nèi)存的轉(zhuǎn)換的逆過程。

3)MMU進行地址轉(zhuǎn)換 從虛擬內(nèi)存到物理內(nèi)存的轉(zhuǎn)換是mmu通過頁表映射來實現(xiàn)的,無需操作系統(tǒng)干預(yù),本文所講的尋址過程是最基礎(chǔ)的虛擬地址到物理地址的轉(zhuǎn)換過程,但MMU還會利用tlb來優(yōu)化地址轉(zhuǎn)換的效率,這個不在本文討論的范圍內(nèi)。

8,其他 本文只介紹了最簡單的4級頁表,4k頁面的映射關(guān)系和尋址過程,其實,內(nèi)核的內(nèi)存管理還有更復(fù)雜的映射,比如使用5級頁表,或者每個映射單位為2M或1G的內(nèi)存塊,這些映射方法的索引級數(shù)和各級索引所占的bit位都有所不同。


原文作者:Jeff Labs


MMU如何通過虛擬地址找到物理地址-下的評論 (共 條)

分享到微博請遵守國家法律
平果县| 宣化县| 祁阳县| 专栏| 巴中市| 内黄县| 黔南| 洞头县| 土默特左旗| 鹿邑县| 海门市| 潜山县| 津南区| 娱乐| 东源县| 屏南县| 英山县| 若羌县| 辰溪县| 丹东市| 彭阳县| 双桥区| 磐石市| 宁河县| 贡觉县| 崇明县| 蓝田县| 徐汇区| 阜城县| 白朗县| 灵武市| 晋州市| 辛集市| 赤峰市| 贵溪市| 丹凤县| 周至县| 湟源县| 阳曲县| 大邑县| 荆州市|