【问题标题】:writing to an ioport resulting in segfaults写入 ioport 导致段错误
【发布时间】:2011-02-06 15:55:21
【问题描述】:

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

使用request_mem_region(0xFFFFFC00,0x100,"name"); //port range runs from fc00 to fcff

效果很好并显示在/proc/iomem

然后我尝试写入 fc20 端口的最后一位

writel(0x1, 0xFFFFFC20);

并且我出现了段错误...特别是“无法在虚拟地址 fffffc20 处处理内核分页请求。”

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

任何有用的见解都会很棒......

【问题讨论】:

    标签: io arm embedded-linux ports


    【解决方案1】:

    您需要对您请求的内存区域进行 ioremap。 ioremap 将虚拟地址映射到物理地址。 writel 适用于虚拟地址,而不适用于物理地址。

    /* request mem_region */
    ...
    
    base = ioremap(0xFFFFFC00, 0x100);
    if(base == NULL)
        release_mem_region(...);
    /* now you can use base */
    writel(0x1, base + 20)
    ...
    

    您可能需要将驱动程序编写为platform_driver,并在board_file 中声明一个平台设备

    可以找到一个比较简单的platform_driver例子here
    事实上,使用 lxr 浏览内核源代码可能是学习如何 像这样的东西。

    【讨论】:

    • 太棒了 - 这让我很满意 :) thaks
    • 应该改用iowrite32吗?
    • 如果另一个驱动程序已经将request_mem_regionioremap 映射到虚拟内存中,是否仍需要ioremap
    • @IanVaughan :那么一个驱动依赖于另一个驱动。如果第一个驱动程序被卸载/释放它的资源,而第二个驱动程序尝试访问不再映射的内存,会发生什么?我认为值得提出一个问题,以及为什么两个驱动程序共享相同资源的上下文。
    猜你喜欢
    • 2020-08-12
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    相关资源
    最近更新 更多