LINUX.ORG.RU

Передача данных из userspace драйверу


0

0

Модульный драйвер под ядро 2-4-9-13 (RedHat Linux)

Необходимо через точку входа ioctl передавать в драйвер и обратно структуру, содержащую указатели на буферы данных в адресном пространстве пользователя:

typedef struct {

int kz;

unsigned short us;

unsigned short dl;

unsigned short dusp;

unsigned short *buf_in;

unsigned short *buf_out;

}KCO_PARAM;

В драйвере надо читать и писать в эти буферы. Как получить к ним доступ в драйвере?

copy_from_user и copy_to_user работает для структуры (значения всех полей передаются нормально), но не работает для полей buf_in и buf_out (т.е. не получается скопировать в/из буфера по адресу buf_in и buf_uot используя copy_from_user и copy_to_user). Как преобразовать значения buf_in и buf_out и получить доступ к буферам из драйвера?


Re: Передача данных из userspace драйверу

Либо нужно все данные засунуть в структуру,

либо приложение должно выделять отдельные буферы под массивы, передавать указатели на них и тогда модуль может оттуда читать и туда писать через copy_*_user.

Murr ★★ ()
Ответ на: Re: Передача данных из userspace драйверу от Murr

Re: Re: Передача данных из userspace драйверу

Если массивы неограничены, то можно сделать так:

typedef struct here_buf {
int size;
char buf[0];
} here_buf;

typedef struct str {
...
struct here_buf lp;
} str;

#define BUF_IN_SIZE(x) ((here_buf *)&(x->lp))->size
#define BUF_IN(x) ((here_buf *)&(x->lp))->buf
#define BUF_OUT_SIZE(x) ((here_buf *)(BUF_IN(x)+BUF_IN_SIZE(x)))->size
#define BUF_OUT(x) ((here_buf *)(BUF_IN(x)+BUF_IN_SIZE(x)))->buf

Но это уже извращения... :)

Murr ★★ ()

Re: Передача данных из userspace драйверу

откуда ты знаешь сколько данных из buf_in можно копировать и сколько данных в buf_out можно засовывать?

учитывай что buf_in и buf_out должны быть валидными адресами в юзер спейсе проги, то есть они должны указывать на выделенную память(стек, хип)

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