Platofrm - Linux, Arch - ARM
Язык программирования - C / C ++
Цель - сопоставить обычный (скажем, текстовый) файл с заранее известным местоположением (физическим адресом) в оперативной памяти и передать этот физический адрес другому приложению. Размер блока, который я отображаю одновременно, составляет 128 КБ.
То, что я пытаюсь сделать, это ...
Процесс пространства пользователя выполняет вызов ioctl, чтобы попросить драйвер устройства получить кусок памяти (ram), вычислить физический адрес и вернуть его в пространство пользователя.
Процесс пространства пользователя должен отобразить файл в это физическое адресное пространство
Я не уверен, как это сделать. Любая помощь приветствуется. ???
Проблема с вызовом mmap для файла и последующим вычислением физического адреса заключается в том, что страницы не находятся в памяти до тех пор, пока кто-то к ним не получит доступ, а выделенные страницы физической памяти могут не быть смежными.
Другой процесс, который фактически получит доступ к файлу, - это приложение стороннего поставщика. Это приложение требует, как только мы передадим ему физический адрес, содержимое файла должно находиться в непрерывной памяти.
Как я это делаю прямо сейчас -
Пользовательский процесс вызывает mmap для устройства.
Драйвер устройства выполняет kmalloc, вычисляет начальный физический адрес и отображает VMA на этот физический адрес.
Теперь пользовательский процесс выполняет чтение файла и копирует его в адресное пространство, полученное во время mmap.
Проблема: копия файла существует в двух местах в оперативной памяти, одна - когда чтение выполняется с диска, а другая - когда я копирую его в буфер, полученный с использованием mmap и соответствующих накладных расходов на копирование.
В идеальном мире я хотел бы загрузить файл прямо с диска в известное / заранее определенное место.