Не удалось выделить буфер пользовательского пространства в модуле ядра.Linux

Ответить
Anonymous
 Не удалось выделить буфер пользовательского пространства в модуле ядра.

Сообщение Anonymous »

Я хотел бы выделить буфер пользовательского пространства в модуле ядра (ядро Linux v5.4.0). Согласно этому сообщению, это можно сделать с помощью do_mmap().
Я написал следующий код:

Код: Выделить всё

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

unsigned long (*orig_do_mmap)(struct file *file, unsigned long addr,
unsigned long len, unsigned long prot,
unsigned long flags, vm_flags_t vm_flags,
unsigned long pgoff, unsigned long *populate,
struct list_head *uf);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Chibi Gwen");
MODULE_DESCRIPTION("a simple module");
MODULE_VERSION("0.1");

static int __init start(void)
{
printk(KERN_INFO, "module installed\n");

unsigned long populate;

orig_do_mmap = kallsyms_lookup_name("do_mmap");
if (orig_do_mmap == NULL)
{
printk("cannot find do_mmap() via kallsyms_lookup_name()\n");
return -EINVAL;
}

struct mm_struct *mm = current->mm;

down_write(&mm->mmap_sem);
unsigned char *buf= (unsigned char *)orig_do_mmap(NULL, 0, 0x2000, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE | MAP_LOCKED, 0, 0, &populate, NULL);
up_write(&mm->mmap_sem);

memset(buf, 0x0, 0x2000);

return 0;
}

static void __exit end(void)
{
printk(KERN_INFO, "module uninstalled\n");
}

module_init(start);
module_exit(end);
Однако при выполнении memset() ядро ​​выдает сообщение:

Код: Выделить всё

[   74.674862] BUG: unable to handle page fault for address: 00007f8945966000
[   74.674864] #PF: supervisor write access in kernel mode
[   74.674865] #PF: error_code(0x0002) - not-present page
Действительно, do_mmap() успешно возвращает результат, и 00007f8945966000 оказывается адресом buf. Я предполагаю, что мой код не инициализировал соответствующую запись таблицы страниц.
Как правильно выделить буфер в пользовательском пространстве из модуля ядра? >
Есть идеи?

Подробнее здесь: https://stackoverflow.com/questions/787 ... dule-fails
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»