Не удалось выделить буфер пользовательского пространства в модуле ядра.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

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