免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7042 | 回复: 10
打印 上一主题 下一主题

[内存管理] 用户态mmap匿名映射的问题! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-08-03 22:47 |只看该作者 |倒序浏览
系统内存为512M,用mmap匿名映射了0x10000000地址起始的128M内存,如何mmap返回成功的话,那么操作系统还会去将0x10000000~0x18000000的内存分给别的程序吗?

论坛徽章:
0
2 [报告]
发表于 2014-08-03 22:53 |只看该作者
其实,我想解决的一个问题就是,想将一段固定地址的物理内存分配出来给app用,由于这块内存将会给其他硬件使用,所以,必须是物理地址连续的。
而且分配的size比较大,有256M之多。所以,内核里面的allloc_pages无能为力了。所以,想到用mmap的匿名映射来实现。
不知道其他朋友,遇到这种问题都是如何解决?

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
3 [报告]
发表于 2014-08-04 12:34 |只看该作者
312-pirl0 发表于 2014-08-03 22:53
其实,我想解决的一个问题就是,想将一段固定地址的物理内存分配出来给app用,由于这块内存将会给其他硬件使 ...

可以使用mem=内核启动参数保留一段内存出来,然后ioremap专用。。。

论坛徽章:
0
4 [报告]
发表于 2014-08-06 15:54 |只看该作者
刚开始,我也是想的这一招,但是在xilinx zynq芯片提供kernel中使用该参数时,kernel panic。我查了一下,应该是rootfs initrd和dtb存放的地址在ddr的高地址上,所以造成的panic。

panic log:
Linux version 3.12.0-xilinx (root@debian) (gcc version 4.6.3 (Wind River Linux Sourcery CodeBench 4.6a-105) ) #4 SMP PREEMPT Sat Jun 7 22:36:15 CST 2014
CPU: ARMv7 Processor [413fc090] revision 0 (ARMv7), cr=18c5387d
CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
Machine: Xilinx Zynq Platform, model: Xilinx Zynq
bootconsole [earlycon0] enabled
INITRD: 0x1f61e000+0x005104dd is not a memory region - disabling initrd
Memory policy: Data cache writealloc
Unable to handle kernel paging request at virtual address df619000
pgd = c0004000
[df619000] *pgd=00000000
Internal error: Oops: 5 [#1] PREEMPT SMP ARM
Modules linked in:
CPU: 0 PID: 0 Comm: swapper Not tainted 3.12.0-xilinx #4
task: c053b020 ti: c0530000 task.ti: c0530000
PC is at __unflatten_device_tree+0xd0/0x270
LR is at 0x0
pc : [<c02f0d64>]    lr : [<00000000>]    psr: 600001d3
sp : c0531f60  ip : d00dfeed  fp : 00000000
r10: 00000000  r9 : 413fc090  r8 : 413fc090
r7 : c053bef0  r6 : c05086fc  r5 : c056a790  r4 : df619000
r3 : 00000000  r2 : 00000000  r1 : 00000000  r0 : c056a790
Flags: nZCv  IRQs off  FIQs off  Mode SVC_32  ISA ARM  Segment kernel
Control: 18c5387d  Table: 0000404a  DAC: 00000015
Process swapper (pid: 0, stack limit = 0xc0530240)
Stack: (0xc0531f60 to 0xc0532000)
1f60: df619000 c05919e0 c05086fc c05919e0 c052514c c0589a18 c0799c40 c051cf00
1f80: 00000000 c0507a64 00000000 18c5387d 413fc090 00000000 00000000 c0397c60
1fa0: c046a00a c0531fbc 00000000 c0531fbc c0530000 00000001 ffffffff c0531fc8
1fc0: 0000406a c05047f4 00000000 00000000 00000000 00000000 00000000 c0526188
1fe0: 18c5387d c05383cc c0526184 c053c000 0000406a 00008074 00000000 00000000
[<c02f0d64>] (__unflatten_device_tree+0xd0/0x270) from [<c051cf00>] (unflatten_device_tree+0x18/0x30)
[<c051cf00>] (unflatten_device_tree+0x18/0x30) from [<c0507a64>] (setup_arch+0x5bc/0x89
[<c0507a64>] (setup_arch+0x5bc/0x89 from [<c05047f4>] (start_kernel+0x78/0x304)
[<c05047f4>] (start_kernel+0x78/0x304) from [<00008074>] (0x8074)
Code: e6bf2f32 e59f117c ebfb7a69 e59fc178 (e594e000)
---[ end trace 1b75b31a2719ed1c ]---
Kernel panic - not syncing: Attempted to kill the idle task!

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
5 [报告]
发表于 2014-08-06 19:16 |只看该作者
312-pirl0 发表于 2014-08-06 15:54
刚开始,我也是想的这一招,但是在xilinx zynq芯片提供kernel中使用该参数时,kernel panic。我查了一下,应 ...

从信息看,像是bug,不过arm架构的东东我不熟,不好判断或深入分析。看来得想想其它办法了。
我记得好像有人做过“内存即时映射”的功能,要找找~
你这段内存是留给用户态程序使用?还是内核自己使用?

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
6 [报告]
发表于 2014-08-06 22:29 |只看该作者
回复 4# 312-pirl0
rootfs initrd和dtb存放的地址存放的地址也是可以调的麻,一并往低调不就行了吗。

另外一种方式也可以,就是麻烦点,就是在bootmem里把一段页框先给保留起来。不让buddy去用。以后你自己就可以ioremap了。


   

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
7 [报告]
发表于 2014-08-06 22:45 |只看该作者
还有第三种方式,如是你有DTB的话,应该可以在DTS里头把内存分两段,把低端和你的initrd用户的高端留着,把中间一块挖出来。

论坛徽章:
0
8 [报告]
发表于 2014-08-06 22:46 |只看该作者
回复 5# humjb_1983
留给用户态程序用的。

   

论坛徽章:
0
9 [报告]
发表于 2014-08-06 22:49 |只看该作者
回复 6# Tinnal

谢谢,tinnal。我现在使用的方法就是在bootloader中修改rootfs和dtb的存放地址。然后,kernel中就可以使用mem bootarg的参数了,dts中的memory reg也可以做到。这两种方法二选一就好了。
   

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
10 [报告]
发表于 2014-08-06 22:54 |只看该作者
312-pirl0 发表于 2014-08-06 22:46
回复 5# humjb_1983
留给用户态程序用的。

留给用户态程序,为何要求物理内存连续?没这个必要吧?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP