Отображение физических адресов в виртуальные адреса в Linux

Я работаю над небольшой встроенной системой. Когда мой linux загружается в пользовательское пространство, я знаю, где находятся мои устройства в физической памяти. Я хочу сопоставить их с виртуальными адресами пользовательского пространства. В настоящее время я делаю это через модуль ядра. Я использую vmalloc / kmalloc (в зависимости от размера), а затем я использую ioremap_page_range на возвращенных виртуальных адресах для сопоставления моих физических адресов. Я не думаю, что это правильный путь. Прежде всего, я выделяю память, а затем я просить ядро переназначить это виртуальное адресное пространство в другое физическое адресное пространство. (Первоначально сопоставленный физический - >виртуальный в vmcall / kmalloc бесполезен, поскольку я не забочусь об этих физических страницах. Это определенно не хорошо.)

вместо этого есть лучший способ отобразить известную физическую память в процесс пользовательского пространства. (Я знаю, кроме моего пользовательского пространства, никто не коснется этой памяти.)

спасибо

3 ответов


то, что вы пытаетесь сделать, это доступ к тому, что называется память ввода-вывода. Я могу только поощрять вас читать Драйверы Устройств Linux (LDD) книга и более конкретно Глава 9.

чтобы "выделить" такую область, нужно позвонить

struct resource *request_mem_region(unsigned long start, unsigned long len, char *name)

. Прежде чем ваш драйвер сможет получить к нему доступ, вы должны назначить ему виртуальный адрес, это делается с помощью вызова

void *ioremap(unsigned long phys_addr, unsigned long size)

чтобы убедиться, что ваш водитель будет работать на разных архитектуры / платформы, обязательно используйте некоторые функции доступа к таким областям (ioread8/16/32 или iowrite8/16/32 и все их варианты).


в модуле ядра, remap_pfn_range() может использоваться для преобразования физического адреса в виртуальный адрес. Следующая ссылка будет полезна.

как remap_pfn_range переназначает память ядра в пространство пользователя?


в модуле ядра remap_pfn_range () может использоваться для преобразования физического адреса в виртуальный адрес. Когда у вас нет реальных устройств, вы можете: 1) Создайте виртуальное устройство и, 2) Используйте mmap для этих виртуальных устройств для доступа к той же памяти ядра через виртуальное сопоставление remap_pfn_range этого процесса. 3) обычно в выделенных средах вы можете дополнительно закрепить эти физические страницы, чтобы они не были удалены из вашего процесса. 4) вы также делитесь этими физическими адресами с разные процессы, но нужно будет обрабатывать синхронизацию, независимо через другие механизмы IPC, поскольку для каждого процесса они будут выглядеть как разные адреса.