Eboot.bib中0x30000000到0x300020000内存的作用
Src/Bootloader/Eboot/boot.bib的memeory部分如下:
MEMORY
; Name Start Size Type
; ------- -------- -------- ----
ARGS 80020800 00000800 RESERVED
RAM 80021000 0000B000 RAM
STACK 8002c000 0000A000 RESERVED
EBOOT 80038000 00040000 RAMIMAGE
BINFS 80080000 00021000 RESERVED
针对这个配置,我记得在CSDN上有一个帖子提过这样一个问题(http://topic.csdn.net/u/20100729/17/273faa20-c905-435b-a7d4-102bbac4ff40.html):
0x3000_0000~0x3002_8000内存是用来做什么的?
后来我在WINCE600/PLATFORM/DEVICEEMULATOR/SRC/BOOTLOADER/EBOOT/boot.bib看到的memory部分如下:
MEMORY
; Name Start Size Type
; ------- -------- -------- ----
PTS 80000000 00020000 RESERVED
ARGS 80020000 00000800 RESERVED
SLEEPSTATE 80020800 00000800 RESERVED
EBOOT 80021000 00040000 RAMIMAGE
STACK 80061000 00004000 RESERVED
RAM 80065000 00006000 RAM
可以看出0x3000_0000~0x3002_0000内存是用于PTS的,什么是PTS呢?PTS是page table space的缩写,也即这段内存空间是用于存放页表的。
我们接下来看看S3C2443的/Src/Bootloader/Eboot/startup.s下面的代码
; Define RAM space for the Page Tables:
;
PHYBASE EQU 0x30000000 ; physical start
PTs EQU 0x30010000 ; 1st level page table address (PHYBASE + 0x10000)
; save room for interrupt vectors.
可以看出bootloader的startup函数构造的页表是存放在SDRAM的0x30010000开始的地址处,接着我们看看starup.s下面的代码
; Compute physical address of the OEMAddressTable.
20 add r11, pc, #g_oalAddressTable - (. + 8)
ldr r10, =PTs ; (r10) = 1st level page table
; Setup 1st level page table (using section descriptor)
; Fill in first level page table entries to create "un-mapped" regions
; from the contents of the MemoryMap array.
;
; (r10) = 1st level page table
; (r11) = ptr to MemoryMap array
add r10, r10, #0x2000 ; (r10) = ptr to 1st PTE for "unmapped space"
mov r0, #0x0E ; (r0) = PTE for 0: 1MB cachable bufferable
orr r0, r0, #0x400 ; set kernel r/w permission
25 mov r1, r11 ; (r1) = ptr to MemoryMap array
30 ldr r2, [r1], #4 ; (r2) = virtual address to map Bank at
ldr r3, [r1], #4 ; (r3) = physical address to map from
ldr r4, [r1], #4 ; (r4) = num MB to map
cmp r4, #0 ; End of table?
beq %f40结合g_oalAddressTable表,我们知道bootloader的startup函数所构造的页表首先需要覆盖0x80000000~0x9FFFFFFF范围的虚拟内存地址空间。这块虚拟内存空间纵容量是512MB,则对应着512个一级页表(对于WINCE操作系统而言,bootloader的虚拟内存设计并不是很复杂,它不涉及较为复杂的二级页表,只使用已1MB为单位的一级页表。),那么所需物理存储空间为2KB(因为需要4个字节来保存一个页表项),在S3C2443中实际使用的SDRAM地址为0x30012000~0x300127FF。此外startup函数还要为0xA000000~0xBFFFFFFF范围的虚拟内存地址构造一级页表项,这块虚拟内存地址空间在WINCE中被称作uncachable静态虚拟内存空间,这一部分的一级页表项占用SDRAM的0x30012800~0x30012FFF。
但关于页表是如何构建的,我目前不是很理解,需要继续学习。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/chinesedragon2010/archive/2010/08/08/5796534.aspx
Eboot.bib中0x30000000到0x300020000内存的作用相关推荐
- CE5.0 - romimage.exe如何填充eboot.bin中的pTOC特殊指针生成.nb0
eboot.bin和eboot.nb0的差别就是 eboot.bin中没有填充pTOC结构体,必须使用parser解释器[类似于romimage.exe luther.gliethttp]将全局变量数 ...
- 5 个 Android 开发中比较常见的内存泄漏问题及解决办法
Android开发中,内存泄漏是比较常见的问题,有过一些Android编程经历的童鞋应该都遇到过,但为什么会出现内存泄漏呢?内存泄漏又有什么影响呢? 在Android程序开发中,当一个对象已经不需要再 ...
- 【Linux 内核 内存管理】内存管理架构 ⑤ ( sbrk 内存分配系统调用代码示例 | 在 /proc/pid/maps 中查看进程堆内存详情 )
文章目录 一.sbrk 内存分配系统调用代码示例 二.在 /proc/pid/maps 中查看进程堆内存详情 本篇博客调用 sbrk 系统调用函数 , 申请并修改 堆内存 , 并在 /proc/pid ...
- 【Android 逆向】修改运行中的 Android 进程的内存数据 ( Android 系统中调试器进程内存流程 | 编译内存调试动态库以及调试程序 )
文章目录 一.Android 系统中调试器进程内存流程 二.编译内存调试动态库以及调试程序 三.博客资源 一.Android 系统中调试器进程内存流程 修改游戏运行中的内存 , 游戏运行之后 , 游戏 ...
- VS中查看子类对象内存分布的方法
文章目录 1 VS中查看子类对象内存分布的方法 1 VS中查看子类对象内存分布的方法 设置vs编译器: 在命令行中添加选项(打印指定类的内存分布):/d1 reportSingleClassLayou ...
- java 方法执行结束局部变量释放_JAVA-方法在执行过程中,JVM的内存分配和变化情况,栈(stack)的情况浅析...
方法在执行过程中,在JVM中的内存是如何分配的?内存是如何变化的? 一.方法只定义不调用,是不会被执行的,并且在JVM中也不会给该方法分配"运行所属"的内存空间.只有在调用这个方法 ...
- c++中堆、栈内存分配
转自:https://blog.csdn.net/qingtingchen1987/article/details/7698415 一个由C/C++编译程序占用内存分为以下几个部分 1.栈区(stac ...
- Windows 任务管理器中的几个内存概念
我们使用的大部分 PC 是基于 Intel 微处理器的 x86 和 x64 架构计算机. 因此, 我们面对的 windows 避免不了和 Intel 架构有些设计上的契合. 比如接下来要说到的内存管理 ...
- 操作系统核心原理-5.内存管理(中):分页内存管理
在上一篇介绍的几种多道编程的内存管理模式中,以交换内存管理最为灵活和先进.但是这种策略也存在很多重大问题,而其中最重要的两个问题就是空间浪费和程序大小受限.那么有什么办法可以解决交换内存存在的这些问题 ...
最新文章
- SpringBoot+Docker+Git+Jenkins实现简易的持续集成和持续部署
- Xilinx FFT IP core V9.0的介绍和使用
- SpringBoot中请求映射的原理(源码)
- 680. Valid Palindrome II
- html5做的太阳系
- Air Data System
- 1+X web中级 Laravel学习笔记——路由和控制器的简单使用
- 会玩!拼多多联手非诚勿扰“拼对象”:为2亿单身狗操碎了心
- 计算机中那些事儿(二):如何神操作你的电脑
- 在fedora linux中,wine 成功安装手记
- Impala中行转列在合并列
- C#串口编程测试收发
- NSString中如何正确判断包含一个变量字串NSString
- gfsk调制频谱_gfsk调制方式
- 小心!使用网页版的WhatsApp时,请选择隐私模式
- PMP知识点总结—质量功能展开(QFD)
- 几步操作即可实现WhatsApp群发
- android 高德静态地图api,静态地图-API文档-开发指南-Web服务 API | 高德地图API
- win10浏览器闪退_win10 ie浏览器闪退
- c++ lamber表达式
热门文章
- 动圈耳机振膜_耳机中的动圈、动铁、圈铁都是什么意思 买哪种最好?
- java中的排序算法——简单选择排序,树形选择排序与堆排序(一)
- windoes硬盘备份(数据迁移)的方法
- oralce 数据库监听日志状态及目录:查看监听(使用grid用户登陆):
- 服务器堡垒机登录方式
- namespace命名空间的理解C++
- python中怎么做分组问题_详解Python中的分组函数groupby和itertools)
- php 上个月天数,php日期所在月的天数_PHP教程
- Docker容器网络管理
- c语言i o编程,C 语言输入输出 (I/O)