Поиск местоположения устройства подкачки по виртуальному адресу - PullRequest
1 голос
/ 03 ноября 2019

С помощью виртуального адреса я пытаюсь выяснить точное местоположение устройства подкачки, где хранятся данные (например, сектор) в моем модуле ядра. Отсюда я прочитал (https://www.kernel.org/doc/gorman/html/understand/understand014.html), что информация о записи подкачки хранится в таблице страниц, поэтому я попробовал что-то вроде этого:

// Get PTE for the virtual address
mm = current->mm;
pgd = pgd_offset(mm, (unsigned long)addr);  
p4d = p4d_offset(pgd, (unsigned long)addr);
pud = pud_offset(p4d, (unsigned long)addr);
pmd = pmd_offset(pud, (unsigned long)addr);  
pte = pte_offset_map(pmd, (unsigned long)addr);  

// Get swap device position for the PTE
swp_entry = pte_to_swp_entry(*pte);
printk(KERN_INFO "Swap entry: %lu", swp_entry.val);
swap_offset = swp_offset(swp_entry);
printk(KERN_INFO "Swap offset: %lu", swap_offset);

Насколько я понимаю, получаемый swap_offset является индексомв массив swap_map, который может быть размером до 2 ^ 24 записей (охватывающих 64 ГБ пространства подкачки). Однако полученное мной значение swap_offset слишком велико, больше 2 ^ 24. При правильно известном swap_offset моя идея заключалась в том, чтопредположить, что он представляет собой смещение от начальной точки устройства подкачки (возможно, с некоторым делением для получения номера сектора).

Я правильно понимаю, что-то не так? Если я совершенно не в том направлении, как я могу узнатьрасположение подкачки от виртуального адреса?

Любая помощь очень ценится! Спасибо.

...