Во-первых, можно брать память из кучи ОС, во-вторых, можно делать NEW страницами фиксированного размера и просто кэшировать эти страницы глобально в модуле-реализации. Т.е. освободившиеся внутри одного объекта-буфера страницы сохранять в списке свободных, для повторного использования, не соря.

Ну а для общения двух ББ нужно использовать свою работу с логическими страницами внутри некоторого куска памяти, который отображен между ББ (через memory mapping), определить untagged-структуры для такого файла в памяти, чтобы объект Files.File был просто обёрткой над ними.

Я бы повыкладывал конкретный код, не жалко, если бы он не был сильно завязан на свои библиотеки - да и "постарел" код за 4 года, сейчас уже есть намерения переделать с высоты сегодняшнего понимания