Вопрос или проблема
Предполагая наличие 1 ТиБ NVMe SSD, я задумываюсь, возможно ли отобразить всю его емкость (1 ТиБ) в PCIe BAR для памяти, отображаемой в ввода-вывода (MMIO).
Мое понимание заключается в том, что обычно только регистры устройства и регистры дверного звонка NVMe SSD отображаются в пространстве PCIe BAR, позволяя доступ к MMIO. После того как дверной звонок срабатывает, передача данных осуществляется через DMA между системной памятью и NVMe SSD. Это заставляет меня задуматься, возможно ли открыть ограниченный размер памяти/регистров устройств для большого диапазона MMIO. Также в этом посте CMB (буфер памяти контроллера) NVMe SSD не рассматривается.
Учитывая диспропорцию между маленьким размером пространства PCIe BAR NVMe SSD и его общей емкостью хранения, я не уверен, можно ли всей SSD предоставить доступ к PCIe BAR или физической памяти.
Если кто-то мог бы дать советы или прояснить мое понимание PCIe, BAR и NVMe, я был бы очень признателен. Спасибо за ваше время и помощь!
Вот пример 1 ТиБ Samsung 980Pro SSD с только 16К в PCIe BAR:
# lspci -s 3b:00.0 -v
3b:00.0 Контроллер энергонезависимой памяти: Samsung Electronics Co Ltd NVMe SSD Controller PM9A1/PM9A3/980PRO (prog-if 02 [NVM Express])
Подсистема: Samsung Electronics Co Ltd NVMe SSD Controller PM9A1/PM9A3/980PRO
Флаги: мастер шины, быстрый devsel, задержка 0, IRQ 116, NUMA узел 0, IOMMU группа 11
Память на b8600000 (64-бит, не предвыборочная) [размер=16K]
Возможности: [40] Управление питанием версия 3
Возможности: [50] MSI: Включить- Количество=1/32 Маскируемый- 64-бит+
Возможности: [70] Express Endpoint, MSI 00
Возможности: [b0] MSI-X: Включить+ Количество=130 Маскированный-
Возможности: [100] Расширенная отчетность об ошибках
Возможности: [168] Альтернативная интерпретация идентификатора маршрутизации (ARI)
Возможности: [178] Вторичный PCI Express
Возможности: [198] Физический уровень 16.0 GT/s <?>
Возможности: [1bc] Оценка маржи соединения на принимающей стороне <?>
Возможности: [214] Отчет о терпимости задержки
Возможности: [21c] Подсостояния L1 PM
Возможности: [3a0] Особенности канала передачи данных <?>
Ядерный драйвер в использовании: nvme
Ядерные модули: nvme
Например, пространство хранения NVMe 1 ТБ доступно по блочным адресам. Непосредственное сопоставление этого с 64-битным пространством не является возможным для обеспечения доступа MMIO, например, с помощью memcpy. Это протокол последовательной передачи данных, который не обеспечивает доступ к MMIO. Для обеспечения доступа MMIO к блокам SSD потребуется реализация нового интерфейса. Вы могли бы, например, написать драйвер, который будет маскировать собой предоставление непрерывного доступа MMIO, но на заднем фоне будет выполнять SHGL и очереди команд/завершений DMA NVMe, а также опрос/прерывание для обработки передачи. Это было бы похоже на RAID 0 из одного диска на SSD, но этот RAID 0 обеспечивал бы псевдопамять. Хотя весь 1 ТБ SSD не будет находиться в памяти, секции можно будет загружать и выгружать, подобно тому, как операционная система использует файл подкачки. Очевидно, что это становится очень сложным и подверженным повреждениям данных, если не сделать это правильно.
Или просто отформатируйте SSD и создайте очень большой файл пустого пространства на SSD, затем откройте этот файл в памяти и получите доступ к каждому байту в файле с помощью интерфейса, который переводит на fread и fwrite, чтобы создать видимость последовательного доступа к памяти SSD.
Но зачем все это?
-os
Ответ или решение
Картирование всего объема NVMe SSD в пространство PCIe BAR для доступа к памяти, использующему MMIO, представляет собой задачу с рядом ограничений и соображений. Стандартная практика заключается в том, что лишь небольшая часть адресного пространства NVMe SSD (например, регистры устройства и двери для прерываний) отображается в пространство PCIe BAR, что позволяет осуществлять память с помощью ввода-вывода. Давайте разберем эту тему более подробно.
Основные ограничения NVMe и PCIe
-
Ограниченный размер пространства BAR: В примере с Samsung 980 Pro размер PCIe BAR составляет лишь 16K. Это пространство используется для управления регистрами устройства, а не для отображения всего доступного объема SSD. Таким образом, попытка сопоставить весь объем (в данном случае 1 ТиБ) в пространстве BAR в основном невыполнима, поскольку это нарушает архитектурные и спецификационные ограничения.
-
Структура NVMe: NVMe (Non-Volatile Memory Express) использует архитектуру, ориентированную на взаимодействие по блочному адресованию. Это означает, что операции ввода-вывода идут через блоки, а не как прямой доступ к памяти. В отличие от систем, предусматривающих прямой доступ к памяти, NVMe полагается на механизмы передачи данных, такие как DMA (Direct Memory Access), для работы с хранилищем.
Альтернативные подходы
-
Создание промежуточного программного обеспечения: Можно разработать драйвер, который будет действовать как моста между наличными механиками MMIO и NVMe. Этот драйвер мог бы осуществлять операции доступа к данным, выдавая MMIO-интерфейс, но в реальности отвлекаясь на использование стандартных команд NVMe с их очередями команд и завершения.
-
Эмуляция sequential memory access: Альтернативой является создание большой файловой системы на SSD и обращение к этому дисковому пространству через интерфейсы, транслирующие операции файлового ввода-вывода (например,
fread
иfwrite
). Это позволит имитировать последовательный доступ к памяти, хотя и с определенной задержкой, поскольку операции по-прежнему будут зависеть от механизма блочного адресования.
Заключение
В результате, нельзя полностью сопоставить объем NVMe SSD в пространстве PCIe BAR для MMIO, и особенно в случае с крупными объемами, такими как 1 ТиБ, это не будет практическим решением. Совершенно необходимо рассмотреть проекты, связанные с управлением памятью и обеспечением доступа на уровне драйверов и программного обеспечения, чтобы адаптироваться к ограничениям NVMe. Эти подходы могут помочь обеспечить более удобный пользовательский опыт и повысить производительность при правильном проектировании.
Таким образом, если рассматривать вопрос с позиции разработки, следует помнить о современных ограничениях NVMe и PCIe, а также о возможностях, которые они предоставляют для создания эффективных систем доступа к данным.