我正在尝试编写一个简单的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 *而得到不同的结果,但它仍然无法正常运行。
我知道我的问题在于我如何分配内存或我构建指针的方式,但我真的被困在这里。我希望有人知道这里有什么问题。
答案 0 :(得分:2)
将finder-&gt;数据的地址而不是其值传递给copy_from_user,我认为你将全部设置好。