Объявите указатель на массив пространства пользователя из пространства ядра и заполните его - PullRequest
0 голосов
/ 05 июля 2019

Я пишу модуль ядра на C. Мне нужно объявить указатель на массив символов в пространстве пользователя и заполнить его данными. Я объявляю указатель, используя char * __user, и заполняю его данными, вызывающими функцию copy_to_user. Затем я вызываю функцию copy_from_user для проверки правильности записи данных. Вместо того, чтобы читать ожидаемые данные, я читаю только нули.

Чего мне не хватает? Как правильно записать данные в пространстве пользователя из пространства ядра?

Вот код:

u16 address = 0xf0f0;
char __user *buf = address;
copy_to_user(buf, data_to_write, 20);

copy_from_user(data_to_read, buf, 20);
//printing data_to_read I read only zeroes.

Спасибо!

1 Ответ

0 голосов
/ 05 июля 2019

Вы не можете просто создать (виртуальный) адрес и попытаться скопировать его. Вы должны зарегистрировать его в адресном пространстве процесса. Это то, что функция mmap () делает из пространства пользователя. Вы должны выполнить эквивалентную операцию изнутри ядра. Создав доступный для записи анонимный кусок памяти, вы можете свободно копировать его в ядро ​​и из него.

...