Linux char设备驱动程序和devm_ioremap_resource问题

问题描述

我有一个Linux驱动程序,该驱动程序使用户空间可以访问我们的FPGA寄存器。寄存器的地址和大小在Altera生成的system.h文件中定义。

最初,我已经使用命令“ request_mem_region()”和“ ioremap()”来保留内存位置,但是我已经阅读到不赞成使用这些命令,而应该使用“ devm_ioremap_resource()”命令。 / p>

“ request_mem_region()”和“ ioremap()”命令没有任何问题,但是当我使用“ devm_ioremap_resource()”命令时,出现以下错误无法处理内核NULL”在插入(插入)驱动程序时,指针将在虚拟地址00000000处取消引用。

所有调试数据都将打印到“ devm_ioremap_resource()”命令中,并且我已经进行了检查以确保dev结构指针不是NULL。

有人知道我哪里出问题了吗?

我的平台设备和资源结构定义如下:

static struct resource fpga_reg_resources[] = {
{
    .name = "RESOURCE_TEST",.start  = 0xFF200000,.end    = 0xFF201000-1,.flags = IORESOURCE_MEM,}};

struct platform_device FPGA_Reg =
{
    .name = "FPGA_Reg",.resource = fpga_reg_resources,.num_resources = 1,.dev =
        {
            .release = my_release,.dma_mask = (u64 *)&dmamask,.coherent_dma_mask = DMA_BIT_MASK(32),},};

------- cut --------
p_resource = platform_get_resource(&FPGA_Reg,IORESOURCE_MEM,0);
if (p_resource == NULL)
{
  printk(KERN_ALERT "Failed to get resource pointer\n");
  return ((void *)PTR_ERR(p_resource));
}
else
{
  printk(KERN_ALERT "p_resource->start:0x%04X \n",p_resource->start);
  printk(KERN_ALERT "p_resource->end:0x%04X \n",p_resource->end);

  if (&FPGA_Reg.dev == NULL)
  {
    printk(KERN_ALERT "Dev == NULL\n");
    return ((void *)PTR_ERR(p_resource));
  }
  else
  {
    printk(KERN_ALERT "test 3\n");
    devm_ioremap_resource(&FPGA_Reg.dev,p_resource);
  }
}

这是我插入模块时的Linux输出

Jan  1 00:00:47 LST auth.info login[289]: root login on 'ttyS0'
Jan  1 00:00:50 LST user.warn kernel: [   50.887123] LST_Driver: loading out-of-tree module taints kernel.
Jan  1 00:00:50 LST user.info kernel: [   50.894888] Initializing the LKM
Jan  1 00:00:50 LST user.info kernel: [   50.898146] LST_Driver: registered correctly with major number 249
Jan  1 00:00:50 LST user.info kernel: [   50.904359] LST_Driver: device class registered correctly
Jan  1 00:00:50 LST user.info kernel: [   50.909877] LST_Driver: device class created correctly
Jan  1 00:00:50 LST user.info kernel: [   50.915044] Mapping register addresses ...
Jan  1 00:00:50 LST user.alert kernel: [   50.919140] 1.map memory offset:0xFF200000 [size:0x1000]
Jan  1 00:00:50 LST user.alert kernel: [   50.924455] p_resource->start:0xFF200000
Jan  1 00:00:50 LST user.alert kernel: [   50.928463] p_resource->end:0xFF200FFF
Jan  1 00:00:50 LST user.alert kernel: [   50.932304] test 3
Jan  1 00:00:51 LST user.alert kernel: [   50.934332] 8<--- cut here ---
Jan  1 00:00:51 LST user.alert kernel: [   50.937375] Unable to handle kernel NULL pointer dereference at virtual address 00000000
Jan  1 00:00:51 LST user.alert kernel: [   50.945429] pgd = a8a74411
Jan  1 00:00:51 LST user.alert kernel: [   50.948124] [00000000] *pgd=00000000
Jan  1 00:00:51 LST user.emerg kernel: [   50.951690] Internal error: Oops: 805 [#1] PREEMPT SMP ARM
Jan  1 00:00:51 LST user.debug kernel: [   50.957151] Modules linked in: LST_Driver(O+)
Jan  1 00:00:51 LST user.debug kernel: [   50.962275] cpu: 0 PID: 305 Comm: insmod Tainted: G           O      5.4.34 #2020-08-13---13-40-20
Jan  1 00:00:51 LST user.debug kernel: [   50.971192] Hardware name: Altera SOCFPGA
Jan  1 00:00:51 LST user.debug kernel: [   50.975197] PC is at devres_add+0x4c/0x5c
Jan  1 00:00:51 LST user.debug kernel: [   50.979190] LR is at devres_add+0x20/0x5c
Jan  1 00:00:51 LST user.debug kernel: [   50.983181] pc : [<c0480968>]    lr : [<c048093c>]    psr: 600e0093
Jan  1 00:00:51 LST user.debug kernel: [   50.989419] sp : ee6d3d50  ip : bf0020fc  fp : c08e5e48
Jan  1 00:00:51 LST user.debug kernel: [   50.994619] r10: bf002200  r9 : eea0d2e4  r8 : bf002028
Jan  1 00:00:51 LST user.debug kernel: [   50.999820] r7 : ff200000  r6 : bf0020f8  r5 : bf002028  r4 : ee50e140
Jan  1 00:00:51 LST user.debug kernel: [   51.006317] r3 : ee50e100  r2 : 00000000  r1 : a00e0013  r0 : bf0020f8
Jan  1 00:00:51 LST user.debug kernel: [   51.012817] Flags: nZCv  IRQs off  FIQs on  Mode SVC_32  ISA ARM  Segment none
Jan  1 00:00:51 LST user.debug kernel: [   51.020006] Control: 10c5387d  Table: 2e6dc04a  DAC: 00000051
Jan  1 00:00:51 LST user.emerg kernel: [   51.025725] Process insmod (pid: 305,stack limit = 0x1521ada2)
Jan  1 00:00:51 LST user.emerg kernel: [   51.031618] Stack: (0xee6d3d50 to 0xee6d4000)
Jan  1 00:00:51 LST user.emerg kernel: [   51.035958] 3d40:                                     ee50e140 eea0d700 00001000 c0031e28
Jan  1 00:00:51 LST user.emerg kernel: [   51.044101] 3d60: 00000000 c007dca8 bf0021dc 00001000 bf002028 bf002140 00000001 c04143cc
Jan  1 00:00:51 LST user.emerg kernel: [   51.052244] 3d80: 00000000 bf000ac0 ff200000 bf0021dc 00001000 bf000acc bf002440 ee9f8c00
Jan  1 00:00:51 LST user.emerg kernel: [   51.060386] 3da0: bf001274 bf00514c bf001274 ef0f30d0 00000000 bf002200 c08e5e48 bf005000
Jan  1 00:00:51 LST user.emerg kernel: [   51.068529] 3dc0: 00000000 c000afbc c08e5e48 eea09c00 00000000 f093c000 f093bfff fffff000
Jan  1 00:00:51 LST user.emerg kernel: [   51.076671] 3de0: 00000000 ef004ea0 ef004ea0 8040003f ef004ea0 c0999368 ef004ea8 c017e188
Jan  1 00:00:51 LST user.emerg kernel: [   51.084814] 3e00: 200e0013 eea09c00 ef001e00 bf002200 00000001 0adeb84b bf002200 00000001
Jan  1 00:00:51 LST user.emerg kernel: [   51.092956] 3e20: eea0d380 eea0d2c0 00000001 c00c0060 ee6d3f38 00000001 ee6d3f38 00000001
Jan  1 00:00:51 LST user.emerg kernel: [   51.101098] 3e40: f0917000 c00beddc bf00220c 00007fff bf002200 c00bb544 bf002248 c00bab2c
Jan  1 00:00:51 LST user.emerg kernel: [   51.109241] 3e60: bf002314 c07801e0 bf002408 bf00757b c08e5e48 c0780144 c07800fc c08e5e48
Jan  1 00:00:51 LST user.emerg kernel: [   51.117383] 3e80: 00000000 00000000 ffffe000 bf000000 0002395c 00000000 00000000 00000000
Jan  1 00:00:51 LST user.emerg kernel: [   51.125525] 3ea0: 00000000 00000000 00000000 00000000 6e72656b 00006c65 00000000 00000000
Jan  1 00:00:51 LST user.emerg kernel: [   51.133666] 3ec0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
Jan  1 00:00:51 LST user.emerg kernel: [   51.141809] 3ee0: 00000000 00000000 00000000 0adeb84b 7fffffff c08e5e48 00000000 00000003
Jan  1 00:00:51 LST user.emerg kernel: [   51.149951] 3f00: 004ee438 c0009204 ee6d2000 0000017b 00000000 c00bf484 7fffffff 00000000
Jan  1 00:00:51 LST user.emerg kernel: [   51.158094] 3f20: 00000003 00000000 0002395c f0917000 0002395c 00000000 f0917f8e f0918680
Jan  1 00:00:51 LST user.emerg kernel: [   51.166235] 3f40: f0917000 0002395c f093a114 f0939f14 f09311b8 00003000 00003200 000024fc
Jan  1 00:00:51 LST user.emerg kernel: [   51.174377] 3f60: 0000331f 00000000 00000000 00000000 000024ec 00000032 00000033 00000019
Jan  1 00:00:51 LST user.emerg kernel: [   51.182520] 3f80: 00000000 00000011 00000000 0adeb84b 00000000 a71d3c00 004ec44c 00501000
Jan  1 00:00:51 LST user.emerg kernel: [   51.190663] 3fa0: 0000017b c0009000 a71d3c00 004ec44c 00000003 004ee438 00000000 bee00ce8
Jan  1 00:00:51 LST user.emerg kernel: [   51.198805] 3fc0: a71d3c00 004ec44c 00501000 0000017b 00502060 004ec44c bee00e68 00000000
Jan  1 00:00:51 LST user.emerg kernel: [   51.206947] 3fe0: bee00c98 bee00c88 004e3fec b6e77072 800e0030 00000003 00000000 00000000
Jan  1 00:00:51 LST user.debug kernel: [   51.215103] [<c0480968>] (devres_add) from [<c0031e28>] (__devm_request_region+0x78/0xa0)
Jan  1 00:00:51 LST user.debug kernel: [   51.223257] [<c0031e28>] (__devm_request_region) from [<c04143cc>] (devm_ioremap_resource+0x5c/0xf4)
Jan  1 00:00:51 LST user.debug kernel: [   51.232375] [<c04143cc>] (devm_ioremap_resource) from [<bf000acc>] (reserved_mem+0x88/0xe8 [LST_Driver])
Jan  1 00:00:51 LST user.debug kernel: [   51.242613] [<bf000acc>] (reserved_mem [LST_Driver]) from [<bf00514c>] (Driver_init+0x14c/0x1000 [LST_Driver])
Jan  1 00:00:51 LST user.debug kernel: [   51.253880] [<bf00514c>] (Driver_init [LST_Driver]) from [<c000afbc>] (do_one_initcall+0x48/0x2b8)
Jan  1 00:00:51 LST user.debug kernel: [   51.263324] [<c000afbc>] (do_one_initcall) from [<c00c0060>] (do_init_module+0x68/0x248)
Jan  1 00:00:51 LST user.debug kernel: [   51.271383] [<c00c0060>] (do_init_module) from [<c00beddc>] (load_module+0x2278/0x26b0)
Jan  1 00:00:51 LST user.debug kernel: [   51.279353] [<c00beddc>] (load_module) from [<c00bf484>] (sys_finit_module+0xb8/0x108)
Jan  1 00:00:51 LST user.debug kernel: [   51.287237] [<c00bf484>] (sys_finit_module) from [<c0009000>] (ret_fast_syscall+0x0/0x54)
Jan  1 00:00:51 LST user.debug kernel: [   51.295376] Exception stack(0xee6d3fa8 to 0xee6d3ff0)
Jan  1 00:00:51 LST user.debug kernel: [   51.300408] 3fa0:                   a71d3c00 004ec44c 00000003 004ee438 00000000 bee00ce8
Jan  1 00:00:51 LST user.debug kernel: [   51.308551] 3fc0: a71d3c00 004ec44c 00501000 0000017b 00502060 004ec44c bee00e68 00000000
Jan  1 00:00:51 LST user.debug kernel: [   51.316692] 3fe0: bee00c98 bee00c88 004e3fec b6e77072
Jan  1 00:00:51 LST user.emerg kernel: [   51.321725] Code: e1a01000 e504c040 e1a00006 e504203c (e5823000)
Jan  1 00:00:51 LST user.warn kernel: [   51.327794] ---[ end trace 9bc97cb7fb386156 ]---
Jan  1 00:00:51 LST user.info kernel: [   51.332395] note: insmod[305] exited with preempt_count 1
#

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)