簡體   English   中英

如何在 Linux kernel 中獲取進程的虛擬地址

[英]How to get process's virtual address in Linux kernel

目前,我正在嘗試弄清楚如何在 Linux kernel 中獲取特定進程的虛擬地址(VA),因為有幾個函數將 VA 作為與不同頁面目錄相關的參數,包括 pgd_offset()、pgd_index( ), p4d_offset(), p4d_index()...

  1. 誰能解釋一下這些函數的作用,包括 xxx_offset(), xxx_index()?(xxx:pgd, p4d, pmd...) 以及如何使用這些函數?

  2. 當它作為上述函數的參數時,VA是什么意思,是進程的虛擬地址嗎? 以及如何獲得特定流程的 VA? 我已經知道我們可以使用進程的task_struct->mm->mmap來獲取虛擬地址空間的范圍,但是不知道如何獲取特定的虛擬地址。

  3. task_struct->mm->pgd_t是表示PGD_directory的基地址嗎?

你的問題真的沒有意義。 您不會“獲得進程的虛擬地址”。 進程有一個虛擬地址空間,用作數據、代碼、堆棧、堆等的虛擬 memory map。

  1. 這些函數在進程虛擬地址空間中獲取單個虛擬地址,並幫助遍歷頁表以查找其頁表條目,然后找到其物理地址(或檢查頁表條目標志)。 在 Linux 中,有 4 個頁表級別,通過 go 到達頁表條目。 通常級別是pgd(頁表目錄)、pud(頁上層目錄)、pmd(頁中間目錄)和pte(頁表條目)。 但我認為最近 p4d 被添加為額外的頁表級別。 通常,頁目錄(頂級頁表)的地址存儲在 CR3 寄存器中。 因此,您使用該地址訪問目錄,然后使用 pgd_index 和 pgd_offset 找到您需要查看的下一級(p4d)的地址,並重復直到您點擊 pte。 一個有用的文件是mm/page_walk.c文件。

  2. 進程在其運行時訪問 memory,通常這個 memory 由虛擬地址引用。 當它訪問不在 TLB 中的地址時,必須按上述方式遍歷該地址以找出其位置和權限標志。 沒有“獲取進程的 VA”,但是當您的程序使用 mmap 或 malloc 並且您獲得變量的地址時,這些地址通常是虛擬地址。 您可以查看/proc/proc_number/maps以查看具有 PID proc_number的進程的虛擬地址布局。 請注意,在地址空間布局隨機化打開的情況下,每次運行相同的程序時,此 map 都會有所不同。

  3. 我不確定,但您可能可以通過將該變量與我在上面鏈接的 page_walk.c 文件中使用的 pgd 地址進行比較來測試它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM