我試圖讓我的頭在標題中提到的兩個文件。 我已經查過這些位是什麼;然而,我不明白如何從中提取有用的信息(或者我只是以錯誤的方式接近它)。/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