[问题] 移植系统 保留一块内存问题

楼主: ridge (夏天)   2014-07-11 01:23:47
新手移植系统遇到一些问题, 卡一段时间了, 求助一下
移植 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 就可以用吗?
实在不懂, 有没有什么方向可参考, 谢谢
作者: askacis (ASKA)   2014-07-11 16:54:00
alloc_bootmem应该是可以用,我从2.6x到3.x都是这样挖只是你呼叫的时间点要在kernel刚起来内存还没配置完全拿到的位置直接转physical addr就可以用了~我们硬件更夸张,需要连续内存都要一两百MB的~
作者: mayasky ( )   2014-07-12 16:44:00
来个CODEDUMP和SOURCE CODE大家会比较好帮你COREDUMP
作者: enthos (影斯作业系统)   2014-07-13 01:48:00

Links booklink

Contact Us: admin [ a t ] ucptt.com