Непрерывное выделение памяти (CMA) необходимо для устройств ввода-вывода, которые могут работать только с непрерывными диапазонами физической памяти. В системах с блоком управления памятью ввода / вывода (IOMMU) это не будет проблемой, поскольку IOMMU может отображать буфер, который является непрерывным в адресном пространстве устройства, в несмежные области физической памяти. Кроме того, некоторые устройства могут рассеивать / собирать DMA (то есть могут считывать / записывать из / в несколько несмежных буферов). В идеале все устройства ввода-вывода должны быть спроектированы так, чтобы они работали за IOMMU или были способны к рассеянию / сбору DMA. К сожалению, это не так, и есть устройства, которые требуют физически смежные буферы. Для драйвера устройства есть два способа выделить непрерывный буфер:
- Драйвер устройства может выделить часть физической памяти во время загрузки. Это надежно, потому что большая часть физической памяти будет доступна во время загрузки. Однако, если устройство ввода-вывода не используется, выделенная физическая память просто теряется.
- Кусок физической памяти может быть выделен по требованию, но может быть трудно найти непрерывный свободный диапазон требуемого размера. Однако преимущество заключается в том, что память выделяется только при необходимости.
CMA решает эту точную проблему, предоставляя преимущества обоих этих подходов без их недостатков. Основная идея состоит в том, чтобы сделать возможным перенести выделенные физические страницы, чтобы создать достаточно места для непрерывного буфера. Более подробную информацию о том, как работает CMA, можно найти здесь .