2009-12-21 3 views
0

Platofrm - Linux, Arch - ARM Программирование языки - C/C++файл карты, чтобы барана

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

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

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

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

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

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

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

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

+0

Пытается перефразировать вопрос: для устройства (встроенного Linux?) Существует жесткий диапазон физических адресов для ввода-вывода. Этот диапазон адресов должен быть сопоставлен с файлом, поэтому любой, кто читает или записывает файл, будет выполнять IO для устройства. Как диапазон адресов можно сопоставить с файлом? – nalply

ответ

1

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

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

+0

Да, верно. Я делаю это так же, как вы предложили. Единственная проблема заключается в том, что копия файла существует в ram в двух разных местах одновременно, а также все дополнительные накладные расходы на копирование и т. Д. Я пытаюсь загрузить файл, считанный с диска, непосредственно в (физическая память), чтобы избежать дополнительной копии файла в физической памяти и соответствующих накладных расходов. – 2009-12-23 12:37:58

+0

Почему бы вам просто не передать адрес буфера, возвращенный 'mmap', чтобы' read', поэтому он читается прямо там? – caf

1

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

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

  • Насколько большой файл, который вы собираетесь быть отображение?
  • Это может повлиять на вашу способность получать непрерывный блок ОЗУ, даже если вы должны принять подход, основанный на драйвере ядра.
  • Для подхода, основанного на драйверах ядра, хорошие драйверы обычно не должны kmalloc(), , например., чтобы получить непрерывный блок памяти, более 32 КБ. Кроме того, вы обычно не можете kmalloc() более 2 МБ (я пробовал это :)). Это будет подходящим для ваших нужд?
  • Если вам нужен действительно большой кусок памяти, то что-то вроде функции ядра alloc_bootmem() может помочь, но она работает только для статических «встроенных» драйверов, а не динамически загружаемых.
  • Есть ли способ переделать свой проект так, чтобы не было необходимости в большом смежном блоке сопоставленной памяти?
+0

Да .. хорошая точка, я никогда не упоминал размер блока, который я пытаюсь сопоставить. Я не собираюсь переходить через 128K. В настоящее время мой драйвер ядра работает отлично. Я отредактировал свой вопрос, чтобы сказать, как я сейчас это делаю и почему это не идеальное решение. madvise выглядит интересно найти, я не знал об этом. – 2009-12-23 13:03:15

Смежные вопросы