cathy_hust 2024-07-15 13:26 采纳率: 100%
浏览 3
已结题

驱动访问linux预留内存

你好,我遇到一个问题
我在linux中reserve了2G的内存,起始地址是0x180000000,然后我的驱动会对这个起始物理地址进行
dma_map_page()映射。另外有个硬件通过dma给这个物理地址写数据。
大概调用:
page = pfn_to_page(PFN_DOWN(dm->address)) ; //dm->address就是0x180000000
dma_addr = dma_map_page(xx,page, 0, length, DMA_BIDIRECTIONAL);

接下来我想在驱动中访问这段物理内存,我试过下面4种方式:

  1. ioremap(0x180000000, length); //报错:ioremap error for 0x180000000-0x180010000,requested 0x2, got 0x0
  2. memremap(0x180000000, length, 0); //内核直接crash,不得不硬重启系统
  3. virt_to_phys(0x180000000)
  4. ioremap(0x190000000, length); //内核crash,不得不硬重启,看不到dmesg,但应该就是这里引起的
    请问下,您有什么建议吗?
  • 写回答

4条回答 默认 最新

  • cathy_hust 2024-07-15 18:23
    关注

    清楚原因了,我是在中断处理函数中调用ioremap等函数的:
    1,中断处理程序中不能使用有睡眠功能的函数,如ioremap,kmalloc,msleep等,理由是中断程序并不是进程,没有进程的概念,因此就没有休眠的概念;
    ioremap最好在初始化的时候去做,中断处理中做的话,会导致kernel卡死。谢谢各位。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 7月23日
  • 已采纳回答 7月15日
  • 创建了问题 7月15日