免费注册 查看新帖 |

Chinaunix

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

[内存管理] 预留Linux内核不能管理到的内存 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-06-25 11:09 |只看该作者 |倒序浏览

我想在物理内存中留一些空间,用来存储一些文件,大小大概是10M左右。请问用什么方法可以把这些内存留出来,而这些内存是内核永远也不会用到的?
谢谢!!

论坛徽章:
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
2 [报告]
发表于 2014-06-25 11:10 |只看该作者
内核启动参数,好像是:mem=

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
3 [报告]
发表于 2014-06-25 11:20 |只看该作者
回复 1# date01

我自己以前记录的方法:

1. cmdline中传入 mem=,然后 request_mem_region(), ioremap()

2. reserve_bootmem(), reserve_bootmem_generic(), 或memblock_reserve()后,调用 request_mem_region(), ioremap()

3. 在启动流程中分配,调用 alloc_bootmem(), alloc_bootmem_low(), alloc_bootmem_pages(), alloc_bootmem_low_pages().使用完毕调用 free_bootm()释放.参见LDD3 Chapter 8, P19

但是 reserve和 alloc bootmem的区别我没有仔细去研究过。reserve应该是只是保留地址空间给你,而需要你自己去映射后才能使用!

论坛徽章:
0
4 [报告]
发表于 2014-06-25 12:31 |只看该作者
回复 1# date01

要改内核启动代码吗?{:2_179:}
   

论坛徽章:
0
5 [报告]
发表于 2014-06-25 13:20 |只看该作者
回复 4# njuzhyf

其实你可以仿照内核为kexec/kdump预留内存一样,照着写一个函数,大小设为你要的大小就好了。
   

论坛徽章:
0
6 [报告]
发表于 2014-06-25 13:37 |只看该作者
去看看你們platform code在哪邊有MACHINE_START()
把下列code加入進去即可
  1. static void __init xx_reserve(void)
  2. {
  3.     u32 paddr,size;

  4.     if(pa == ~0) {
  5.       printk("reserve : no reserve mem\n");
  6.       return;
  7.     }

  8.     paddr=pa;
  9.     size=10M;
  10.     size = ALIGN(size, SZ_2M);
  11.     if (memblock_reserve(paddr, size) < 0) {
  12.         pr_err("failed to reserve DRAM - no memory\n");
  13.     }
  14.     memblock_free(paddr, size);
  15.     memblock_remove(paddr, size);

  16.     printk("reserve : reserve 10M mem\n");
  17. }
复制代码
  1. MACHINE_START(xxxxx, "xxxxx")
  2.     .map_io     = xx_map_io,
  3.     .fixup      = xx_fixup,
  4.     .restart    = xx_restart,
  5.     .[b]reserve    = xx_reserve,[/b]
  6.     .init_irq   = xx_init_irq,
  7.     .init_machine   =xx_init,
  8.     .handle_irq = gic_handle_irq,
  9.     .timer      = &xx_timer,
  10. MACHINE_END
复制代码

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
7 [报告]
发表于 2014-06-25 14:37 |只看该作者
回复 6# wth0722

Yeah, cool!这才是专业做法,感谢分享,记录了!

另外,memblock应该算是 bootmem的替代物吧,记得有 NO_BOOTMEM的选项和 mm/nobootmem.c,其实现使用的就是 memblock。

论坛徽章:
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
8 [报告]
发表于 2014-06-25 14:45 |只看该作者
wth0722 发表于 2014-06-25 13:37
去看看你們platform code在哪邊有MACHINE_START()
把下列code加入進去即可

“if(pa == ~0) {”
这个pa从哪儿来?

论坛徽章:
0
9 [报告]
发表于 2014-06-25 15:06 |只看该作者
回复 7# asuka2001

yes
   

论坛徽章:
0
10 [报告]
发表于 2014-06-25 15:08 |只看该作者
回复 8# humjb_1983

全局的?这种名字有点不像。这种模板我看了下,好像只在3个架构中实现了(arc, arm, metag)
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP