файл карты в оперативной памяти - PullRequest
0 голосов
/ 21 декабря 2009

Platofrm - Linux, Arch - ARM Язык программирования - C / C ++

Цель - сопоставить обычный (скажем, текстовый) файл с заранее известным местоположением (физическим адресом) в оперативной памяти и передать этот физический адрес другому приложению. Размер блока, который я отображаю одновременно, составляет 128 КБ.

То, что я пытаюсь сделать, это ... Процесс пространства пользователя выполняет вызов ioctl, чтобы попросить драйвер устройства получить кусок памяти (ram), вычислить физический адрес и вернуть его в пространство пользователя.

Процесс пространства пользователя должен отобразить файл в это физическое адресное пространство Я не уверен, как это сделать. Любая помощь приветствуется. ???

Проблема с вызовом mmap для файла и последующим вычислением физического адреса заключается в том, что страницы не находятся в памяти до тех пор, пока кто-то к ним не получит доступ, а выделенные страницы физической памяти могут не быть смежными.

Другой процесс, который фактически получит доступ к файлу, - это приложение стороннего поставщика. Это приложение требует, как только мы передадим ему физический адрес, содержимое файла должно находиться в непрерывной памяти.

Как я это делаю прямо сейчас -

Пользовательский процесс вызывает mmap для устройства. Драйвер устройства выполняет kmalloc, вычисляет начальный физический адрес и отображает VMA на этот физический адрес. Теперь пользовательский процесс выполняет чтение файла и копирует его в адресное пространство, полученное во время mmap.

Проблема: копия файла существует в двух местах в оперативной памяти, одна - когда чтение выполняется с диска, а другая - когда я копирую его в буфер, полученный с использованием mmap и соответствующих накладных расходов на копирование. В идеальном мире я хотел бы загрузить файл прямо с диска в известное / заранее определенное место.

Ответы [ 2 ]

1 голос
/ 22 декабря 2009

Возможно, что-то вроде madvise() с MADV_SEQUENTIAL аргументом совета может помочь?

Некоторые вещи, которые следует учитывать:

  • Какого размера файл, который вы собираетесь отображать?
  • Это может повлиять на вашу способность получать непрерывный блок оперативной памяти, даже если вы используете подход, основанный на драйвере ядра.
  • При подходе, основанном на драйверах ядра, драйверы с хорошим поведением обычно не должны kmalloc(), , например, , чтобы получить непрерывный блок памяти, более 32 КБ. Кроме того, вы обычно не можете kmalloc() более 2 МБ (я пробовал это :)). Это подойдет для ваших нужд?
  • Если вам нужен действительно большой кусок памяти, может помочь что-то вроде функции ядра alloc_bootmem(), но она работает только для статических драйверов встроенных , а не для динамически загружаемых.
  • Есть ли какой-нибудь способ, которым вы можете переделать свой дизайн так, чтобы большой непрерывный блок отображенной памяти не был необходим?
1 голос
/ 22 декабря 2009

«Отображение файла» подразумевает использование виртуальных адресов, а не физических, так что это не будет делать то, что вы хотите.

Если вы хотите поместить содержимое файла в непрерывный блок физической памяти, просто используйте open() и read(), как только вы получите непрерывный буфер.

...