Сбой хеш-таблицы ядра при итерации - PullRequest
0 голосов
/ 11 мая 2019

Я пишу два основных системных вызова. Один добавляет узлы, содержащие строку пользовательского пространства, в хеш-таблицу, а другой выводит содержимое таблицы.

После добавления нескольких элементов и вызова функции дампа, он печатает один элемент, а затем выдает ошибку BUG: unable to handle kernel paging request at

Я попытался удалить весь код, связанный со строкой пространства пользователя, чтобы убедиться, что ошибка не возникла из-за этого. Я добавил table_node только с next и key, но столкнулся с той же ошибкой.

У меня такое ощущение, что я пропускаю что-то очень простое. Что-нибудь выскакивает из-за того, как я добавляю или иду по столу?

#include <linux/kernel.h>
#include <linux/syscalls.h>
#include <linux/slab.h>
#include <linux/hashtable.h>
#include <linux/uaccess.h>
#include <asm/uaccess.h>

DEFINE_HASHTABLE(table, 10);

struct table_node {

    unsigned long key;
    struct hlist_node next;
    char * name;
};

SYSCALL_DEFINE1(add_to_table, const char *, name) {

    struct table_node newNode;
    long strLen;
    long copied;
    int maxLen = 100;

    // Get length of userspace string
    strLen = strnlen_user(name, maxLen); 
    if (strLen <=0 || strLen > maxLen){
       return -EINVAL;
    }

    char s[strLen];
    newNode.name = s;

   // Copy string to kernel space
   copied = strncpy_from_user(newNode.name, name, strLen); 
   if (copied <= 0 || copied > maxLen){
       return -EINVAL;
   }

    newNode.key = (hash(name) % HASH_SIZE(table));

    hash_add(table, &newNode.next, newNode.key);

    return 0;
}

SYSCALL_DEFINE0(dump_table) {

    int bkt = 0;
    table_node * ptr = NULL;

    // Print each entry in the hash table
    hash_for_each_(table, bkt, ptr, next){
        printk("\tkey=%lu,bucket %d\n", ptr->key bkt);
    }

    return 0;
}

Спасибо за помощь!

1 Ответ

0 голосов
/ 12 мая 2019

Решение Камиля сработало.

Я забыл динамически распределять память. Добавление этих двух строк решило мою проблему.

table_node *newNode = kmalloc(sizeof(table_node), GFP_KERNEL);

newNode-fname = kmalloc(strLen * sizeof(char)+1, GFP_KERNEL);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...