作者ridge (夏天)
看板LinuxDev
标题[问题] 移植系统 保留一块记忆体问题
时间Fri Jul 11 01:23:47 2014
新手移植系统遇到一些问题, 卡一段时间了, 求助一下
移植 linux kernel driver
需要一块20M上下的 physical 连续的记忆体给硬体使用
参考的程式是直接
platform_get_resource(pdev, IORESOURCE_MEM, 0);
然後拿得到的 physical addr?
印出来的位置是 0xbe......~0xbf 直接转换
ioremap 得到 virtual addr 就一路操作下去
我仿造直接拿 0xbe......~0xbf...... 去做 ioremap
结果失败, 印一堆 kernel message 查了一下
http://lxr.free-electrons.com/source/arch/arm/mm/ioremap.c#L334
287 if (size && !(sizeof(phys_addr_t) == 4 && pfn >= 0x100000)) {
288 struct static_vm *svm;
289
290 svm = find_static_vm_paddr(paddr, size, mtype);
291 if (svm) {
292 addr = (unsigned long)svm->vm.addr;
293 addr += paddr - svm->vm.phys_addr;
294 return (void __iomem *) (offset + addr);
295 }
296 }
297
298 /*
299 * Don't allow RAM to be mapped - this causes problems with ARMv6+
300 */
301 if (WARN_ON(pfn_valid(pfn)))
302 return NULL;
印log对起来是 svm=find_static_vm_paddr 就得到 0
然後 pfn_valid(pfn) = 1, 然後就印了讯息直接 return NULL
觉得少做了一些事所以这样失败, 一直乱试还没结果
是因为没有保留一块记忆体, 还是少建立对应表, 还是少做哪些事?
网路上查询要在一开始保留大块记忆体大部分做法是
alloc_bootmem(size) 或是开机设定 kernel 参数 mem=xx
alloc_bootmem(size) 试过了目前还是失败
回传的位置已是 virtual addr 转成 physical addr 就可用
不用在 ioremap 还甚麽设定就直接用?
开机设定 kernel 参数这部分还没试过
这个就直接用 ioremap 转换一个 physical addr 就可以用吗?
实在不懂, 有没有甚麽方向可参考, 谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 111.251.204.140
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/LinuxDev/M.1405013031.A.827.html
1F:推 askacis:alloc_bootmem应该是可以用,我从2.6x到3.x都是这样挖 07/11 16:54
2F:→ askacis:只是你呼叫的时间点要在kernel刚起来记忆体还没配置完全 07/11 16:55
3F:→ askacis:拿到的位置直接转physical addr就可以用了~ 07/11 16:56
4F:推 askacis:我们硬体更夸张,需要连续记忆体都要一两百MB的~ 07/11 16:58
5F:→ mayasky:来个CODEDUMP和SOURCE CODE大家会比较好帮你 07/12 16:44
6F:→ mayasky:COREDUMP 07/12 17:17