У меня есть консольное приложение Windows, которое использует карту параллельного ввода-вывода для высокоскоростной передачи данных. (Общие стандарты HPDI32ALT )
Мой процесс работает в пользовательском режиме, однако, я уверен, что где-то за API устройства есть некоторая активность драйвера режима ядра (передача PCI DMA, чтение регистров состояния устройства и т. Д.). Рабочая модель примерно такая:
- при запуске: я запрашиваю указатель на буфер ввода-вывода из API.
- в моем основном цикле:
- блок API, ожидающий место в буфере устройства (низкий уровень воды)
- заполнить буфер ввода-вывода данными передачи
- начать передачу на устройство, передав ему указатель на буфер ввода-вывода (в течение этого времени API использует DMA на шине PCI для перемещения данных на карту)
- блок API, ожидающий завершения ввода-вывода
Приложение, кажется, работает правильно с правильной скоростью передачи данных и постоянной пропускной способностью в течение длительных периодов времени, однако, когда я смотрю на процесс в проводнике инструментов sys internals, я вижу большое количество сбоев страниц (~ 6k в секунду ). Я перемещаю ~ 30 МБ / с на карту.
У меня достаточно оперативной памяти, и я уверен, что ошибки страниц не связаны с дисковым вводом-выводом.
Есть мысли о том, что может быть причиной ошибки страницы? У меня также есть сторона приема для этого приложения, которая использует идентичную карту ввода-вывода в режиме приема. Использование API в режиме приема не приводит к большим ошибкам страницы.
Может ли перемещение буфера ввода-вывода в режим ядра вызвать сбои страниц?