免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
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
1 [报告]
发表于 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应该是只是保留地址空间给你,而需要你自己去映射后才能使用!

论坛徽章:
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
2 [报告]
发表于 2014-06-25 14:37 |显示全部楼层
回复 6# wth0722

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

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

论坛徽章:
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 22:05 |显示全部楼层
回复 11# arm-linux-gcc

#ifdef CONFIG_NO_BOOTMEM
/* We are using top down, so it is safe to use 0 here */
#define BOOTMEM_LOW_LIMIT 0
#else
#define BOOTMEM_LOW_LIMIT __pa(MAX_DMA_ADDRESS)
#endif

#define alloc_bootmem(x) \
        __alloc_bootmem(x, SMP_CACHE_BYTES, BOOTMEM_LOW_LIMIT)

使用 NO_BOOTMEM时,是从高地址往地地址查找,不会优先使用 low page!

如果没配置 NO_BOOTMEM,bootmem就是实现的 bottom up方式,这个时候使用的就是从 MAX_DMA_ADDRESS向上!

x86上的确是 16MB开始的 low page!但是 arm上是:

#ifndef CONFIG_ZONE_DMA
#define MAX_DMA_ADDRESS        0xffffffffUL
#else
#define MAX_DMA_ADDRESS        ({ \
        extern unsigned long arm_dma_zone_size; \
        arm_dma_zone_size ? \
                (PAGE_OFFSET + arm_dma_zone_size) : 0xffffffffUL; })
#endif

不一定使用 low page!

论坛徽章:
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
4 [报告]
发表于 2014-06-25 22:06 |显示全部楼层
回复 18# arm-linux-gcc

想来内核认为调用 memblock_reserve()主要目的是为了保留 IO region,既然并非 RAM区域,开启 cache肯定不合适。。。

所以 mmap给 userspace自然就给你关掉了 cache!

int pfn_valid(unsigned long pfn)
{
        return memblock_is_memory(__pfn_to_phys(pfn));
}
EXPORT_SYMBOL(pfn_valid);

论坛徽章:
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
5 [报告]
发表于 2014-06-25 23:04 |显示全部楼层
回复 23# arm-linux-gcc

恩的确,你是对的,我没仔细查看底下的实现。。。THX
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP