作家
登录

Linux虚拟内存地址转化成物理内存地址

作者: 来源: 2017-07-25 17:02:56 阅读 我要评论

CONFIG_STRICT_DEVMEM=n

背景

现代手机这种SOC(system>

  • #include <errno.h> 
  •  
  • #include <stdio.h> 
  •  
  • #include <sys/stat.h> 
  •  
  • #include <string.h> 
  •  
  • #include <fcntl.h> 
  •  
  • #include <stdlib.h> 
  •  
  • #include <stdint.h> 
  •  
  • #include <sys/types.h> 
  •  
  • #include <sys/stat.h> 
  •  
  • #include <fcntl.h> 
  •  
  • #include <unistd.h> 
  •  
  • #include <sys/mman.h> 
  •  
  • // 参考 
  •  
  • // https://www.kernel.org/doc/Documentation/vm/pagemap.txt 
  •  
  • #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) 
  •  
  •  
  • fprintf(stderr, "open %s failed", page_map_file); 
  •  
  • return -1; 
  •  
  •  
  • if ((off_t)-1 == lseek(fd, pfn_item_offset, SEEK_SET)) 
  •  
  •  
  • fprintf(stderr, "lseek %s failed", page_map_file); 
  •  
  • return -1; 
  •  
  •  
  • if (sizeof(uint64_t) != read(fd, &pfn_item, sizeof(uint64_t))) 
  •  
  •  
  • fprintf(stderr, "read %s failed", page_map_file); 
  •  
  • return -1; 
  •  

  •   推荐阅读

      推进信息化、智能化与司法的高度融合

    最后,信息化、智能化技巧结不雅的应用要遵守以工本钱的原则。《最高人平易近法院关于加快扶植聪明法院的看法》以及《关于人平易近法院信息化人才部队扶植的看法》均对技恋人才保障问题提出了明白的请求。不过,推动>>>详细阅读


    本文标题:Linux虚拟内存地址转化成物理内存地址

    地址:http://www.17bianji.com/lsqh/36400.html

  • 关键词: 探索发现

    乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

    网友点评
    自媒体专栏

    评论

    热度

    精彩导读
    栏目ID=71的表不存在(操作类型=0)