LINUX.ORG.RU

Соответствия адресов, в ядре и в процессе

 


0

3

Есть указатель void *kern_addr = ffff88007783c000; в пространстве ядра. Указывающий на память процесса прикладного уровня. Гдето в этой памяти лежат данные, записанные в «кучу» прикладного процесса.(пусть будет просто текст «hello world»). Через простой поиск данных, нахожу эту самую строку, и с помощью memcpy заменяю её на «aaaaaaaaa» , далее указываю что страница была изменена - SetPageDirty(page).
Смотрю на «изменённые» данные в процессе прикладной программы. Они не изменялись. Как было «hello world» так и осталось.
Почему не изменились данные в программе прикладного уровня?


ну для начала, я бы попробовал не memcpy, а copy_to_user

metawishmaster ★★★★★
()

Зачем её dirty делать? Как именно юзерская страница очутилась замапленной в пространстве ядра? От этого плясать надо.

mv ★★★★★
()
Ответ на: комментарий от mv

Оказалось, всё изменяется. Ошибся я.
Можите подсказать, как можно узнать какому линейному адресу пренадлежит логический адрес процесса?
Описание того как он высчитывается, я знаю. Да боюсь что снова напутаю. Также как с адресами в memcpy.

Aresss
() автор топика
Ответ на: комментарий от mv

Разъясните пожалуйста
Смотрю на адреса, как баран и всёравно не понимаю.
Вот пример адресов.
0x7f305dd316e8 // это адрес данных на прикладном уровне
0x7f305dcb3000 // vma_start
0x7f305dd71b64 // vma_and
Проверяю все страницы памяти в данном диапазоне, нахожу данные прикладного процесса, и смотрю его адрес
0xffff8800603126e8 // это адрес по которому находятся данные (прикладного уровня по адресу 0x7f305dd316e8 ) в страницах, памяти.

Как определяется вообще, что 0x7f305dd316e8 == 0xffff8800603126e8
Полагаю что 0x7f305dd316e89 == 0xffff8800603126e9
Как убедиться в этом (или наоборот)


И также интересует, к примеру.

Aresss
() автор топика
Ответ на: комментарий от Aresss

И также интересует обратная операция, как зная адрес в странице памяти «0xffff8800603126e8» определить адрес в пользовательском процессе, который транслируется на данный адрес.

Aresss
() автор топика
Ответ на: комментарий от Aresss

Это адрес struct page - структуры, которая ведёт учёт этой странички памяти. Чтобы вычислить адрес в физическом адресном пространстве (с чем железо работает), нужно это struct page прогнать через page_to_pfn и сдвинуть влево на PAGE_SHIFT бит.

mv ★★★★★
()
Ответ на: комментарий от Aresss

И также интересует обратная операция, как зная адрес в странице памяти «0xffff8800603126e8» определить адрес в пользовательском процессе, который транслируется на данный адрес.

Для чего именно это нужно? Какая проблема решается?

mv ★★★★★
()
Ответ на: комментарий от mv

Это адрес struct page - структуры, которая ведёт учёт этой странички памяти. Чтобы вычислить адрес в физическом адресном пространстве (с чем железо работает), нужно это struct page прогнать через page_to_pfn и сдвинуть влево на PAGE_SHIFT бит.

Или ещё проще: (0x7f305dd316e8 - vma->vm_start) + (vma->vm_pgoff << PAGE_SHIFT).

mv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.