我正在尝试访问 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
地址可能会有所不同。
我认为我做错了什么,但看不到究竟是什么。当然,代码也可以更好,但我想在进行进一步更改之前解决这个问题。有没有人有什么建议?