繁体   English   中英

内核无法处理NULL指针解除引用 - 使用kmem_cache_alloc和struct

[英]Kernel unable to handle NULL pointer dereference - using kmem_cache_alloc with struct

我正在尝试编写一个简单的char驱动程序,以尝试更多地了解Linux中的驱动程序。

驱动程序的想法是拥有一个链表,每个节点中都包含一个字符和一个指向下一个节点的指针。 我打算使用kmem_cache来构建这个链表,因为我认为根据需要一次为单个节点分配一个对象会很简单。

这是我遇到问题的相关代码。 它并不漂亮,因为我只是想让这个东西起作用。

struct kmem_cache *memCache;

typedef struct {
    char data;
    struct node* next;
} node;

node *head = NULL;

static ssize_t hello_write(struct file *file, const char *buf, size_t count, loff_t *ppos)
{
    int i;
    accesscount++;

    for(i = 0; i < count; i++)
    {
        node *finder;
        node *temp;

        finder = head;

        if(finder == NULL)
        {
            finder = kmem_cache_alloc(memCache, GFP_KERNEL);
            //memset(finder, 0, sizeof(node)); 

            if(!finder)
                return -ENOMEM;

            finder->next = NULL;

            //!!!NULL DEREFERENCE HERE!!!
            copy_from_user(finder->data, buf+i, 1);

            head = finder;
        }
        else
        {
            while(finder->next != NULL)
                finder = finder->next;

            temp = kmem_cache_alloc(memCache, GFP_KERNEL);
            //memset(temp, 0, sizeof(node)); 

            if(!temp)
                return -ENOMEM;

            temp->next = NULL;

            copy_from_user(temp->data, buf+i, 1);

            finder->next = temp;
        }

        charsStored++;  
    }

    return count;
}

static int __init hello_init(void)
{
    memCache = kmem_cache_create("hello1", sizeof(node), 0, 0, NULL);
}

从我的评论中可以看出,当我调用copy_from_user()并在节点中传入char变量时,我得到一个空取消引用。 我想,因为我为节点分配了内存,所以它不应该是null。 我也尝试将char设置为char *而得到不同的结果,但它仍然无法正常运行。

我知道我的问题在于我如何分配内存或我构建指针的方式,但我真的被困在这里。 我希望有人知道这里有什么问题。

将finder-> data的地址,而不是它的值传递给copy_from_user,我想你将全部设置好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM