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