Этот вопрос, кажется, задает вопрос, возможно ли объединить содержимое двух буферов (A и B) со следующими ограничениями:
- Вы не можете скопировать содержимое A или B.
- Вы не можете изменить адрес A.
- Операция должна иметь сложность в худшем случае
- Предположительно, адрес B таков, что A и B еще не соединены. (Как отметил в своем ответе Дж.Ф. Себастьян, если вы, во-первых, можете выделить как А, так и В в первую очередь, то все готово. Но это похоже на вырожденный случай.)
- Вы должны быть в состоянии сделать это из драйвера ядра Linux (см. Комментарий под ответом Джерома).
- Ни A, ни B не выровнены по страницам (см. Комментарий под оригинальным вопросом).
- Ни A, ни B не кратны размеру страницы (см. Комментарий под оригинальным вопросом).
Учитывая все это, мой ответ - нет: это невозможно.
Да, ядро ОС может использовать MMU ЦП (модуль управления памятью на архитектурах, которые его имеют) для переназначения памяти либо в виртуальном адресном пространстве ядра, либо в виртуальном адресном пространстве пользователя. Выделите непрерывный фрагмент виртуального адресного пространства, затем переназначьте A и B в этот буфер, изменив записи таблицы страниц для фрагмента виртуального адресного пространства, указав на физические адреса A и B.
Это не меняет виртуальный адрес A как таковой (поскольку старый виртуальный адрес все еще действителен), но он требует доступа к нему через другой виртуальный адрес. Это может быть проблемой.
Степень детализации этого перераспределения в современных типичных архитектурах ЦП основана на размерах страниц, и, поскольку А и В не выровнены и не кратны размеру страницы, вы не сможете их сделать. полностью выстроиться Это определенно проблема.
Для преобразования N байтов требуется изменить хотя бы одну запись таблицы страниц на каждые M байтов, где M - размер страницы. Это означает, что операция переотображения в любом случае имеет вычислительную сложность O (n). Другие операции, такие как выделение большего количества физических страниц для таблиц страниц, очистка кэшей и TLB и т. Д., Могут иметь дополнительные последствия для производительности.
Кроме того, мне интересно, если цель этого вопроса каким-то образом связана с DMA (прямой доступ к памяти). При выполнении DMA с архаичным устройством, которое требует непрерывной памяти, никакое количество переназначения не поможет, если у вас нет IOMMU в вашем распоряжении. И современному устройству, которое может выполнять DMA-сборку с разбросом, в первую очередь не потребуются непрерывные буферы.