gpt4 book ai didi

c - 内存读/写操作中的总线错误

转载 作者:太空宇宙 更新时间:2023-11-04 07:38:55 24 4
gpt4 key购买 nike

我已经编写了一个用于内存读/写操作的内核程序。

#include<linux/kernel.h>
#include<linux/module.h>
#include<linux/init.h>
#include<linux/io.h>

static uint32_t *mem_alloc(void)
{
uint32_t *base, *mem;
base=kmalloc(5*sizeof(uint32_t),GFP_KERNEL);
mem=ioremap(base,5*sizeof(uint32_t));
return(mem);
}

static void mem_write(uint32_t *memory)
{
uint32_t *mem1;
mem1=memory;
int i;
for(i=0;i<5;i++)
{
*mem1=0x1010F0F0;
mem1++;
}
}

static int __init insert(void)
{
uint32_t *memory;
memory=mem_alloc();
mem_write(memory);
return 0;
}

static void __exit remove(uint32_t *memory)
{
kfree(memory);
}

本程序在执行指令时发生总线错误

 *mem1=0x1010F0F0;

最佳答案

ioremap()用于将总线内存映射到CPU空间。

ioremap 执行平台特定的操作序列,使总线内存成为 CPU 可通过 readb/readw/readl/writeb/writew/writel 函数和其他 mmio 助手访问。 不保证返回的地址可以直接用作虚拟地址。

kmalloc 在物理内存的连续内存位置分配内存并返回它的虚拟地址指针。

ioremap 期望输入中的物理地址但您将虚拟地址作为物理地址提供给 ioremap。该虚拟地址值可能与物理地址值相同任何总线,它正在将该物理总线空间映射到虚拟总线(我们必须使用 readb/readw/readl/writeb/writew/writel 访问设备寄存器),因为它给出了错误。

关于c - 内存读/写操作中的总线错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6069772/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com