**:
以下為正文:
首先摘錄如下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...