当前位置: 首页 > 面试题库 >

/ proc / [pid] / pagemaps和/ proc / [pid] / maps | linux

仲孙奇
2023-03-14
问题内容

我正在努力弄清标题中提到的两个文件。我查了一下是什么。但是,我无法理解如何从他们那里提取有用的信息(或者我只是以错误的方式来对待)。

让我解释一下:页面映射是一个相当新的“功能”伪文件,其中包含分配给当前[pid]的虚拟页面的物理框架信息。也就是说,给定一个从地址x开始的虚拟页面,比如说“
vas”代表虚拟地址开始,我可以使用vas为页面地图文件建立索引,以获取映射的物理页面框架的64位。这些位包含有关该虚拟页面的信息。但是,当我提取位并进行一些移位时,我会迷失于所见。

这些位表示如下:0-54是页面帧号,55-60是页面移位,63rd位是当前位,还有其他一些我不太感兴趣的位。在使用/ proc / [pid] /
maps中的vas地址进行了一些映射之后,似乎几乎每个进程的页面都被交换了,即,第63位始终为零。:(

我想问题是,我应该如何有效地使用页面映射来获取/ proc / [pid] / maps给定地址的等效物理地址

公平地说,我已经发布了一个类似的问题,但是前几天的方法有所不同。

如果有人能对此事有所启发,我将不胜感激。

===编辑===

要解决以下评论:我正在从/ proc / [pid] / maps中读取一行,这些行如下所示:

00400000-00401000 r-xp 00000000 08:01 8915461 / home / janjust / my_programs
/ shared_mem 7ffffef1b000-7ffffef3c000 rw-p 00000000 00:00 0 [堆栈]

然后,我提取它接触的虚拟页面的数量并为二进制文件/ proc / [pid] /
pagemaps编制索引,对于每个虚拟页面,我都可以提取分配给它的物理页面。

输出如下:

00400000-00401000 r-xp 00000000 08:01 8915461 / home / janjust / my_programs
/ shared_mem num_pages:1:86000000001464C6

虚拟范围内每个虚拟页面的一个物理地址。

用于读取行并提取物理地址的代码是:

74     /* process /proc/pid/maps, by line*/
75     while(fgets(line, 256, in_map) != NULL){
76         unsigned long vas;
77         unsigned long vae;
78         int num_pages;
79 
80         //print line
81         printf("%s", line);
82 
83         /*scan for the virtual addresses*/
84         n = sscanf(line, "%lX-%lX", &vas, &vae);
85         if(n != 2){
86             printf("Involid line read from %s\n",maps);
87             continue;
88         }
89 
90         num_pages = (vae - vas) / PAGE_SIZE;
91         printf("num_pages: %d\n", num_pages);
92 
93         if(num_pages > 0){
94             long index  = (vas / PAGE_SIZE) * sizeof(unsigned long long);
95             off64_t o;
96             ssize_t t;
97 
98             /* seek to index in pagemaps */
99             o = lseek64(pm, index, SEEK_SET);
100             if (o != index){
101                 printf("Error seeking to o:%ld, index:%ld.\n", o, index);
102             }
103 
104             /* map the virtual to physical page */
105             while(num_pages > 0){
106                 unsigned long long pa;
107 
108                 /* Read a 64-bit word from each pagemap file... */
109                 t = read(pm, &pa, sizeof(unsigned long long));
110                 if(t < 0){
111                     printf("Error reading file \"%s\" \n", page_map);
112                     goto next_line;
113                 }
114                 printf(": %016llX\n", pa);

但是,尽管我认为我得到了正确的输出,但是索引似乎是类型不匹配或正在发生其他事情:例如,输出表示地图中的[shared
mem]行给出了错误的索引;但是我仍然能够浏览二进制文件并获取物理页面地址。

该输出的示例如下:

969 7f7f08d58000-7f7f08d59000 rw-s 00000000 00:04 0    /SYSV00003039 (deleted)
970 num_pages: 1
971 Error seeking to o:-1081840960, index:273796065984.
972 : 8600000000148267

好的,现在,最后我应该说这是在64位操作系统下,并且此问题在32位操作系统中不会持续存在。


问题答案:

噢,K,索引是正确的,但是将off64_t
o(8bytes)与长索引进行比较会解释o错误,因此为什么我会收到该错误。哈!这是一个愚蠢的错误。因此,添加适当的标头就可以了。

缺少标题:-/ 叹气 解决了将off64_t与无符号long比较的问题。



 类似资料:
  • 问题内容: 有没有人成功地使用Linux内核2.6 mmap’ing / proc / pid / mem文件?我收到ENODEV(无此类设备)错误。我的电话看起来像这样: 而且我在调试时通过查看/ proc / pid / maps文件进行了验证,当执行到达此调用时,offset的值等于堆栈顶部减去PAGE_SIZE的值。我还用ptrace验证了mmap将errno设置为ENODEV。 问题答案

  • 问题内容: 我对/ proc / pid / smaps中的pss列感到困惑,因此我编写了一个程序对其进行测试: 在这里,我发现pss等于Private_Dirty,但是我想知道为什么。 顺便说一句:是否有任何详细的文档? 问题答案: 从wnn.net报价 进程的“比例集大小”(PSS)是它在内存中具有的页面数,其中每个页面除以共享它的进程数。因此,如果一个进程自身拥有1000页,并且与另一个进程

  • 问题内容: 我试图破译如何使用/ proc / pid / pagemap来获取给定页面集的物理地址。假设从/ proc / pid / maps中获得了与堆相对应的虚拟地址afa2d000-afa42000。我的问题是如何使用此信息遍历页面地图文件并找到对应于地址afa2d000-afa42000的物理页面框架。 / proc / pid / pagemap条目为二进制格式。有什么工具可以帮助解

  • 问题内容: 我正在为Munin创建一个插件,以监视命名进程的统计信息。信息来源之一是。但是我很难找出/ 和/ 之间的区别。 它们不一样,因为它们提供不同的值。它们代表什么? 问题答案: 尽管proc联机帮助页令人遗憾地落后(大多数与cookie- cutter用户空间开发无关的联机帮助页/文档也是如此),但幸运的是,这些资料已在Linux内核源代码下的完全记录了下来。以下是相关的位:

  • 问题内容: 对于具有非常长的类路径的Java应用程序,使用ps时,看不到arg列表末尾附近指定的主类。我认为这源于我的Ubuntu系统对/ proc / pid / cmdline的大小限制。如何增加此限制? 问题答案: 您无法动态更改,限制已在内核中硬编码为fs / proc / base.c中的PAGE_SIZE:

  • 问题内容: 我试图了解嵌入式Linux应用程序的内存使用情况。该实用程序/文件似乎是查看详细信息的好资源。不幸的是,我不理解所有的列和条目。 匿名索引节点0条目是什么意思?这些似乎是一些较大的内存段。 问题答案: 中的每一行都描述了进程或线程中连续虚拟内存的区域。每行都有以下字段: 地址 -这是进程地址空间中区域的开始和结束地址 权限 -描述如何访问区域中的页面。有四种不同的权限:读取,写入,执行