Linux下獲取虛擬位址對應的實體地址的方法

2021-07-08 12:20:52 字數 980 閱讀 4008

**:

以下為正文:

首先摘錄如下url對pagemap的描述。

接下來,我們根據上述描述,給出獲取虛擬位址對應的實體地址的**

#include

#include

#include

#include

#include

#include

#define    page_map_file     "/proc/self/pagemap"

#define    pfn_mask          ((((uint64_t)1)<<55)-1)

#define    pfn_present_flag  (((uint64_t)1)<<63)

int mem_addr_vir2phy(unsigned long vir, unsigned long *phy)

if ((off_t)-1 == lseek(fd, pfn_item_offset, seek_set))

if (sizeof(uint64_t) != read(fd, &pfn_item, sizeof(uint64_t)))

if (0==(pfn_item & pfn_present_flag))

*phy = (pfn_item & pfn_mask)*page_size + vir % page_size;

return 0;

}如果擔心vir位址對應的頁面不在記憶體中,可以在呼叫mem_addr_vir2phy之前,先訪問一下此位址。

例如, int  a=*(int *)(void *)vir;

如果擔心linux的swap功能將程序的頁面交換到硬碟上從而導致頁面的實體地址變化,可以關閉swap功能。

下面兩個c庫函式可以阻止linux將當前程序的部分或全部頁面交換到硬碟上。

int mlock(const void *addr, size_t len);

int mlockall(int flags);

GPIO虛擬位址對應關係說明

gpio暫存器的讀寫方法。不過我看了還是很多疑惑,為什麼在記憶體對映表裡面這樣定義 dcd 0x91600000,0x56000000,1 i o port register 而在s2410.h中又會這樣 define iop base 0xb1600000 0x56000000 明明定義了是0x9...

GPIO虛擬位址對應關係說明

gpio暫存器的讀寫方法。不過我看了還是很多疑惑,為什麼在記憶體對映表裡面這樣定義 dcd 0x91600000,0x56000000,1 i o port register 而在s2410.h中又會這樣 define iop base 0xb1600000 0x56000000 明明定義了是0x9...

Linux虛擬位址對映

我們定義乙個區域性變數,然後列印出這個區域性變數的位址,那麼這個區域性變數的位址是線性位址?實體地址?還是邏輯位址?要明白這些,先來看看以下的知識吧。x86體系 指的是特定微cpu執行的有些 計算機語言 指令集,定義了 晶元的基本用規則 cpu的位數 alu一次性最多能處理的整數的位元組數,也即al...