LINUX.ORG.RU

Как сделать mmap() из kernel-space


0

0

в user-space, подскажите кто умеет. mmap делаю из user-space, до обработки вызова не доходит, возвращается всё время -1(видимо какие-то проверки в glibc). Читаю у Рубини - рекомендуется использовать vmalloc/kmap, но не соображу как это правильно сделать.


Поподробней можно?
на какой девайс делается mmap?
я такую штуку делал, взял исходники bttv драйвера и выдрал оттудова все что касается mmap().
могу поделиться кодом :)

Dead ★★★★
()
Ответ на: комментарий от Dead

Железка L761 от лкарда, собирает данные от ацп в фифо буфер в kernel-space, далее надо их передать в user-space, но вызов mmap() обрабатывается неверно. Сейчас программер отвечающий за линуксовое направление в лкарде уволился и поддержки нет, приходится самому доводить до кондиции драйвер. Также есть идея реализовать mmap() в shared memory, но пока хотя бы с mmap надо разобраться. Если не трудно, пришли пример кода относительно mmap на sts@ratan.sao.ru

sts
() автор топика
Ответ на: комментарий от Dead

Получил, но вопрос остался открытым. В общем вызов mmap реализован почти также. - виртуальный адрес преобразуется в физический - remap_page_range()

Но у меня не доходит до обработки вызова mmap! Я же недаром написал про glibc, видимо вызов mmap из user-space должен быть определённым образом подготовлен. Читаю Рубини и POSIX, но там обьясняют драйверную часть, а меня сейчас больше интересует что _до_ вызова mmap надо сделать в user-space приложении. Нигде не найду примеров;(

sts
() автор топика
Ответ на: комментарий от sts

То есть до ядерного вызова mmap не доходит?
может ты устройство не правильно регистрируешь?
попробуй через strace пропустить

Dead ★★★★
()
Ответ на: комментарий от Dead

Вначале грузятся библиотеки, потом открывает девайс, делает ioctl и не может сделать mmap:

open("/dev/xdsp0", O_RDONLY) = 3 ioctl(3, 0x40044c30, 0x8049988) = 0 fstat64(1, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40013000 old_mmap(NULL, 32, PROT_READ|PROT_WRITE, MAP_SHARED, 0, 0) = -1 ENODEV (No such device) write(1, "pagesize: 4096\nmmap...\nCan\'t map"..., 34) = 34 munmap(0x40013000, 4096) = 0 exit_group(-1) = ?

sts
() автор топика
Ответ на: комментарий от sts

Ну такое ощущение, что ты неправильно регистрируешь /dev/xdsp0 на предмет mmap. Покажи код где char device регистрируется.

P.S.
Там в низу страницы combobox есть, выбери хотя б User line break,
чтоб строки не слепливались.



Dead ★★★★
()
Ответ на: комментарий от Dead

int xdsp_register(struct file_operations *fops, int slot) {

int i;

spin_lock(&xdsp_lock);

i = __insert(fops, slot);

spin_unlock(&xdsp_lock);

return i;

}

ps у меня кроме home и search другие пункты недоступны

sts
() автор топика
Ответ на: комментарий от sts

А где проинициализирован fops?
он ведь заполнен должен быть где-то

PS
ICQ: 169821848

Dead ★★★★
()
Ответ на: комментарий от Dead

Семёёёёён Семёёёёёоныч!!! ;))) Нашёл блин очепятку - терялся указатель. Большое спасибо!

sts
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.