2016-11-20 3 views
0

В пользовательском пространстве программы я выделить часть памяти через ттар как следующий вызов функции:copy_to_user не может скопировать данные пользователю mmap из ядра?

void *memory; 
int fd; 
fd = open(filepath, O_RDWR); 
if (fd < 0) 
    return errno; 

memory = mmap(NULL, 4096, PROT_WRITE, MAP_SHARED, fd, 0); 
if (memory == MAP_FAILED) 
     return -1; 

//syscall() goes here 

В пространстве ядра в моей системе вызова я пытаюсь скопировать данные в отображенной области памяти следующим образом:

copy_to_user(memory,src,4096); 

EDIT: добавлена ​​ошибка проверки кода на пост разъяснений copy_to_user() вызова неоднократно неудачу в этом случае, в то время как если бы я сделал memory = malloc() он всегда последующий.

Я получаю неправильные флаги в этом случае для mmap?

+0

Какая ошибка? Используете ли вы [perror()] (http://man7.org/linux/man-pages/man3/perror.3.html)? Мы не можем вам помочь только с тем, что вы на самом деле пишете. – Stargateur

+0

copy_to_user() в пространстве ядра не устанавливает 'errno', который можно предсказать через' perror() ' – bawejakunal

ответ

-1

Открыт ли успех? Как насчет mmap? Достаточно ли целевой файл? Можете ли вы написать файл через сопоставление в пользовательском пространстве?

Кроме того, повторный 4096 является сильным ударом вашего кода. Вместо этого пользовательское пространство должно передавать ожидаемый размер.

+0

Целевой файл только что создан, я не понимаю, что вы имеете в виду под« достаточно большим », для целей записи данные будут быть записаны в файл правильно? Вызов open() определенно преуспевает, 4096 не повторяется только для целей представления. – bawejakunal

+0

Как насчет mmap (и как вы его проверяете, в частности, вы проверяете MAP_FAILED?). Я подозреваю, что файл имеет размер 0, что предотвратит работу copy_to_user. Я не понимаю, что непонятно с вопросом о том, как писать через карту - память [0] = 'A' или подобное, для instnace. Когда это будет сделано, это, скорее всего, вызовет SIGBUS, ясно показывающий, что проблема не имеет ничего общего с copy_to_user. –

+0

, пожалуйста, отредактируйте – bawejakunal