Я пишу два основных системных вызова. Один добавляет узлы, содержащие строку пользовательского пространства, в хеш-таблицу, а другой выводит содержимое таблицы.
После добавления нескольких элементов и вызова функции дампа, он печатает один элемент, а затем выдает ошибку 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;
}
Спасибо за помощь!