写入ioport会导致SegFault

写入ioport会导致SegFault,io,arm,embedded-linux,ports,Io,Arm,Embedded Linux,Ports,我在为atmel at91sam9260 arm 9芯单板计算机[glomation gesbc9260]写作 使用请求内存区域(0xFFFFFC00,0x100,“名称”)//端口范围从fc00到fcff 工作正常,并显示在/proc/iomem 然后,我尝试使用 writel(0x1,0xFFFFFC20) 我还特别指出“无法处理虚拟地址FFF C20处的内核分页请求。” 我认为我没有分配正确的内存空间 任何有用的见解都会很好 您需要重新映射所请求的mem区域。ioremap将虚拟地址映射到

我在为atmel at91sam9260 arm 9芯单板计算机[glomation gesbc9260]写作

使用
请求内存区域(0xFFFFFC00,0x100,“名称”)//端口范围从fc00到fcff

工作正常,并显示在
/proc/iomem

然后,我尝试使用

writel(0x1,0xFFFFFC20)

我还特别指出“无法处理虚拟地址FFF C20处的内核分页请求。”

我认为我没有分配正确的内存空间


任何有用的见解都会很好

您需要重新映射所请求的mem区域。ioremap将虚拟地址映射到物理地址。 writel使用虚拟地址,而不是物理地址

/* request mem_region */
...

base = ioremap(0xFFFFFC00, 0x100);
if(base == NULL)
    release_mem_region(...);
/* now you can use base */
writel(0x1, base + 20)
...
您可能需要将驱动程序编写为平台驱动程序,并在board\u文件中声明平台设备

可以找到相对简单的平台驱动程序示例
事实上,使用lxr浏览内核源代码可能是学习如何
像这样的东西。

awesome-这让我明白了:)他信应该用
iowrite32
来代替吗?如果另一个驱动程序已经将其映射到虚拟内存中,
request\u mem\u region
ioremap
是否仍然需要。如果第一个驱动程序卸载/释放其资源,而第二个驱动程序尝试访问不再映射的内存,会发生什么情况?我认为这值得一个问题,以及为什么两个驱动程序共享相同的资源。