ioremap - 无法在虚拟地址XXXXXXXX处理内核分页请求

时间:2014-06-24 10:49:29

标签: c linux-kernel linux-device-driver embedded-linux ioremap

我试图在Linux上的am335x处理器上访问给定的内存区域。我们的想法是首先指定物理地址,然后使用ioremap访问所述地址。我一直在谷歌上搜索这个问题,但似乎找不到任何好的解决方案。

执行这些任务的功能如下:

获取物理地址的功能:

static int initPaddr(struct regref **reg, long unsigned int *base, int count)
{
    int i;

    reg = kmalloc(sizeof(struct regref*) * count, GFP_KERNEL);
    for(i = 0; i < count; i++)
        reg[i] = kmalloc(sizeof(struct regref), GFP_KERNEL);

    for(i = 0; i < count; i++)
        reg[i]->paddr = REG_ADDR(base, regArray[i]);

    return 0;
}

注册虚拟地址的功能:

static int initVaddr(struct regref **reg, int blocksize, int count)
{
    int i;

    for(i = 0; i < count; i++)
        reg[i]->vaddr = (unsigned long*) ioremap( (unsigned long) reg[i]->paddr, blocksize);

    return 0;
}

这里regArray[]只是一个包含所有相关物理地址的数组,结构regref按以下方式定义:

struct regref = {
    long unsigned int *paddr;
    long unsigned int *vaddr;
};

代码确实编译,但是当我尝试加载它时,我最终得到以下错误:

Unable to handle kernel paging request at virtual address 702f7373

地址可能会有所不同。

我认为我做错了什么,但却未能确切地看到它可能是什么。当然代码也可以更好,但我想在进行进一步更改之前解决这个问题。有没有人有任何建议?

1 个答案:

答案 0 :(得分:0)

原来错误不在上面的代码中,而是在其他地方。上面的代码是使用ioremap()

的工作示例