【问题标题】:Device Driver for Reserved Memory保留内存的设备驱动程序
【发布时间】:2018-01-16 20:18:49
【问题描述】:

我正在尝试开发一个简单的字符设备驱动程序来访问该站点中描述的保留内存区域:http://www.wiki.xilinx.com/Linux+Reserved+Memory

/* Get reserved memory region from Device-tree */

np = of_parse_phandle(dev->of_node, "memory-region", 0);

if (!np) {
    dev_err(dev, "No %s specified\n", "memory-region");
    goto error1;
}

rc = of_address_to_resource(np, 0, &r);

if (rc) {
  dev_err(dev, "No memory address assigned to the region\n");  
  goto error1;
}

lp->paddr = r.start;
lp->vaddr = memremap(r.start, resource_size(&r), MEMREMAP_WB);

dev_info(dev, "Allocated reserved memory, vaddr: 0x%0llX, paddr: 0x%0llX\n", (u64)lp->vaddr, lp->paddr);

该网站未提供有关lp->paddrlp->vaddr 的任何信息

lp 的数据类型是什么?

【问题讨论】:

  • lp 是 struct lp_desc 的对象。 paddr 和 vaddr 分别代表物理地址和虚拟地址。在您的情况下,不需要 lp 结构。
  • 他们那里有相当过时的代码(它可以在现代内核上工作,虽然不那么可读)。首先,您可以查看struct resource *r = platform_get_resource(pdev, IORESOURCE_MEM, 0);,哪个更容易解释。 r->start 将指向内存资源的起始物理地址。其次,memremap() 在虚拟地址空间中为该资源创建一个窗口。因此,paddrvaddr 的类型分别是 phys_addr_t(或 resource_size_t 派生自 phys_addr_t)和 void *。回答问题,lp 的类型无关紧要,它是一个容器。

标签: memory linux-kernel linux-device-driver embedded-linux reserved


【解决方案1】:

我认为“lp”不是预定义变量。 我已经用 vaddr 和 paddr 作为结构元素声明了我自己的结构,并将 lp 定义为结构变量并且它起作用了。

static struct addr_map
{
   __u32 paddr,vaddr;
   ssize_t size;
}*lp;

【讨论】:

    猜你喜欢
    • 2018-04-01
    • 1970-01-01
    • 2011-07-29
    • 2018-02-09
    • 2011-04-14
    • 2017-03-02
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多