The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"linux module programming"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"linux module programming"
Сообщение от apels1n emailИскать по авторуВ закладки(ok) on 14-Апр-04, 11:57  (MSK)
Не могу разобраться с памятью в ядре Линукс. Проблема такова: есть модуль-драйвер собственного производства. В нем реализованы некоторые функции, в аргументах которых указатели, по которым они некоторые данные должны возвращать. Сделал интерфейс через ioctl. То есть из пользовательской программы в аргумент ситемного вызова кидается структура с количеством байт и указателем. Все отлично работает, НО! Оказалось, что поигравшись с указателем, можно с момощью драйверной функции записать данные в такую область памяти, что происходит kernel panic!
Я так понимаю, что или все ваще я не правильно делаю или нужна какая-то проверка (допустим о пренадлежности адреса к юзерспейс).. Буду очень признателен любой помощи в этом вопросе. Хотя бы направьте меня на правильный путь или укажите в чем принципиальная моя ошибка.

Спасибо за внимание. Дмитрий

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "linux module programming"
Сообщение от Мартовский заец emailИскать по авторуВ закладки on 16-Апр-04, 23:55  (MSK)
Попробуй поискать в исходниках ядра применение функции get_user (примерно такое название). Вроде как она применяется как-раз для чтения драйвером данных по переданному указателю.
Обратная ей функция выглядить примерно так: __put_user (мобыть и без подчеркиваний)...
Я в своих разработках не стал заниматься такой защитой. Проще потом один раз настроить и отладить программу, чем делать защиту=)
  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "linux module programming"
Сообщение от jd Искать по авторуВ закладки on 20-Апр-04, 23:57  (MSK)
а точнее
copy_to_user(to, from, size)
copy_from_user(to, from, size)
  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "linux module programming"
Сообщение от Мартовский заец emailИскать по авторуВ закладки on 21-Апр-04, 22:20  (MSK)
>а точнее
>copy_to_user(to, from, size)
>copy_from_user(to, from, size)

Согласен, согласен.... балбес я=)

вопрос почти в масть: где хелпу по этому всему поискать? замучился капаться в исходниках ядра...
щас опять копать приходится уже по вопросу работы с ISA-шной памятью. Нашел гору функций в исходниках, но как их корерктно вызывать - опять неизвестно!

  Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "linux module programming"
Сообщение от apels1n emailИскать по авторуВ закладки(ok) on 22-Апр-04, 12:20  (MSK)
>а точнее
>copy_to_user(to, from, size)
>copy_from_user(to, from, size)

Использую, но проблема не исчезла. Все операции с указателями сделал через эти функции. Как и раньше пользователь при использовании моего драйвера может порушить всю систему:

code: blablabla
<0>Kernel Panic: Aiee, killing interrupt handler!
In interrupt handler - not syncing

А делается это так: функция из модуля засовывается в некий бесконечный цикл, в каждой операции которого адрес буфера, передающийся функции сдвигается..
И в конце концов он видимо сдвигается куда-то не туда, но copy_to_user почему-то это не отслеживает :( и все равно фигачит туда данные.. никакого тебе segmentation fault....

  Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "linux module programming"
Сообщение от apels1n emailИскать по авторуВ закладки(ok) on 22-Апр-04, 15:03  (MSK)
разобрался - надо юзать access_ok().. для проверки указателя
  Рекомендовать в FAQ | Cообщить модератору | Наверх

6. "linux module programming"
Сообщение от Мартовский заец emailИскать по авторуВ закладки on 23-Апр-04, 21:40  (MSK)
>разобрался - надо юзать access_ok().. для проверки указателя

Подробнее, плиз! =) Очень интересно!!!

  Рекомендовать в FAQ | Cообщить модератору | Наверх

7. "linux module programming"
Сообщение от apels1n emailИскать по авторуВ закладки(??) on 26-Апр-04, 13:12  (MSK)
>>разобрался - надо юзать access_ok().. для проверки указателя
>
>Подробнее, плиз! =) Очень интересно!!!

подробно есть в ldd chapter 5. допустим здесь:
http://www.fedchik.org.ua/docs/pdf/Linux/LinuxDeviceDrivers/ch05.pdf
ну короче так:
если системный вызов оперирует с указателем из юзерспейс ,то данные оттуда надо скопировать с помощью copy_from_user, если туда надо записать, то используется copy_to_user. просто так оперировать указателями из пользовательских процессов в ядре нельзя.
Но мало того! просто так юзать copy_to/from_user тоже нельзя, надо еще проверить перед этим на то что указатель переданный сисколу из юзерспейс "хороший"... (так как функции в ядре могут записать что угодно куда угодно) используется для этого access_ok().
без проверки я писал куда-то не туда и валил ядро :(

все довольно просто оказалось. спасибо всем

  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру