Возможно ли отобразить весь NVMe SSD в PCIe BAR для MMIO?

Вопрос или проблема

Предполагая наличие 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

  1. Ограниченный размер пространства BAR: В примере с Samsung 980 Pro размер PCIe BAR составляет лишь 16K. Это пространство используется для управления регистрами устройства, а не для отображения всего доступного объема SSD. Таким образом, попытка сопоставить весь объем (в данном случае 1 ТиБ) в пространстве BAR в основном невыполнима, поскольку это нарушает архитектурные и спецификационные ограничения.

  2. Структура NVMe: NVMe (Non-Volatile Memory Express) использует архитектуру, ориентированную на взаимодействие по блочному адресованию. Это означает, что операции ввода-вывода идут через блоки, а не как прямой доступ к памяти. В отличие от систем, предусматривающих прямой доступ к памяти, NVMe полагается на механизмы передачи данных, такие как DMA (Direct Memory Access), для работы с хранилищем.

Альтернативные подходы

  1. Создание промежуточного программного обеспечения: Можно разработать драйвер, который будет действовать как моста между наличными механиками MMIO и NVMe. Этот драйвер мог бы осуществлять операции доступа к данным, выдавая MMIO-интерфейс, но в реальности отвлекаясь на использование стандартных команд NVMe с их очередями команд и завершения.

  2. Эмуляция sequential memory access: Альтернативой является создание большой файловой системы на SSD и обращение к этому дисковому пространству через интерфейсы, транслирующие операции файлового ввода-вывода (например, fread и fwrite). Это позволит имитировать последовательный доступ к памяти, хотя и с определенной задержкой, поскольку операции по-прежнему будут зависеть от механизма блочного адресования.

Заключение

В результате, нельзя полностью сопоставить объем NVMe SSD в пространстве PCIe BAR для MMIO, и особенно в случае с крупными объемами, такими как 1 ТиБ, это не будет практическим решением. Совершенно необходимо рассмотреть проекты, связанные с управлением памятью и обеспечением доступа на уровне драйверов и программного обеспечения, чтобы адаптироваться к ограничениям NVMe. Эти подходы могут помочь обеспечить более удобный пользовательский опыт и повысить производительность при правильном проектировании.

Таким образом, если рассматривать вопрос с позиции разработки, следует помнить о современных ограничениях NVMe и PCIe, а также о возможностях, которые они предоставляют для создания эффективных систем доступа к данным.

Оцените материал
Добавить комментарий

Капча загружается...