【发布时间】: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->paddr 和lp->vaddr 的任何信息
lp 的数据类型是什么?
【问题讨论】:
-
lp 是 struct lp_desc 的对象。 paddr 和 vaddr 分别代表物理地址和虚拟地址。在您的情况下,不需要 lp 结构。
-
他们那里有相当过时的代码(它可以在现代内核上工作,虽然不那么可读)。首先,您可以查看
struct resource *r = platform_get_resource(pdev, IORESOURCE_MEM, 0);,哪个更容易解释。r->start将指向内存资源的起始物理地址。其次,memremap()在虚拟地址空间中为该资源创建一个窗口。因此,paddr和vaddr的类型分别是phys_addr_t(或resource_size_t派生自phys_addr_t)和void *。回答问题,lp的类型无关紧要,它是一个容器。
标签: memory linux-kernel linux-device-driver embedded-linux reserved