我试图让我的头在标题中提到的两个文件。 我已经查过这些位是什么;然而,我不明白如何从中提取有用的信息(或者我只是以错误的方式接近它)。/proc/[pid]/pagemaps和/ proc/[pid]/maps | linux
让我解释一下:pagemaps是一个相当新的“特征”伪文件,它包含分配给当前[pid]的虚拟页面的物理帧信息。也就是说,给定一个从地址x开始的虚拟页面,对虚拟地址开始说'vas',我可以使用vas索引页面映射文件以获得映射物理页面帧的64位。这些位包含有关该虚拟页面的信息。 但是,当我提取这些位并做一些移位时,我正在看到我所迷失的东西。
位表示如下:0-54是页面帧号,55-60是页面移位,第63位是当前位,还有其他一些我感兴趣的位。 在使用/ proc/[pid]/maps中的地址进行映射之后,似乎几乎每个进程的页面都会被交换,即第63位总是零。 :(
我想这个问题是,我应该如何去有效利用pagemaps得到给出的地址相当于物理地址的/ proc/[PID] /映射
为了公平起见,我VE发布了类似的问题,但这种方法却有点不同早几天。
如果任何人都可以在这个问题上我是非常赞赏一些启发。
===编辑===
为了解决下面的评论: 我读线从/ proc/[PID] /地图和线条看起来像:
00400000-00401000 R-XP 00000000 08:01 8915461 /家/ janjust/my_programs/shared_mem 7ffffef1b000-7ffffef3c000 RW-p 00000000 00:00 0 [堆]
然后我提取倒是虚拟页的数量和索引的二进制文件/ proc/[PID]/pagemaps ,并且可以为每个虚拟页面提取分配给它的物理页面。
输出看起来像:
00400000-00401000 R-XP 00000000 08:01 8915461 /家庭/ 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位操作系统坚持。
也许你应该张贴您的代码或至少一些伪代码?或者只是一个解释,我在/ proc/pid/maps中看到了这一点,所以我在/ proc/pid/pagemap中查找了这个8字节... – Nemo 2011-06-08 20:40:52
谢谢,我按照您的建议扩展了我的问题。 – janjust 2011-06-10 13:38:14
另外,是否有更简单的方法来将代码添加到问题中?不得不将每行分隔4个空格有点费时: -/ – janjust 2011-06-10 13:38:47