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

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

让我解释一下:页面映射是一个相当新的“功能”伪文件,其中包含分配给当前[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位操作系统中不会持续存在。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值