您的位置:首页 > 其它

kernel中如何读取内存的大小和地址

2015-10-06 22:11 579 查看

目录

目录

内存信息的传递方式
什么是DDR

内存信息的传递

代码阅览
文件列表

代码块

本文中所有的描述都是基于高通平台,并且涉及的所有的操作都是在手机上完成

内存信息的传递方式

什么是DDR

  

  本文并不对DDR具体的物理特性做详细解读, 我们只需要了解如下的一些基本概念, 就能够满足对本文描述的核心内容的理解的需求.

  1. 和LCD, TP等常规器件一样, DDR也是手机中必不可少的器件之一

  2. 我们平时常说的内存, 从目前大部分机器来看, 指的就是DDR, 只不过对于这种需要重点考虑功耗的产品来说, 我们加了LP(low power低功耗)的DDR前面, 也就是LPDDR.

  3. 全称Double Rate Synchronous Dynamic Random Access Memory, wiki翻译过来就是双倍数据率同步动态随机存取存储器.

  4. 就一般意义来说所有的程序软件必须依靠内存才能运行, 此器件非常重要!

内存信息的传递

  就像上面所述, 内存虽然必不可少, 但归根结底就是一种手机器件, 和其他器件一样, 同样需要初始化, 只不过比其他的器件初始早而已.

  就高通平台而言, 如下图所示, 内存信息的传递如下:

Created with Raphaël 2.1.0开始内存初始化(sbl) lk中读取信息修改dtkernel中读取dt信息,读取内存大小和地址结束

在内存没有初始化完成前, 内存是不能使用的, 这时候系统的启动程序运行在片上RAM中, 而此时的启动过程在高通平台我们称之为sbl阶段. DDR器件就是在这一阶段中完成的初始化.

在初始化完成后, 内存的信息存储在共享内存(从内存中单独划分一块作为SMEM)中, 以供lk使用. 在sbl结束后, 会将lk的image从EMMC(对比PC可以理解为硬盘) 加载到内存中运行, 然后lk通过共享内存来读取器件信息.

读取出了信息后, 在lk中, 需要对device tree (dt image中的数据) 进行修改, 因为当前的高通平台lk和kernel的沟通不再是atags, 而变成了device tree.

lk结束运行后, 系统启动到了kernel, kernel再通过读取device tree的信息将内存的信息读取出来进行管理.

代码阅览

文件列表

  下面的表, 按照顺序从lk更新dt, 到kernel读取dt列出了相应的代码实现文件和函数.

  

顺序阶段文件名函数名
1lkaboot.cboot_linux
2lkdev_tree.cupdate_device_tree
3lkmeminfo.ctarget_dev_tree_mem
4lkdev_tree.cdev_tree_add_mem_info
5kernelsetup.csetup_arch
6kernelsetup.csetup_machine_fdt
7kernelfdt.cearly_init_dt_scan
8kernelfdt.cearly_init_dt_scan_memory

代码块

  下面的两块代码实际上是两部分, 一部分是lk中修改dt, 一部分是kernel中读取dt: (下面的代码是经过精简的, 只反映了程序运行的流程)

lk中修改dt

信息安全代码略 见上表 4

kernel中读取dt信息

信息安全代码略 见上表 7
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  内存 kernel DDR