gpt4 book ai didi

kmalloc() 可以返回无效内存吗?

转载 作者:太空狗 更新时间:2023-10-29 12:04:15 28 4
gpt4 key购买 nike

我正在编写一个 linux 内核模块,我在其中实现了一个链表。我知道在 linux 内核中有一个列表 API,但是当我实现它时我不知道所以实现它使用 kmalloc() 处理原始指针。运行几个小时后,内核崩溃并且在崩溃日志中显示“一般保护错误”。日志还显示它是从我用于搜索链表的函数中发生的。显然搜索功能如下所示,没有逻辑错误。

/*
* Searches in a certain index of hash table for a data
* returns NULL if not found else returns pointer of that element in the table
*/

struct queue_data * search_table(unsigned int hash_index, struct queue_data *new_data)
{
/* Taking a new queue pointer. Which will be pointing to the queue represented
* by new_data at last. */
struct queue_data *ret;
/* First initializing it with first queue on the list */
ret = table[hash_index].next;
/* Iterating through the list to find the desired queue */
while(ret != NULL) {
/* Checking if current queue matches our criteria */
if(ret->saddr == new_data->saddr &&
ret->daddr == new_data->daddr &&
ret->dest == new_data->dest &&
ret->ssrc == new_data->ssrc) {
/* It matched. So I can return it */
return ret;
}
/* It didn't match so I need to go to next queue */
ret = ret->next;
}

/* No queue matched out criteria. Because if it matched it would have not
* come this far. It would have returned before.
* So I need to return a NULL. Now value of 'ret' is NULL.
* I can return 'ret'
*/
return ret;
}

很明显,insert 函数在逻辑上也是完美无缺的。由于一般保护错误通常发生在发生无效内存访问时,我从未使用过 kmalloc() 以外的分配的内存。现在我的问题是,如果我使用由 kmalloc 分配的内存,那么有可能使用无效内存,我应该在使用前检查一下吗?

部分崩溃日志在这里:

[ffff8804130cb690] general_protection at ffffffff81661c85
[exception RIP: search_table+52]
RIP: ffffffffa00bc854 RSP: ffff8804130cb748 RFLAGS: 00010286
RAX: d6d4575455d55555 RBX: ffff88040f46db00 RCX: 0000000000000018
RDX: 02b53202ab706c17 RSI: ffff8803fccaaa00 RDI: 00000000000c2568
RBP: ffff8804130cb748 R8: ffffffff8180cb80 R9: 000000000000016d
R10: a3d70a3d70a3d70b R11: ffff8803fccaab58 R12: ffffc9001262cc38
R13: 000000000000079f R14: ffff8803fccaaa00 R15: ffffffffa00cbee8
ORIG_RAX: ffffffffffffffff CS: 0010 SS: 0018

插入时,我检查了 kmalloc 分配的内存:

   /* Allocating and initializing a new queue.
* If a queue corresponding to it already exists then it's data will
* copied and this queue will be dropped.
* Else this queue will be inserted to the hash table that manages the queues.
*/
new_data = (struct queue_data *)kmalloc(sizeof(struct queue_data), GFP_ATOMIC);
if (!new_data) {
//printk(KERN_ALERT "pkt_queue EXCEPTION: new_data\n");
return NULL;
}

最佳答案

查看您发布的代码,一般保护错误的唯一可能来源是这一行:

ret = table[hash_index].next;

您没有检查 的大小,所以您可能正在访问越界内存?无法确定,不知道 table 的声明方式、位置和内容,以及如何初始化它。

看了你的评论后,说 hash_index,一个 unsigned int,是 HASH_PRIME 宏的模数的结果,它 < em>可能是在某个时候,您遇到了可能的有符号-无符号算术问题,因此,尽管 HASH_PRIME 上有模数,您事实上越界。也许添加:

if (hash_index >= HASH_PRIME) hash_index = HASH_PRIME-1;//or error

为了完整起见:正如我在评论中指出的那样,您使用的所有函数都使用内核的 u32 类型。事实证明,这就是您的代码仍在访问错误 内存的原因。 (在手机上输入此更新...讨厌它)

关于kmalloc() 可以返回无效内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20800755/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com