Подтвердить что ты не робот

Linux непрерывная физическая память из пользовательского пространства

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

4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

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

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