2013-06-24 2 views
4

В моем драйвере я пытаюсь сопоставить адрес, возвращенный с ioremap, на адрес пользовательской области.Почему невозможно использовать ioremap, а затем remap_pfn_range?

  1. Какой адрес отправлен от ioremap?
  2. Как отличаться от адреса kmalloc?
  3. Как я могу отобразить адрес, возвращенный с ioremap?
  4. Какой адрес должен быть вставлен в remap_pfn_range?

ответ

5

Вам не нужно ioremap(), если вы используете remap_pfn_range(). ioremap() отображает физический адрес в виртуальный адрес ядра. remap_pfn_range() отображает физические адреса непосредственно в пользовательском пространстве. Просто передайте свой физический адрес (с пониженной передачей по PAGE_SHIFT для создания pfn) непосредственно на remap_pfn_range(). Ваши вопросы по порядку:

  1. ядро ​​виртуальный адрес
  2. kmalloc возвращает ядро ​​виртуального, но гарантирует непрерывную память See question 116343
  3. вы могли бы сделать это, если вы звоните virt_to_phys() во-первых, для преобразования ядра виртуального адреса в физический. Но пропустить шаг, если вы на самом деле не нужен доступ ядра к этой области памяти
  4. физический адрес, понижающую передачу по PAGE_SHIFT для получения PFN
0

ioremap() возвращает виртуальный адрес пространства ядра. Это невозможно получить непосредственно из пользовательского пространства. Существует механизм под названием mmap(), см. here и Mapping physical addresses to virtual address linux для рабочего образца.

+1

посмотреть на # 4 на исходное сообщение – shd