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

标签 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

地址可能会有所不同。

我认为我做错了什么,但无法准确地看出可能是什么。当然,代码也可以更好,但我想在进行进一步更改之前解决这个问题。有人有什么建议吗?

最佳答案

事实证明错误不在上面的代码中,而是在其他地方。上面的代码是使用 ioremap() 的工作示例。

关于c - ioremap - 无法处理虚拟地址 XXXXXXXX 处的内核分页请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24384711/

相关文章:

C 语言中关于字符串的困惑

c++ - 如何知道 GetPrivateProfileInt/String 失败的原因

c - 动态分配的堆栈和指针运算出现奇怪的内存错误

linux - 从 sk_buff 的网络 header 确定数据包是 ipv4 还是 ipv6

linux-kernel - KBUILD_DEFCONFIG_KMACHINE ?= defconfig_file 没有按预期工作

linux - 加载已经插入内核的usb驱动

linux-kernel - 如何将文件操作附加到平台驱动程序中的 sysfs 属性?

c - 如何定义一个全局数组(获取另一个函数的长度)?

linux - Linux 内核中的 WaitForMultipleObjects 等价物

linux - 内核开发中是否有类似down_interruptible()的互斥量函数?