Как сделать виртуальный адрес смежным в зоне физического адреса, чтобы повысить производительность? - PullRequest
2 голосов
/ 23 апреля 2019

Недавно я читаю код с огромной страницей в dpdk (dpdk.org). Я вижу, что код специально делает виртуальный адрес смежным в зоне физического адреса. В частности, он сначала проверяет, существует ли физически смежная зона в огромных страницах, и сопоставляет физически смежную зону с непрерывным виртуальным адресом. Как это улучшает производительность?

Исходный код говорит:

Чтобы зарезервировать большой непрерывный объем памяти, мы используем функцию огромных страниц в Linux. Для этого нам нужно смонтировать hugetlbfs. Этот код создаст много файлов в этом каталоге (по одному на страницу) и отобразит их в виртуальной памяти. Для каждой страницы мы извлечем ее физический адрес и переназначим его, чтобы иметь виртуальную смежную зону, а также физическую смежную зону.

Почему это переопределение необходимо?

1 Ответ

1 голос
/ 25 апреля 2019

сопоставить физически смежную зону с непрерывным виртуальным адресом.Как это повышает производительность?

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 из виртуального адреса, как описано ранее.

Надеюсь, это немного прояснит идею смежных зон памяти и переназначения.

...