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列出了相应的代码实现文件和函数.顺序 | 阶段 | 文件名 | 函数名 |
---|---|---|---|
1 | lk | aboot.c | boot_linux |
2 | lk | dev_tree.c | update_device_tree |
3 | lk | meminfo.c | target_dev_tree_mem |
4 | lk | dev_tree.c | dev_tree_add_mem_info |
5 | kernel | setup.c | setup_arch |
6 | kernel | setup.c | setup_machine_fdt |
7 | kernel | fdt.c | early_init_dt_scan |
8 | kernel | fdt.c | early_init_dt_scan_memory |
代码块
下面的两块代码实际上是两部分, 一部分是lk中修改dt, 一部分是kernel中读取dt: (下面的代码是经过精简的, 只反映了程序运行的流程)lk中修改dt
信息安全代码略 见上表 4
kernel中读取dt信息
信息安全代码略 见上表 7
相关文章推荐
- 神器SystemTap
- IE7降低内存和降低CPU的几个技巧
- 如何高效的使用内存
- DOS下内存的配置
- XP/win2003下发现1G的内存比512M还慢的解决方法
- PowerShell实现动态获取当前脚本运行时消耗的内存
- C#实现把dgv里的数据完整的复制到一张内存表的方法
- SQL语句实现查询SQL Server内存使用状况
- C语言内存对齐实例详解
- 深入学习C语言中memset()函数的用法
- 全局变量与局部变量在内存中的区别详细解析
- VB读取线程、句柄及写入内存的API代码实例
- php运行提示:Fatal error Allowed memory size内存不足的解决方法
- IE浏览器IFrame对象内存不释放问题解决方法
- C#之CLR内存深入分析
- JavaScript 变量、作用域及内存
- JavaScript避免内存泄露及内存管理技巧
- J2ME编程中的几个重要概念介绍
- c++实现逐行读取配置文件写入内存的示例
- Shell脚本查看进程内存真实占用情况