Сначала я расскажу об окружении моего ПК, предыстории моего вопроса, моей проблеме, а затем объясню свой точный вопрос.
Окружающая среда:
ОС: Ubuntu 16.04
Ядро: 4.17.1
Процессор: i7-6700k
Память: 8 ГБ DRAM
Хранение: SSD 120 ГБ
Справка:
Я пытаюсь оптимизировать ядро Linux для моего конкретного приложения. Ниже приведена абстрактная логика этого приложения.
1. вызовите malloc, выделите пространство памяти, размер которого точно равен 4 КБ (размер страницы)
2. Скопируйте предварительно определенные данные (также размером 4 КБ) в выделенную область памяти.
3. Сделай расчет
4. Свободное выделенное пространство памяти.
Эта последовательность происходит от нескольких тысяч до десяти тысяч раз в секунду.
Поэтому я подумал, что копировать предопределенные данные в выделенную область памяти с помощью memcpy () тысячи раз в секунду очень неэффективно. Но я не могу исправить код этого приложения.
Моя проблема:
Я хочу делать эти копии асинхронно модулем ядра, используя как можно меньше циклов ЦП. Поэтому я пытаюсь реализовать модуль ядра, который копирует эти предопределенные данные для асинхронного освобождения фреймов страниц в ядре, и управляю фреймами страниц пула, в которых есть предопределенные данные. Когда мое конкретное приложение запрашивает фрейм страницы, мое ядро выдаст фрейм страницы из этого пула.
Для асинхронного копирования данных я сначала рассмотрел DMA, но intel idma64 моего ЦП не может копировать память данных в память асинхронно. Теперь я пытаюсь скопировать эти данные из вторичного хранилища (SSD) в память. Я обнаружил, что в Linux есть библиотека для асинхронного ввода-вывода с именем libaio.
Мой вопрос:
1. Могу ли я использовать библиотеки libaio в модуле ядра? Если нет, какую библиотеку или API нужно использовать для асинхронного копирования в моем модуле ядра?
2. Будет ли libaio (или что-то еще) делать копии без использования циклов ЦП?