32位Linux系統的虛擬地址映射

此次主要是在Bochs x86 2.6.8環境下,調試操作系統尋找邏輯地址對應的物理地址


控制檯console

先分析下邊這段代碼:

int main()
{
    int data = 10;
    printf(“&data=0x%x\n”, &data);
    while(data);

    printf(“progrma done...\n”);

    return 0;
}

這裏寫圖片描述

在Bochs中運行,程序一直處於while(data)循環中,要讓程序結束,除了使用Ctrl+c,還有什麼辦法呢?
試想這裏的循環條件,如果data爲0,會跳出循環。再接着,如何才能讓data變成0??

首先,需要清楚訪問的內存是哪塊?
這裏的data是局部變量,在堆棧段ss上

我們通過命令sreg 進行查看不同段區域地址,
ss:0x0017, dh=0x10c0f300, dl=0x00003fff, valid=3

這裏寫圖片描述

將堆棧段上地址轉換爲LDT中地址
LDT的信息在GDT[13]處存儲
GDT表項佔用8個字節
xp/2w 0x00005cb8 + 13*8是查找GDT第13號元素的地址

xp/2w命令——–是查看8字節的地址;xp/w——是查看4字節的地址。

查看地址

這裏是小端模式—–低地址存低字節,高地址存高字節
0xa2d00068–低地址; 0x000082fe—高地址
段描述表項的定義

這裏寫圖片描述

通過命令calc計算相加後(如下),得到線性地址 0x13fffef4。

線性地址

creg命令查看寄存器地址:
查看寄存器地址

這裏的CR0=0x8000001b,分頁開啓

進制轉換
頁目錄下標是79,頁表下標是1023
頁目錄的起始地址在CR3寄存器中,
CR3 = 0x00000000

一個頁目錄項是4字節

xp/w 0x00000000 + 79*4,得到0x00fea027.
這裏寫圖片描述
頁表地址低12位是0,所以頁表地址是0x00fe000
xp/w 0x00fe000 + 1023*4得到頁表項內容,當前頁表向地址是0x00f96067.

然後進行xp/w 0x00f96000+3828得到物理頁面偏移量0x0000000a.

這裏寫圖片描述

當前的物理地址:0xf96ef4 ,對應的是0x0000000a.

這裏寫圖片描述

setmem 0xf96ef4 4 0,是給這個物理地址寫4字節的0.

這裏寫圖片描述

命令c 啓動控制檯,另一邊main程序運行結束。

這裏寫圖片描述

發佈了40 篇原創文章 · 獲贊 6 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章