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

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

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

2023-10-09 17:33 作者:補(bǔ)給站Linux內(nèi)核  | 我要投稿

名詞解釋:

1.PGD: Page Global Directory2.PUD: Page Upper Directory3.PMD: Page Middle Directory4.PTE: Page Table Entry

測試程序:

本測試程序構(gòu)建了一個(gè)場景,打印了一個(gè)內(nèi)存映射文件的虛擬地址,一個(gè)全局變量尋地址,一個(gè)棧內(nèi)變量的虛擬地址和一個(gè)在堆上動(dòng)態(tài)分配變量的虛擬地址。接下來,我們使用qemu啟動(dòng)內(nèi)核和rootfs,然后運(yùn)行這個(gè)測試程序,看一下MMU是如何從這幾個(gè)地址的虛擬地址找到其物理地址的。

獲取vmcore:

1)使用qemu啟動(dòng)系統(tǒng)

內(nèi)核使用的是6.3,打開了CONFIG_PAGE_OWNER選項(xiàng),上述test.c已經(jīng)編譯好,放到了rootfs的/test/mm目錄下。

2)運(yùn)行測試程序

其中,內(nèi)存映射文件變量的虛擬地址為0x7fc3d3e4c000,全局變量的虛擬地址為0x4c82f0,棧內(nèi)變量的虛擬地址為0x7ffe03a8ef1c,堆內(nèi)變量的虛擬地址為0x11226f0。

在64位操作系統(tǒng)中,無論是X86_64還是ARM64,都使用48bit的虛擬地址,同時(shí)都將虛擬內(nèi)存地址空間分為內(nèi)核地址空間和用戶地址空間兩個(gè)部分,內(nèi)核地址空間的地址都已0xFFFF開頭,用戶地址空間以0x0000開頭,所以上述幾個(gè)虛擬地址都是用戶空間的地址,屬于a.out這個(gè)進(jìn)程。

除了a.out打印的信息以外,我們還可以通過maps來看一下a.out進(jìn)程內(nèi)存映射的基本情況:

從這個(gè)圖中,可以看出a.out代碼段,堆棧,全局變量,動(dòng)態(tài)鏈接庫等映射的虛擬地址空間的范圍、比如,棧的虛擬地址范圍為“7ffe03a6f000-7ffe03a90000”,棧內(nèi)變量的虛擬地址0x7ffe03a8ef1c剛好在這個(gè)區(qū)間內(nèi),還有堆的虛擬范圍為“01121000-01143000”,堆內(nèi)變量的虛擬地址0x11226f0也處于這個(gè)區(qū)間內(nèi)。

3)獲取vmcore

接下來我們使用qemu monitor的dump-guest-memory功能將虛擬機(jī)中的內(nèi)存dump出來,用于后續(xù)分析a.out虛擬地址和物理地址的映射關(guān)系. 我們?cè)谟胵emu啟動(dòng)虛擬機(jī)的時(shí)候,使用了-monitor參數(shù)

這樣的話,在qemu虛擬機(jī)里,可以使用ctrl a + c進(jìn)入qemu的控制臺(tái)。

然后運(yùn)行命令“dump-guest-memory -p dump-file-name”,這樣虛擬機(jī)的物理內(nèi)存就被dump到指定文件里了。

4) 從vmcore中獲取信息

我們使用crash來對(duì)dump文件進(jìn)行分析,首先我們使用crash打開dump文件,同時(shí),也需要將內(nèi)核的elf文件作為參數(shù)。

進(jìn)入crash命令行之后,首先使用vm命令看一下a.out內(nèi)存使用的大致情況:

可以看出,與/proc/80/maps信息基本相同。此外,我們還得到了更多的信息,比如a.out在內(nèi)核中task_struct的地址是ffff888004ffbc80,pgd的地址是ffff8880047de000,我們使用crash命令來查看一下,看看信息是不是對(duì)的上。

接下來我們看下a.out里四個(gè)變量的信息:? filemap-addr:0x7fc3d3e4c000 內(nèi)存映射文件虛擬地址 ? g-addr:0x4c82f0 全局變量虛擬地址 ? stack-addr:0x7ffe03a8ef1c 棧內(nèi)變量虛擬地址 ? heap-addr:0x11226f0 堆內(nèi)變量虛擬地址


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


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



1)首先我們使用vtop看一下filemap-addr:0x7fc3d3e4c000的信息:

從上面信息可以看出0x7fc3d3e4c000所對(duì)應(yīng)的物理地址是0x28ba000,我們之前看到過a.out的pgd的物理地址是47de000,那么47de7f8中的0x7f8就是虛擬地址0x7fc3d3e4c000所對(duì)應(yīng)的PUD的地址在PGD中的偏移量,也就是說47de000 + 7f8這個(gè)地址里面,存放著PUD頁表的物理地址,從上述信息來看,PUD的物理地址為5f7c000,后面的0x67為該頁面的頁表屬性。以上就是對(duì)“PGD: 47de7f8 => 8000000005f7c067”這一行信息的解讀。

