免费注册 查看新帖 |

Chinaunix

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

2440开发板,linux 2.6内核启动过程中,是如何得到内存大小的? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-18 07:33 |只看该作者 |倒序浏览
在代码里翻了几个小时,没找到确定的答案。

从其它的一些开发板的源码来看,内存大小有几种方式可以指定:
1. 靠bootloader传递mem参数给内核。
2. 在特定的arch源码包中,有某些_fixup函数来设置meminfo.bank[0].size。

但是研究过我的2440开发板的启动过程,没有相应的内核参数传递。
也没有在linux源码中找到指定内存大小的源码位置。

似乎内存的初始化相关源码在arch/arm/mm/Init.c中,但我比较棒槌,看得比较混乱,貌似其中有分析命令行取得内存大小信息的代码,但来源实在难以追溯。

似乎还有通过读写测试来自动检测内存大小的手段,不过跟达人探讨过,这种方式检测的结果不一定准确。

不知有没有高手研究过这个问题,2410系列,其内存大小信息到底写在哪里?

论坛徽章:
0
2 [报告]
发表于 2009-02-18 19:15 |只看该作者
溺水的鱼。。。?

论坛徽章:
0
3 [报告]
发表于 2009-02-18 20:23 |只看该作者

说说我的看法

arm linux中一般在cmdline或传递tag参数中设置, 个别板子在machine_desc.fixup函数中设置. 按顺序分别说明:

1, 出现顺序(内核版本2.6.25.20,下同)
start_kernel()
    ->setup_arch()
        ->mdesc->fixup()
        ->parse_tags()
            ->parse_tag_mem32()
        ->parse_cmdline()
            ->early_mem()

2, fixup()函数
这个函数arm平台用的很少. 我只找到eseries.c, mach-smdk2413.c, mach-vstms.c这几个arm板子有, smdk2413_fixup()是在bootloader传递tag地址与machine_desc预设tag地址(mem_PA+0x100)不同时设置memory的start和size. 如果fixup起作用, 会从tag中把mem tag改为ATAG_NONE, 后面的"parse_tag_mem32"就没用了.

3, parse_tag_mem32()
该函数定义在"arch\arm\kernel\setup.c". 把bootloader传入的mem tag(ATAG_MEM)的start和size参数通过"arm_add_memory()"加入到meminfo的最后一个bank中. start是memory物理起始地址.

4, early_mem()
该函数定义在"arch\arm\kernel\setup.c". 处理cmdline中的"mem=size@start".
如果没有定义mem起始地址, 使用PHYS_OFFSET(arm中应由arm开发板设置)作为start. early_mem()会覆盖前面设置的meminfo.

呵呵, 你为什么会想到找这个? 我当初是板级移植u-boot到s3c2410时分析的代码, 当时还不知道sourceinsight, 用grep查找的

"arch\arm\mm\init.c"文件和这个好像没关系, 里面的"bootmem_init()"会根据这里设置的meminfo计算出high_memory. 系统物理memory会1:1映射到"AGE_OFFSET---high_memory-1".

评分

参与人数 1可用积分 +6 收起 理由
yidou + 6 good

查看全部评分

论坛徽章:
0
4 [报告]
发表于 2009-02-18 21:36 |只看该作者
哇,谢谢楼上大牛,说得很详细!
我找的过程跟你差不太多,有的步骤被我漏掉了^_^!

我的2440开发板,从Kconfig看,是属于mach-s3c2410体系的,用的是同样的源码。
我看内核参数中没有设置mem参数,于是打算在架构源码中找找,看哪里设置的。
同样,也发现了2413中的fixup,貌似有不少板子用这种方式在代码中硬编码内存容量,不过这种方法arm板子确实用得很少。

剩下的解析内核参数的源码,我就没有老兄看得那么详细了。老兄能不用SI,只用grep把源码看到这个份上,我实在是佩服得紧哪。

尽管现在问题仍未最终解决,指定内存容量的代码仍然没有找到,不过我会顺着你给的思路看下去的——看解析参数时如果没有设置mem参数,到底用什么值来作为默认值。

谢谢你!

论坛徽章:
0
5 [报告]
发表于 2009-02-18 21:39 |只看该作者
原帖由 lpzgbd 于 2009-2-18 19:15 发表
溺水的鱼。。。?


虽然貌似有些不知所云,不过我猜了个大概。
说来真是巧。我所在的一个qq群里,前两天有位“溺水的鱼”老兄,也问过这个类似的问题,当时没有在意。
这位大哥肯定把我误认为是他了吧。虽然认错了人,不过确实太巧了,哈哈。

论坛徽章:
5
6 [报告]
发表于 2009-02-18 22:41 |只看该作者

回复 #5 true_log 的帖子

还有这么巧的事情

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
7 [报告]
发表于 2009-02-19 10:15 |只看该作者
原帖由 yidou 于 2009-2-18 22:41 发表
还有这么巧的事情

相当巧了
有的群里的兄弟都在这里有马甲,都知道哪个是我,诶~~~!
等多搞点积分换马甲,嘿嘿
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP