Я пытаюсь разобраться в двух файлах, упомянутых в названии. Я искал, что такое биты; однако я не понимаю, как извлечь полезную информацию из них (или я просто приближаюсь к ней неправильно).
Позвольте мне объяснить: pagemaps - это более новый псевдо файл с функцией "feature", который содержит информацию физического кадра виртуальных страниц, назначенных текущему [pid]. То есть, с учетом виртуальной страницы, начинающейся с адреса x, скажем, "vas" для запуска виртуального адреса, я могу проиндексировать файл pagemap с помощью vas, чтобы получить 64 бита отображаемого физического кадра страницы. Эти биты содержат информацию об этой виртуальной странице. Однако, когда я извлекаю биты и делаю немного смены, я теряюсь в том, что вижу.
Биты представляются следующим образом: 0-54 - номер кадра страницы, 55-60 - сдвиг страницы, 63-й бит - настоящий бит, для меня есть другие бит, которые мне мало интересны. После того, как я сделаю немного сопоставления с использованием адресов vas из /proc/ [pid]/maps, кажется, что практически каждая страница процесса заменена, то есть 63-й бит всегда равен нулю.: (
Я думаю, вопрос в том, как я должен эффективно использовать pagemaps, чтобы получить эквивалентный физический адрес адреса, заданный /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 [stack]
Затем я извлекаю количество виртуальных страниц, к которым он прикасается, и индексирует двоичный файл /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-битной ОС.