免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: date01
打印 上一主题 下一主题

[内存管理] 预留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
21 [报告]
发表于 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);

论坛徽章:
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
22 [报告]
发表于 2014-06-25 22:23 |只看该作者
asuka2001 发表于 2014-06-25 22:06
回复 18# arm-linux-gcc

想来内核认为调用 memblock_reserve()主要目的是为了保留 IO region,既然并非 ...

asuka兄的理解很到位,代码也看得细,向你学习。。。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
23 [报告]
发表于 2014-06-25 22:35 |只看该作者
本帖最后由 arm-linux-gcc 于 2014-06-25 22:39 编辑

回复 20# asuka2001


    虽然nobootmem.c和bootmem.c中查找的方向不一样了

但是在__alloc_memory_core_early中有,
if (limit > memblock.current_limit)
        limit = memblock.current_limit;
current_limit是u32类型的,传入的limit为-1,memblock.current_limit则是表示low mem的最高地址

所以memblock_find_in_range_node里面的start就为0,end就是low mem的最高地址,所以分配到的内存仍然在low mem区域

并且在__alloc_memory_core_early里面还有ptr = phys_to_virt(addr),如果memblock_find_in_range_node返回一个high mem地址,那么是不能使用phys_to_virt来做线性转换的




论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
24 [报告]
发表于 2014-06-25 22:47 |只看该作者
回复 21# asuka2001


    这样还是不够灵活,以前在2.6的代码,拿到3.x下来就发现性能降低了,最后发现是这里的cache被关闭了
应该让app在open时自己设置O_SYNC来决定是否要cache

论坛徽章:
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
25 [报告]
发表于 2014-06-25 23:04 |只看该作者
回复 23# arm-linux-gcc

恩的确,你是对的,我没仔细查看底下的实现。。。THX

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



就是你想要保留的Physical memory上的位址

當你告訴kernel說有一塊記憶體要保留

給的資訊是PA並非VA

论坛徽章:
0
27 [报告]
发表于 2014-06-26 16:02 |只看该作者
回复 8# humjb_1983


在公司無法編輯,所以再回復一次

之所以會有if(pa == ~0) { ... }

是因為我們會把pa=~0 (初始值)

如果走道這邊發現還是等於~0救代表不需保留記憶體

但是如果上一層的u-boot有傳下來要保留的pa

此時pa就不是~0,那救代表會走下面那段code,去保留記憶體

论坛徽章:
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
28 [报告]
发表于 2014-06-26 16:15 |只看该作者
wth0722 发表于 2014-06-26 15:55
回复 8# humjb_1983

但是pa这个变量没看到定义呢?呵呵,是全局变量?

论坛徽章:
0
29 [报告]
发表于 2014-06-27 18:32 |只看该作者
回复 28# humjb_1983

是的,他是一個全域變數


   

论坛徽章:
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
30 [报告]
发表于 2014-06-28 22:46 |只看该作者
wth0722 发表于 2014-06-27 18:32
回复 28# humjb_1983

是的,他是一個全域變數

哦,没去看代码,但这样命名的全局变量有点怪~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP