- 
		#include <stdio.h>
 
- 
		#include <unistd.h>
 
- 
		#include <inttypes.h>
 
- 
		#include <stdint.h>
 
- 
		#include <sys/types.h>
 
- 
		#include <sys/stat.h>
 
- 
		#include <fcntl.h>
 
- 
		
 
- 
		#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)
 
- 
		{
 
- 
		    int fd;
 
- 
		    int page_size=getpagesize();
 
- 
		    unsigned long vir_page_idx = vir/page_size;
 
- 
		    unsigned long pfn_item_offset = vir_page_idx*sizeof(uint64_t);
 
- 
		    uint64_t pfn_item;
 
- 
		
 
- 
		    fd = open(page_map_file, O_RDONLY);
 
- 
		    if (fd<0)
 
- 
		    {
 
- 
		        printf("open %s failed", page_map_file);
 
- 
		        return -1;
 
- 
		    }
 
- 
		    if ((off_t)-1 == lseek(fd, pfn_item_offset, SEEK_SET))
 
- 
		    {
 
- 
		        printf("lseek %s failed", page_map_file);
 
- 
		        return -1;
 
- 
		    }
 
- 
		    if (sizeof(uint64_t) != read(fd, &pfn_item, sizeof(uint64_t)))
 
- 
		    {
 
- 
		        printf("read %s failed", page_map_file);
 
- 
		        return -1;
 
- 
		    }
 
- 
		    if (0==(pfn_item & PFN_PRESENT_FLAG))
 
- 
		    {
 
- 
		        printf("page is not present");
 
- 
		        return -1;
 
- 
		    }
 
- 
		    *phy = (pfn_item & PFN_MASK)*page_size + vir % page_size;
 
- 
		    return 0;
 
- 
		}
 
- 
		
 
- 
		void main()
 
- 
		{
 
- 
		    int a=0x12345678;
 
- 
		    unsigned long phy;
 
- 
		    mem_addr_vir2phy((unsigned long)&a, &phy);
 
- 
		    printf("vaddr=%p,phy=0x%lx\n", &a, phy);
 
- 
		    while(1)
 
- 
		    {
 
- 
		        sleep(100);
 
- 
		    }
 
- }
http://blog.csdn.net/wangcong02345/article/details/52326083
