LINUX.ORG.RU

Еще немного про драйвера


0

0

Драйвер символьного устройства. Должен вести вебя так:

cat /dev/imit/d1 должен вывести только sizeof(long)-байтное число и выйти.

Если делать так:

static ssize_t gpio_read(struct file *f, char *buffer, size_t length, loff_t *offset)
{
ssize_t r;
r=sizeof(long);
memcpy(buffer, &dr[minor-1], r);
return r;
}

то не выходит, а непрерывно читает.

★★★★

А с чего бы ему выходить ? Разве он получает EOF ? :) Вот и читает пока EOF'а не будет. Верни ему 0 после первого чтения, например в f->private_data запиши что-либо и по этому ориентируйся, читали ли уже из устройства.

ms
()

Совсем забыл, используй copy_to/from_user или put_user (если используешь известные типы) вместо memcpy. А то потом могут быть проблемы :)

ms
()
Ответ на: комментарий от alexru

Очень весёлого, типа упсы :)
В ядрах где есть HighMem например в FC1/2/3 он по дефолту там эта операция будет вызывать обращения по невалидному поинтеру и соответственно всё станет не совсем хорошо.

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

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

anonymous
()

>r=sizeof(long);
>memcpy(buffer, &dr[minor-1], r);
>return r;

а не length вообще что ли забиваем?
да и offset там не для красоты.

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

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

HighMem причём в том что он сильно увеличивает пространство ядра и туда не "влезает" юзерспейс. И обращение к неподмапированому юзерспейсы вызывает собсно такие последствия. Видел знаю :)

Два - эти функции в ванильном ядре осуществляют проверку только на принадлежность к памяти ядра. Тобишь нельзя сделать copy_to_user в ядерную память и наоборот, размер области, проверку сегментов и т.д. Всё включено как говорится :)

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

>HighMem причём в том что он сильно увеличивает пространство ядра и туда
> не "влезает" юзерспейс. И обращение к неподмапированому юзерспейсы
>вызывает собсно такие последствия. Видел знаю :)

Какой-то бред.

highmem - это способ отображения физической памяти в памяти ядра при нехватке виртуального адресного пр-ва. к виртуальным адресам памяти процесса highmem вообще не имеет никакого отношения. page fault что внутри процесса посредством memcpy, что через copy_to_user работает абсолютно одинаково - через отображение page cache страницы в адресное пр-во процесса.

>Два - эти функции в ванильном ядре осуществляют проверку только на
>принадлежность к памяти ядра. Тобишь нельзя сделать copy_to_user в
>ядерную память и наоборот, размер области, проверку сегментов и т.д.
>Всё включено как говорится :)

Про безопасность памяти ядра я написал выше, если вдруг ты не заметил. Никаких сегментов ядро не проверяет - оно не оперирует такими понятиями. Для него char* buffer - это линейный адрес. а какие сегменты у тебя использует процесс - это сугубо его половые проблемы.

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

> highmem - это способ отображения физической памяти в памяти ядра при нехватке виртуального адресного пр-ва. к виртуальным адресам памяти процесса highmem вообще не имеет никакого отношения. page fault что внутри процесса посредством memcpy, что через copy_to_user работает абсолютно одинаково - через отображение page cache страницы в адресное пр-во процесса.

А ничего что при этом PAGE_OFFSET вместо 0xc становится 0x02, образ ядра увеличивается до 4х GB и позволяет хранить большие таблицы страниц. Итого сверху остаётся совсем чуть-чуть памяти. Которая используется для нужд ядра типа vmalloc area. Туда не влазит никакой юзерспейс и мапироваться он туда не собирается, по сему любая передача указателя на юзерскую память в драйвер и последующее использование её в драйвере влечёт #PF который _не мапирует_ страницу. И как результат oops.

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

Еле понял, что ты имел в виду раскладку 4/4, называя ее highmem.

Называй все своими именами и не будет непоняток.

anonymous
()
Ответ на: комментарий от ms

Только весь прогон всё равно не теряет своей силы, т.к. упсы в этом случае и получатся :)

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