LINUX.ORG.RU

Память процесса

 


0

3

Как отобразить память пользовательского процесса в ядре? чтоб можно было его читать?
Пробую получить список страниц памяти процесса, через get_user_pages , запрошено 7000 страниц, а функция возвращает (10..или 5... но значение больше нуля).Т.е нет реального отображения.
Как сделать, чтоб (память, тело, файл или что там ещё может быть) процесса, была отображена в памяти.
И ещё вопрос, число реально отображённых страниц памяти процесса меньше запрошенной, изза того что «действует» отложенное выделение страниц памяти? (или я чтото не понимаю)


get_user_pages может вполне штатно вернуть меньше страниц, чем запрошено. Посмотри как другие пользователи в ядре делают это. Вроде в ядре также была обёртка, которая типичный такой цикл реализовывала. Ещё можно посмотреть в сторону get_user_pages_fast.

А вообще приведи код. Память процесса надо читать из его же сискола или просто из ядра?

Если write=0, для пустой памяти GUP должен вернуть кучу одинаковых страниц.

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

Так яж вызываю эту функцию также как и в ядре примеры. меня интересует, почему меньше страниц возвращает функция. И как все эти страницы отобразить, чтоб читать можно было..

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

Память нужно прочесть именно из ядра.

Aresss
() автор топика

Пробую получить список страниц памяти процесса,

Что такое «получить список страниц памяти процесса»?

через get_user_pages , запрошено 7000 страниц, а функция возвращает (10..или 5... но значение больше нуля). Т.е нет реального отображения.

Если у тебя в указанном диапазоне адресов 10 страниц, столько и должно отобразиться.

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

«Что такое «получить список страниц памяти процесса»? »
Эт имею ввиду получить указатели на все struct page для указанного диапазона.

7000 (примерно) это количество страниц занимаемых процессом(в конкретном диапазоне, с которым работаю). При запросе get_user_pages пробую получить указатель struct page **pages_ptr
Вот что показывает цикл проверки первых 20-ти указателей, на возвращённые страницы.

[0] pages_ptr = ffffea0000af9418 
[1] pages_ptr = ffffea00005ff8b0 
[2] pages_ptr = ffffea00005ff8e8 
[3] pages_ptr = ffffea00005ee660 
[4] pages_ptr = ffffea00005ee698 
[5] pages_ptr = ffffea00005ee6d0 
[6] pages_ptr = ffffea00005ee708 
[7] pages_ptr = ffffea00005c96e0 
[8] pages_ptr = ffffea00005c9718 
[9] pages_ptr = ffffea00005c9750 
[10] pages_ptr = (null) 
[11] pages_ptr = (null) 
[12] pages_ptr = (null) 
[13] pages_ptr = (null) 
[14] pages_ptr = (null) 
[15] pages_ptr = (null) 
[16] pages_ptr = (null) 
[17] pages_ptr = (null) 
[18] pages_ptr = (null) 
[19] pages_ptr = (null) 

(на новых ядрах, get_user_pages возрвращает указатели на все отмапенные страницы памяти процесса, а в старых ядрах, видим что отмапено только 10 страниц)
Смотрел исходники функции, примерно понимаю как она работает.
Да не могу повторить её функционал (хотябы вызвать follow_page, там всегда андефайнед символ... не хочу указатели на функции искатьи усложнять код)

metawishmaster
Почитал, к сожалению это не то (.. (исходники посмотрю функций, но не думаю что поможет.)

Народ, ну неужели никто не знает простого способа указать процессу, что нужно все страницы процесса отмапить???

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

Народ, ну неужели никто не знает простого способа

Простой способ читать и писать память процесса тебе указал wishmaster.

указать процессу, что нужно все страницы процесса отмапить???

get_user_pages закрепляет страницы в памяти. Размер памяти процесса может быть больше, чем размер памяти машины, так что «отмапить все страницы» не получится в принципе.

tailgunner ★★★★★
()

Как сделать, чтоб (память, тело, файл или что там ещё может быть) процесса, была отображена в памяти.

mlock()

Так делается в системах реального времени, чтобы весь код, например, всегда был в памяти, чтобы в нужный момент алгоритм не тормознул только из-за того, что следующую инструкцию нужно прочитать с диска.

Deleted
()
Ответ на: комментарий от anonymous

Народ! помогите! уже не знаю что и делать. (видимо оочень сильно туплю) Пробовал в цикле вызывать функцию get_user_pages
Вот пример vma
start=0x7fd55a0d5, end=0x7fd55a2d5, nr_pages=513
Для получения первой страницы, передаю адрес «start» - 0x00007fd55a0d5000 в get_user_pages
В результате получаю одну страницу из 513-ти
Далее пробую получить вторую страницу, и передаю функции адрес 0x00007fd55a0d6000
И функция возвращает ошибку -14
C адресами не напутал? какой адрес следует передавать функции, чтоб получить вторую страницу?

Aresss
() автор топика
Ответ на: комментарий от anonymous
  size_t got;
  int ret;
  int num_pages = *nr_pages; 

printk("*nr_pages = %i\n", *nr_pages);  

  for (got = 0; got < num_pages; got += ret) 
  {
      printk("for : got = %i : addr: %p\n", got, vma->vm_start + got * PAGE_SIZE);
      
		ret = get_user_pages(tsk, mm,
				     vma->vm_start + got * PAGE_SIZE,
				     num_pages - got, 1, 1,
				     pages + got, NULL);
		if (ret < 0)
		{
                    printk("ret < 0; ret = %i: got = %i : addr: %p\n", ret, got,  vma->vm_start + got * PAGE_SIZE);
                    return NULL;
                }
                printk("ret = %i\n\n", ret);
	}



dmesg показывает
*nr_pages = 513
for : got = 0 : addr: 00007f0e85e2548c
ret = 1 (почему возвращается всего одна страница??? из 513-ти?)

for : got = 1 : addr: 00007f0e85e2648c
ret < 0; ret = -14: got = 1 : addr: 00007f0e85e2648c
(-14 - не корректный адрес...)

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

Какой огрызок?
В этом огрызке, вся суть вопроса!!!
Если нужно напомнить, вопрос такой.
Почему get_user_pages возвращает всего ОДНУ СТРАНИЦУ из всех запрошенных!!!!!
Второй вопрос, почему, если делать как в ядре, через цикл, то сразуже, после запроса второй страницы, функция возвращает ОШИБКУ!
В этом огрызке! весь код находится!!!!. Как вызывается, как цикл работает! приведён весь вывод!!!
Чего ещё надо то? (это не вопрос.)

Aresss
() автор топика

никто не знает?

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

лалка, ты хотя бы коммент почитал к тому что вызывашь. если это весь код что у тебя есть (хз откуда берутся nr_pages, mm и tsk, держишь ли ты семофор или нет) то тебе прямая дорога в jobs - за бесплатно с тобой, таким капризным, нянчится никто не будет.

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

Второй вопрос, почему, если делать как в ядре, через цикл, то сразуже, после запроса второй страницы, функция возвращает ОШИБКУ!

Тут какраз всё нормально. Потому что функция возвращает количество успешно взятых страниц, если оно не ноль. Если ни одной не взято, то возвращает код ошибки.

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

Ну и прав царь, показывай больше кода.

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