mmap отображает фал на произвольную память, котрую ему выдал менджер памяти. ты записываешь в эту область, mmap отлавливает это изменение и формирует файловый запрос на запись. запрос получает драйвер VFS разбирает путь, выявляет подстрочку /dev и направляет его в драйвер udev ответственный за этот путь. udev перенаправляет запрос в драйвер, ответственный за /dev/mem, и только он разбирает файловый запрос и пишет напрямую в указанный адрес физической памяти.
/dev/mem и передаёшь его fd в системный вызов mmap, в ядре вызывается функция mmap_mem зарегистрированная здесь. Эта функция, как можно увидеть здесь, вызывает remap_pfn_range для выделенного участка виртуальной памяти, а в качестве параметра pfn, определяющего номер страницы физической памяти, как написано здесь, передаёт vma->vm_pgoff, т.е. смещение, переданное mmap, но выраженное в страницах. Т.е. не "произвольную память, котрую ему выдал менджер памяти", а вполне конкретную физическую память, которую ты попросил в вызове mmap. неа, ваапче не так :)
согласен. этих подробностей не знаю.
запись значения в память, посредством /dev/mem, проходит кучу прослоек
не все знаю, чего в этом криповатого ??
Цепочку действий для записи значения в память с помощью спец.файла /dev/mem я привел чуть выше.
Приведи свою.
Я сильно сомневаюсь что в функции mmap есть хук под файл /dev/mem
/dev/mem конечно нет. Есть поле mmap в структуре file_operations, позволяющее любой файловой системе или драйверу предоставить свою реализацию mmap для файлов которые они обслуживают. Опять же, любая книжка по внутренностям ядра об этом рассказывает. Это не "ты привёл цепочку действий", это ты какую-то бредовую фантазию привёл, без каких либо документальных потверждений.
в каком месте бредовость ??
mmap отлавливает это изменение…
…и формирует файловый запрос на запись. запрос получает драйвер VFS разбирает путь
выявляет подстрочку /dev
/dev/mem работает только пока он в /dev, а если его перенести в какое-нибудь другое место, то он работать перестанет?и направляет его в драйвер udev ответственный за этот путь
это потребует наличие в хуке кода обработки доступов пользователя к /dev/mem.
open, которым файл открывают.сильно сомневаюсь что такой хук будет внедрен, смысл в нем ??
mmap для /dev/mem, в чём ты конкретно сомневаешься, я не понял? когда пользователь обращается к отображённой памяти, вызов mmap уже давно закончился и не может "отловить это изменение". Ты имел в виду подсистему виртуальной памяти?
А если файл тем временем удалили? Или переименовали? Или удалили и создали другой файл с таким же именем на его месте?
Т.е., я правильно понимаю, что по-твоему /dev/mem работает только пока он в /dev, а если его перенести в какое-нибудь другое место, то он работать перестанет?
Нет, не потребует. Потому что проверкой доступа занимается вызов open, которым файл открывают.
Я выше приводил ссылки в код ядра реализующий mmap для /dev/mem, в чём ты конкретно сомневаешься, я не понял?
…но это совсем не в тему
…в контексте вопроса сие не имеет значения.
код, реализующий mmap под /dev/mem, не приводил :)
Т.е. не "произвольную память, котрую ему выдал менджер памяти", а вполне конкретную физическую память, которую ты попросил в вызове mmap.
mmap в mem_fops, mem_fops указаны как fops в массиве devlist для устройства с минорным кодом DEVMEM_MINOR, этот массив обрабатывается здесь, где регистрируются устройства с мажорным кодом MEM_MAJOR. Устройство с кодом 1, 1 -- это /dev/mem и есть, как можно увидеть здесь ты утверждаешь что mmap при мапинге /dev/mem будет напрямую писать в физическую память ??
mmap не будет никуда писать. Но mmap может отобразить любую область физической памяти в адресное пространство процесса для прямого доступа.тогда получается любой пользователь может получить доступ к любому участку физической памяти без каких-либо проверок, только за'mmap'ив /dev/mem в своей проге ??
/dev/mem.