接下來“PUD: 5f7c878 => 5f66067”,PUD的物理地址是5f7c000,878為PMD的索引,所以,對(duì)這一行的解讀就是在5f7c000 + 878這個(gè)地址內(nèi)存放著PMD的地址,即5f66000,067位頁面屬性。“PMD: 5f664f8 => 5f64067”也類似,PMD的物理地址是5f66000,4f8是PTE的索引,所以,對(duì)這一行的解讀就是在5f66000 + 4f8這個(gè)地址內(nèi)存放著PTE的地址,即5f64000,067位頁面屬性。“PTE: 5f64260 => 80000000028ba025”,這一行即將找到0x7fc3d3e4c000所處物理地址頁面的基地址,也就是page table的基地址,即28ba000,后面的025是頁面屬性。

至此0x7fc3d3e4c000找到了它對(duì)應(yīng)的物理地址28ba000,通常,最后12bit是虛擬地址在物理地址4k頁面內(nèi)的偏移量,但0x7fc3d3e4c000是內(nèi)存映射文件的地址,內(nèi)存映射通過mmap將內(nèi)核的頁面映射到用戶進(jìn)程的頁表中,是4k對(duì)齊,所以最后12bit為0.

我們還可以通過內(nèi)核提供的page owner功能來28ba000這個(gè)頁面分配的過程。首先計(jì)算28ba000的PFN,即右移12bit,得到28ba,十進(jìn)制為10426:

然后回到qemu虛擬機(jī)中,進(jìn)行如下操作:

可以看到PFN位10426這個(gè)頁面分配的過程。

2)接下來我們?cè)倏慈肿兞俊癵-addr:0x4c82f0”,操作基本相同。

從上述信息可以看出,PGD的地址是47de000,而且PUD的地址就存放在47de000的第0個(gè)索引內(nèi),也就是47de000 + 0,PUD的地址為5f7e000。PUD的第0個(gè)索引內(nèi)放著PMD的地址,為5f7d000,PMD的5f7d000 + 010存放著PTE的地址5f7b000,PTE的5f7b000 + 640的地址存放著0x4c82f0所對(duì)應(yīng)的物理地址的頁面的基地址1f4ed000,再加上0x4c82f0的12bit頁內(nèi)偏移地址2f0,所以0x4c82f0對(duì)應(yīng)的物理地址是1f4ed2f0。通過page owner查看分配過程:

3)接下來我們?cè)倏础皊tack-addr:0x7ffe03a8ef1c”

從上述信息可以看出,PGD的地址是47de000,而且PUD的地址就存放在47de000的第7f8個(gè)索引內(nèi),也就是47de000 + 7f8,PUD的地址為5f7c000。PUD的第fc0個(gè)索引內(nèi)放著PMD的地址,為5f7f000,PMD的5f7f000 + 0e8存放著PTE的地址5f7a000,PTE的5f7a000 + 470的地址存放著0x7ffe03a8ef1c所對(duì)應(yīng)的物理地址的頁面的基地址2940000,再加上0x7ffe03a8ef1c的12bit頁內(nèi)偏移地址f1c,所以0x7ffe03a8ef1c對(duì)應(yīng)的物理地址是2940f1c。通過page owner查看分配過程:


4)接下來我們看堆內(nèi)的變量“heap-addr:0x11226f0”

從上述信息可以看出,PGD的地址是47de000,而且PUD的地址就存放在47de000的第0個(gè)索引內(nèi),也就是47de000 + 0,PUD的地址為5f7e000。PUD的第0個(gè)索引內(nèi)放著PMD的地址,為5f7d000,PMD的5f7d000 + 040存放著PTE的地址5f65000,PTE的5f65000 + 910的地址存放著0x11226f0所對(duì)應(yīng)的物理地址的頁面的基地址28b9000,再加上0x11226f0的12bit頁內(nèi)偏移地址6f0,所以0x4c82f0對(duì)應(yīng)的物理地址是28b96f0。通過page owner查看分配過程:

總的來講,解讀vtop的打印信息需要了解,存儲(chǔ)PGD,PUD,PMD,PTE的內(nèi)存都是4k對(duì)齊,也就是最后12bit為0,vtop打印的信息通常就是頁面基地址加上索引,4k對(duì)齊的頁面在內(nèi)存管理中,最后12bit會(huì)用于描述該頁面的屬性,如067,025等,對(duì)應(yīng)這樣的組合。


原文作者:Jeff Labs


MMU如何通過虛擬地址找到物理地址?的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
中卫市| 大兴区| 股票| 宜丰县| 叙永县| 栾川县| 清苑县| 岳普湖县| 岳阳市| 芜湖县| 大丰市| 延安市| 乌海市| 昌平区| 文安县| 寻甸| 综艺| 景泰县| 安顺市| 万源市| 甘洛县| 新郑市| 同德县| 铅山县| 杭锦后旗| 出国| 武威市| 临湘市| 舞阳县| 衡阳县| 南木林县| 汉寿县| 托克逊县| 鱼台县| 高尔夫| 永兴县| 鄂温| 岳普湖县| 宁南县| 上杭县| 赤壁市|