То, что вы описываете - это Memory Mapped IO, который ни в коем случае не является единственным или даже стандартным способом. И даже в этом сценарии происходят системные вызовы, хотя они могут находиться позади приложения.
Если у вас ошибка страницы, то есть отсутствует часть памяти, ядру по-прежнему будет отправлено уведомление о том, что нужно сделать все возможное, чтобы получить страницы в память с блочного устройства. Есть кое-что, что нужно выяснить, с какого устройства можно получить информацию. С программным рейдом это может быть очень запутанным, с другими это может быть просто, как настройка передачи DMA и позволить ей разорваться. Может быть, есть наборы микросхем, которые могут делать это самостоятельно при определенных обстоятельствах, но, конечно, не все.
Это не потому, что ваша программа не выполняет их, что нет "системных вызовов". Однако такая абстракция дает специалисту по ядру больше свободы при извлечении последней унции производительности из аппаратного обеспечения.