1

У меня есть запросы относительно адресацию и рассеивание (SG) список, пожалуйста, может кто-нибудь помочь мне со следующим:виртуальные смежные адреса и scattergather

Q # 1: , если размер страницы равен 4096, давайте предполагать сценарий, подобный ниже

страница 0 --- 0-3096 байт используются и 1000 байтов бесплатны страница1 --- 0-3096 байт используются и 1000 байтов бесплатны страница2 --- 0-3096 байт используются и 1000 байт являются бесплатными pageN --- 0-3096 байтов используются и 1000 байтов являются бесплатными

, так что если я запрошу на память 1010, возможно, будет использовать malloc, будет ли он терпеть неудачу, поскольку ни одна из страниц не имеет более 1000 байт или не выделяет память, собирая (накапливая) из нескольких страниц, таких как page0 (1000bytes) + page1 (10) байтов?

Q # 2: Если размер страницы составляет 4096, то для данной страницы виртуальные адреса с 0-4096 гарантированы физически смежными?

3:

если я получаю данные в scatterlist в пределах размера страницы (может 4096), значит ли это на самом деле не разбросаны по всей физической памяти, так как она меньше или равна (< =) к размер одной страницы?

BR, & Sanumala

ответ

1

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"], а затем восстановить другую физическую страницу вместо нее, считывая содержимое из пространства подкачки без процесса осознавая это).

 Смежные вопросы

  • Нет связанных вопросов^_^