TL; др: Это зависит от многого.
В ядре linux имеется несколько интерфейсов выделения памяти, которые имеют разные свойства.
Один такой интерфейс - kmalloc
, который возвращает физически смежную память (см. Также этот ответ: Linux kernel memory management, does it use consecutive memory pages all the time?).
И есть vmalloc
, который возвращает практически непрерывную память, которая может распространяться на несколько нефизически смежных страниц.
Существует множество других вариантов выделения памяти, позволяющих выделять небольшие блоки памяти для собственного использования или большие блоки, которые будут использоваться от имени пользовательских процессов, или несколько страниц для использования с DMA на/с устройств или их сочетание.
Для других вопросов, IIUC, память в пределах одной страницы всегда физически соприкасается по определению. (Например, если размер страницы равен 4096 [0x1000], и вы выделяете 0x100 байт и возвращаете адрес с 0xb00 в младших разрядах, невозможно, чтобы он не был физически смежным.) Для распределений, которые могут пересекать границу страницы - то есть, где start_address & PAGE_MASK != end_address & PAGE_MASK
- это будет зависеть от того, какой интерфейс распределения вы использовали.
Scatter-gather - это общая концепция, которая описывает ввод/вывод в/из нескольких областей, которые определенно не являются физически смежными. Это может быть либо только внутри ядро (то есть struct scatterlist
специально предназначено для управления многочастной нефизически смежной памятью), либо оно может означать iovec
, используемое для поддержки readv
/writev
. В последнем случае пользователь имеет право запросить операцию сбора-рассеяния, которая имеет область, начинающуюся с XXXXX004, длиной 10 байт плюс еще один регион в YYYYY300 для 20 байтов. XXXXX и YYYYY могут быть одинаковыми или могут отличаться.Если они одинаковы, то да, вы можете быть уверены, что они находятся на одной и той же физической странице (опять же, iff либо длина не пересекает границу страницы).
Если на malloc
вы фактически имеете в виду библиотечную функцию пользовательского пространства, эта память может считаться физически смежной до такой степени, что длина не охватывает границу страницы (и на самом деле она может измениться в любой момент - ядро бесплатно в любой момент, чтобы украсть страницу, записать ее содержимое в раздел подкачки ["swap"], а затем восстановить другую физическую страницу вместо нее, считывая содержимое из пространства подкачки без процесса осознавая это).