文档章节

判断内存地址是否缺页

Znic
 Znic
发布于 2015/12/27 23:56
字数 297
阅读 46
收藏 0

一个进程的内存是否加载到物理内存,系统是有记录的。记录文件就是/proc/$pid/pagemap

pagemap和内存地址的对应关系:

file_offset = virt_addr / PAGE_SIZE * PAGEMAP_ENTRY;

8字节的PAGEMAP_ENTRY用于记录这一页的内存映射信息:

    * Bits 0-54  page frame number (PFN) if present

    * Bits 0-4   swap type if swapped

    * Bits 5-54  swap offset if swapped

    * Bit  55    pte is soft-dirty (see Documentation/vm/soft-dirty.txt)

    * Bit  56    page exclusively mapped (since 4.2)

    * Bits 57-60 zero

    * Bit  61    page is file-page or shared-anon (since 3.5)

    * Bit  62    page swapped

    * Bit  63    page present


完整代码:

        const int __endian_bit = 1 ;
        #define PAGEMAP_ENTRY 8
        #define is_bigendian () ( (*(char*)&__endian_bit) == 0 ) 
        #define GET_BIT (X,Y) (X & ((uint64_t)1<<Y)) >> Y
        #define GET_PFN (X) X & 0x7FFFFFFFFFFFFF
        char page_path [0xff] = {0};
        snprintf(page_path, sizeof(page_path ) - 1 , "/proc/%u/pagemap", getpid());
        FILE* f = fopen(page_path, "rb");//open(page_path, O_RDONLY);
        if(! f) return -1;
        unsigned long file_offset = addr /  PAGE_SIZE * PAGEMAP_ENTRY;
        int status = fseek(f, file_offset, SEEK_SET);
        unsigned char c_buf [PAGEMAP_ENTRY];
        for( int i = 0; i < PAGEMAP_ENTRY; i++)
        {
            int c = getc(f);
            if( c == EOF) return -1;
            if(is_bigendian()) c_buf[ i] = c;
            else c_buf [PAGEMAP_ENTRY - i -1] = c;
        }
        
        unsigned long long read_val = 0;
        for( int i = 0; i < PAGEMAP_ENTRY; i++)
        {
            read_val = ( read_val << 8) + c_buf[ i]; 
        }

        if(GET_BIT( read_val, 63))
           printf("PFN: 0x%llx",(unsigned long long) GET_PFN(read_val));
        else
           printf( "page not present");

        if(GET_BIT( read_val, 62))
           printf( "Result: 0x%llx",  read_val );
        fclose(f);



© 著作权归作者所有

Znic
粉丝 1
博文 6
码字总数 1888
作品 0
深圳
程序员
私信 提问
深入理解【缺页中断】及FIFO、LRU、OPT这三种置换算法

虚拟地址空间中,但是目前并未被加载在物理内存中的一个分页时,由中央处理器的内存管理单元所发出的中断。 操作系统的一部分。如果操作系统判断此次访问是有效的,那么操作系统会尝试将相关...

sunsky303
2018/06/22
0
0
内存管理(二)

一、虚拟存储技术 所谓虚拟存储技术是指:当进程运行时,先将其一部分装入内存,另一部分暂留在磁盘,当要执行的指令或访问的数据不在内存时,由操作系统自动完成将它们从磁盘调入内存的工作...

芥末无疆sss
2017/12/30
0
0
内存常识之缺页中断

什么是缺页中断: 进程线性地址空间里的页面不必常驻内存,在执行一条指令时,如果发现他要访问的页没有在内存中(存在位为0),那么停止该指令的执行,并产生一个页不存在异常,对应的故障处...

Li_思华年
2017/11/16
0
0
第3章 内存管理

  分层存储体系:高速缓存—>内存—>外存,造价从高到低,速度由快到慢,容量由小到大,这样的存储体系。   存储管理器:OS中管理分层存储体系的部分,任务是管理内存,记录已使用和未使...

liao20081228
2017/11/01
0
0
Linux进程分配内存的两种方式--brk() 和mmap()

如何查看进程发生缺页中断的次数? majflt代表major fault,中文名叫大错误,minflt代表minor fault,中文名叫小错误。 这两个数值表示一个进程自启动以来所发生的缺页中断的次数。 发成缺页...

qq_33160790
2018/01/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何使用 rsync 备份 Linux 系统的一些介绍

备份一直是 Linux 世界的热门话题。回到 2017,David Both 为 Opensource.com 的读者在使用 rsync 备份 Linux 系统方面提了一些建议,在这年的更早时候,他发起了一项问卷调查询问大家,在 ...

xiangyunyan
37分钟前
1
0
二进制位操作

单片机,或者一些模块的设置操作,都是由一个字节数据来完成,每位各有定义。就需进行位操作来组合需要的数字结果。 以JavaScript为例,编写位操作。 我们期望得到这样一个二进制数:0101101...

format
51分钟前
3
0
聊聊中国的通信行业:从“七国八制”到“中华”脊梁

本期文章和大家一起来聊一聊我曾经从事过的通信行业吧。最近各方面信息的泛滥,包括和华为的同学聊天,自己确实也感慨颇多。想想我自己本科主修通信工程,研究生再修信息与通信工程,从本科开...

CodeSheep
今天
7
0
MDK:ARM M451M:exceed the range of code meory, continue to erase or not?

问题: 代码空间超限 几天前就遇到:exceed the range of code meory, continue to erase or not? 如下所示: 解决过程 开始以为中MDK软件的128KB限制,如是就不能生成HEX文件,应该链接时有提...

SamXIAO
今天
3
1
OSChina 周六乱弹 —— 因违反《中华人民共和国治安管理处罚法》第四十四条之规定

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @xiaoshiyue :#今日歌曲推荐# 惊艳分享谷微的单曲《安守本份》(@网易云音乐) 《安守本份》- 谷微 手机党少年们想听歌,请使劲儿戳(这里) ...

小小编辑
今天
684
14

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部