Ситуация такая: в драйвере создается статичный элемент (типа shared_mem_t), который хочется примапить из прикладного уровня. У драйвера реализован нод с операцией чтения, которая возвращает адрес этого буфера.
В прикладной программе я читаю адрес, вычисляю длину, маплю нужное кол-во page'ей и настраиваю указатель на эту структуру.
Все бы ничего, только при попытке доступа по указателю программа сегфолтится.
Вот как чего создается:
Kernel module
shared_memory.h
shared_memory.c
Процедура по настройке указателя в прикладном уровне:
Такое ощущение, что система прерывает процесс. Однако должен же быть способ как-то пометить память, чтобы разрешить доступ?
Я по необразованности решил, что в ядре мы работаем с физическими адресами. Спасибо большое за помощь!
Пойду пробовать.
Update.
Как ни прискорбно, но не это являлось причиной сегфолта. Это была еще одна бага, от которой бы потом волосы бы встали дыбом - почему читается не то, что пишется. Очень благодарен за такую помощь.
Тем не менее, при попытке чтения система завершает программу.
Вот что находится в main:
Вероятно нужно в ядре как-то разрешить доступ к памяти. Я просто гадаю, но ведь люди как-то это делают, верно?
Как минимум тут получаются нереальные размеры - вероятно там вы хотели написать PAGE_SIZE
Вообще лучше бы под эту структуру через kmalloc память выделять - она будет автоматом по границам страницы памяти и гарантированно непрерывна физически, а то при любом промахе будете затирать из юзерспейс что-то в ядре.
Может и в этом - в любом случае выделяйте память лучше через kmalloc - тогда хотя бы ничего лишнего не затрете случайно, там память странично выделяется и выровнена по границе страницы памяти. Я думал у вас небольшая структурка байт 100 :) а тут целый буфер 16 кб.