Непрерывная физическая память из пространства пользователя - PullRequest
16 голосов
/ 09 декабря 2010

Есть ли способ выделить непрерывную физическую память из пространства пользователя в Linux? По крайней мере, несколько гарантированных непрерывных страниц памяти. Одна огромная страница не ответ.

Ответы [ 4 ]

15 голосов
/ 10 декабря 2010

Нет. Нет. Вам нужно сделать это из пространства ядра.

Если вы говорите «нам нужно сделать это из пространства пользователя» - без каких-либо действий в пространстве ядра это не имеет особого смысла - потому что программа из пространства пользователя не может контролировать или даже знать , если основная память является смежной или нет.

Единственная причина, по которой вам нужно было бы это сделать, - это если вы работали в сочетании с аппаратным обеспечением или каким-либо другим низкоуровневым (то есть ядром) сервисом, которому требовалось это требование. Итак, еще раз, вам придется иметь дело с этим на этом уровне.

Таким образом, ответ не просто «вы не можете», но «вы никогда не должны».

Я написал такие менеджеры памяти, что do позволяют мне это делать - но это всегда было из-за некоторой основной проблемы на уровне ядра, которая должна была быть решена на уровне ядра. Обычно потому, что какой-то другой агент на шине (PCI-карта, BIOS или даже другой компьютер через интерфейс RDMA) имел физическую непрерывную потребность в памяти. Опять же, все это должно было решаться в пространстве ядра.

Когда вы говорите о «строках кэша» - вам не о чем беспокоиться. Вы можете быть уверены, что каждая страница вашей памяти пользовательского пространства является смежной, и каждая страница намного больше строки кэша (независимо от того, о какой архитектуре вы говорите) .

8 голосов
/ 21 августа 2014

Да, если вам нужны только несколько страниц, это действительно возможно.

Файл /proc/[pid]/pagemap теперь позволяет программам проверять сопоставление своей виртуальной памяти с физической памятью.

Хотя вы не можете явно изменить отображение, вы можете просто выделить виртуальную страницу, заблокировать ее в памяти с помощью вызова mlock, записать ее физический адрес с помощью поиска в /proc/self/pagemap и повторитьпока не произойдет , чтобы получить достаточное количество блоков, соприкасающихся друг с другом, чтобы создать достаточно большой непрерывный блок.Затем разблокируйте и освободите лишние блоки.

Это хакерский, неуклюжий и потенциально медленный процесс, но его стоит попробовать.С другой стороны, есть довольно большой шанс, что это на самом деле не то, что вам действительно нужно.

1 голос
/ 19 мая 2015

Распределитель памяти библиотеки DPDK использует описанный подход @Wallacoloo. eal_memory.c .Код BSD лицензирован.

0 голосов
/ 25 февраля 2017

если конкретный драйвер устройства экспортирует буфер dma, который является физически непрерывным, пользовательское пространство может получить доступ через dma buf apis так что пользовательская задача может получить доступ, но не может быть выделена напрямую

это потому, что физически смежные ограничения не из пользовательских приложений, а только из устройства поэтому должны заботиться только драйверы устройств.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...