сопоставить физически смежную зону с непрерывным виртуальным адресом.Как это повышает производительность?
DPDK нужны как физические, так и виртуальные адреса.Виртуальный адрес используется обычно, чтобы загрузить / сохранить некоторые данные.Физический адрес необходим драйверам пространства пользователя для передачи данных на устройства и с них.
Например, мы выделяем несколько mbuf
с виртуальными адресами 0x41000
, 0x42000
и 0x43000
.Затем мы заполняем их некоторыми данными и передаем эти виртуальные адреса в PMD для передачи.
Драйвер должен преобразовать эти виртуальные адреса в физические.Если физические страницы сопоставляются с непрерывным виртуальным адресным пространством, для преобразования виртуальных в физические адреса нам необходимо выполнить поиск по всем сопоставлениям.Например, виртуальный адрес 0x41000
может соответствовать физическому 0x81000
, 0x42000
соответствует 0x16000
, а 0x43000
- 0x64000
.
Лучший вариант такого поиска - одинчтение памяти, наихудший случай - несколько операций чтения памяти для каждого буфера .
Но если мы уверены, что виртуальные и физические адреса зоны памяти являются смежными, мы просто добавляем смещениена виртуальный адрес, чтобы получить физический и наоборот.Например, виртуальный 0x41000
соответствует 0x81000
, виртуальный 0x42000
- физическому 0x82000
, а 0x43000
- 0x83000
.
Смещение, которое мы знаем из сопоставления.Наихудший случай такого перевода - одно чтение памяти на все буферы в пакете , что является огромным улучшением для перевода.
Зачем нужно это перераспределение?
Для сопоставления огромной страницы с виртуальным адресным пространством используется системный вызов mmap
.API вызова позволяет указать фиксированный виртуальный адрес для огромной страницы, которая будет отображаться.Это позволяет отображать огромные страницы одну за другой, создавая непрерывную зону виртуальной памяти .Например, мы можем mmap
огромную страницу по виртуальному адресу 0x200000
, следующую по виртуальному адресу 0x400000
и т. Д.
К сожалению, мы не знаем физических адресовогромные страницы, пока они не отображаются.Таким образом, по виртуальному адресу 0x200000
мы можем сопоставить физический адрес 0x800000
, а по виртуальному адресу 0x400000
- физический 0x600000
.
Но как только мы впервые отобразили эти огромные страницыМы знаем как физические, так и виртуальные адреса.Таким образом, все, что нам нужно , - это переназначить их в правильном порядке: по виртуальному адресу 0x1200000
мы отображаем физическое 0x600000
, а на 0x1400000
- физическое 0x800000
.
Теперь у нас есть виртуально и физически непрерывная зона памяти, начинающаяся с виртуального адреса 0x1200000
и физического адреса 0x600000
.Таким образом, чтобы преобразовать виртуальные адреса в физические в этой зоне памяти, нам просто нужно вычесть смещение 0x600000
из виртуального адреса, как описано ранее.
Надеюсь, это немного прояснит идею смежных зон памяти и переназначения.