copy_from_user не работает для char * - PullRequest
       13

copy_from_user не работает для char *

0 голосов
/ 26 сентября 2011

Я немного новичок в программировании ядра, поэтому прошу прощения за вопрос.По сути, я хочу отправить строку (char *) в модуль ядра для распечатки.Довольно просто

У меня есть следующее в коде уровня пользователя:

char *text = "some text.";      
ioctl(fd,OUTPUT_TEST,text);

И внутри модуля есть:

char *text;
case OUTPUT_TEST:
    copy_from_user(text,(char *)arg,sizeof(char*);

Однако текст остается нулевым.Разве это не должен быть указатель на строку символов?

Я еще больше запутался, потому что работает следующее:

На уровне пользователя:

typedef struct
{
   int size;
   char *text;
}Message;

  int fd = open ("/proc/ioctl_test", O_RDONLY);
  Message message;
  message.text = "This message was sent via OCTL.";
  message.size = strlen(message.text);

  ioctl(fd,OUTPUT_TEST,message);

И в пространстве ядра:

copy_from_user(&message,(Message *)arg,sizeof(Message));

Это прекрасно работает.Я действительно смущен и хотел бы любую помощь, которую вы, ребята, могли бы предложить.

1 Ответ

3 голосов
/ 26 сентября 2011

Я не хочу показаться грубым, но я думаю, что вам нужно немного изучить C, прежде чем писать модули ядра: -)

copy_from_user делает именно то, что подразумевает имя - он копирует буфер, предоставленный буфером пространства пользователя, в буфер, предоставленный ядром. Это означает, что вам нужно предоставить для него выделенный для ядра буфер, он вам не выделит!

Ваш текст char * выделяет указатель на буфер, но не буфер. Вы должны сделать выделение буфера самостоятельно.

Обратите внимание, что во втором примере структура Message определена как глобальная или в стеке (не могу сказать из вашего примера), поэтому распределение происходит, и оно работает.

...