WINCE6.0+S3C2443的启动过程---eboot3
1.6
OEMAddresstable只是用来初始化一级页表,就是所谓的段(section)描述,每个段是1MB,分为4096个段,总共4G——虚拟内存空间4G就是由此而来。
并且这个OEMAddresstable可以用在查表法中用来转换虚拟地址、物理地址(相互转换都可以)。
PTs(pointer to section)的相关定义如下:
; Define RAM space for the Page Tables:
;
PHYBASE EQU 0x30000000 ; physical start
PTs EQU 0x30010000 ; 1st level page table address (PHYBASE + 0x10000)
PTs保存在物理内存中的地址是0x30010000 ,上图的301行的0x2000是什么意义呢?我们知道没有缓存的虚拟地址起始地址是0x80000000,那这个虚拟地址对应的物理地址是多少呢?根据VA映射到PA的规则,见下图:
从0x80000000中取出[31:20]位,也即0x800来左移2位之后(0x2000,这个就是上面这个值的来由)加上translation base(在这里是PTs),也即上图add r10, r10, #0x2000这行语句的意义,执行这行语句之后r0=0x30012000,这就是计算了4G虚拟地址空间中从0x80000000地址开始的虚拟地址对应的物理起始地址是0x30012000,也就是section base address=0x30012000。
PTE:pointer to enter
接下来
我们知道r1指向g_oalAddressTable,假如g_oalAddressTable的定义如下:
g_oalAddressTable
[ {TRUE}
DCD 0x80000000, 0x30000000, 128 ; 128 MB DRAM BANK 6
…………………………
DCD 0x00000000, 0x00000000, 0 ; end of table
]
那么上面语句的307到309行就是实现 (r2)=0x80000000,(r3=0x30000000)和(r4=128)这些功能,而311行就是用于判断在建立一级页表是否完成,如果完成,也即cacheable地址0x80000000~0xa0000000这段虚拟内存映射的物理内存创建完毕,就跳到下面标号为40的地方开始执行;如果没有完成,会接下来执行。
ldr r5, =0x1FF00000
and r2, r2, r5 ; VA needs 512MB, 1MB aligned.
因为是对0x80000000~0xa0000000这段虚拟内存映射(512MB),并且是要求1MB对齐的,所以需要用0x1FF00000来保证。
ldr r5, =0xFFF00000
and r3, r3, r5 ; PA needs 4GB, 1MB aligned.
对PA物理地址进行4G对齐。
add r2, r10, r2, LSR #18
add r0, r0, r3 ; (r0) = PTE for next physical page
获取下一个物理页的入口地址。
35 str r0, [r2], #4
add r0, r0, #0x00100000 ; (r0) = PTE for next physical page
1M递增,因为1<<18=256K,而每一个pte描述4k页,所以最终描述256k*4k=1M地址空间
sub r4, r4, #1 ; Decrement number of MB left
cmp r4, #0
bne %b35 ; Map next MB
遍历到该region结束
bic r0, r0, #0xF0000000 ; Clear Section Base Address Field
bic r0, r0, #0x0FF00000 ; Clear Section Base Address Field
清空r0中的地址信息
b %b30 ; Get next element
继续创建oemaddrtab_cfg.inc描述的下一region
40 tst r0, #8
bic r0, r0, #0x0C ; clear cachable & bufferable bits in PTE
add r10, r10, #0x0800 ; (r10) = ptr to 1st PTE for "unmapped uncached space"
bne %b25 ; go setup PTEs for uncached space
sub r10, r10, #0x3000 ; (r10) = restore address of 1st level page table
; 1. Setup mmu to map (VA == 0) to (PA == 0x30000000).
; 1-1. cached area.
ldr r0, =PTs ; PTE entry for VA = 0
ldr r1, =0x3000040E ; cache/buffer/rw, PA base == 0x30000000
;ldr r1, =0x30000402 ; cache/buffer/rw, PA base == 0x30000000
str r1, [r0]
; 1-2. uncached area.
add r0, r0, #0x0800 ; PTE entry for VA = 0x0200.0000 , uncached
ldr r1, =0x30000402 ; uncache/unbuffer/rw, base == 0x30000000
str r1, [r0]
; Comment:
; The following loop is to direct map RAM VA == PA. i.e.
; VA == 0x30XXXXXX => PA == 0x30XXXXXX for S3C2400
; Fill in 8 entries to have a direct mapping for DRAM
;
ldr r10, =PTs ; restore address of 1st level page table
ldr r0, =PHYBASE
add r10, r10, #(0x3000 / 4) ; (r10) = ptr to 1st PTE for 0x30000000
add r0, r0, #0x1E ; 1MB cachable bufferable
orr r0, r0, #0x400 ; set kernel r/w permission
mov r1, #0
mov r3, #64
45 mov r2, r1 ; (r2) = virtual address to map Bank at
cmp r2, #0x20000000:SHR:BANK_SHIFT
add r2, r10, r2, LSL #BANK_SHIFT-18
strlo r0, [r2]
add r0, r0, #0x00100000 ; (r0) = PTE for next physical page
subs r3, r3, #1
add r1, r1, #1
bgt %b45
ldr r10, =PTs ; (r10) = restore address of 1st level page table
一级页表的映射关系建立完成之后,要把一级页表的基地址保存会r10中。
; The page tables and exception vectors are setup.
; Initialize the MMU and turn it on.
mov r1, #1
mcr p15, 0, r1, c3, c0, 0 ; setup access to domain 0
mcr p15, 0, r10, c2, c0, 0
mcr p15, 0, r0, c8, c7, 0 ; flush I+D TLBs
mrc p15,0,r1,c1,c0,0
orr r1, r1, #0x0071 ; Enable: MMU
orr r1, r1, #0x0004 ; Enable the cache
ldr r0, =VirtualStart
cmp r0, #0 ; make sure no stall on "mov pc,r0" below
mcr p15, 0, r1, c1, c0, 0
mov pc, r0 ; & jump to new virtual address
nop
; MMU & caches now enabled.
; (r10) = physcial address of 1st level page table
;
VirtualStart
mov sp, #0x80000000 ; have to be modefied. refer oemaddrtab_cfg.inc, DonGo
add sp, sp, #0x30000 ; arbitrary initial super-page stack pointer
注意0x80000000+0x30000=0x80030000,不能超过eboot/boot.bib中下面
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
对stack中指定的值,也即0x8002c000+0x0000A000=0x80036000,其对应的物理地址是0x30036000,也即0x80000000+0x30000的值要在0x3002c000~0x30036000之间。
b main
到这里就跳转到eboot的main函数了。
ENTRY_END
WINCE6.0+S3C2443的启动过程---eboot3相关推荐
- WINCE6.0 + S3C2443的启动过程---nboot篇
WINCE6.0 + S3C2443的启动过程---nboot篇 我们启动WINCE6.0的方式是:nboot+eboot+NK.那么是如何启动WINCE6.0系统映像的呢?首先是nboot把eboo ...
- WINCE6.0+S3C2443的启动过程---eboot1
WINCE6.0+S3C2443的启动过程---eboot 我们知道从nboot把eboot从nandflash中拷贝到内存指定的地址后,就接着在这个地址处开始运行eboot了,之后,nboot的工作 ...
- WINCE6.0+S3C2443的启动过程---内核启动
********************************LoongEmbedded******************************** 作者:LoongEmbedded(kandi ...
- WINCE6.0+S3C2443的启动过程---eboot6
********************************LoongEmbedded******************************** 作者:LoongEmbedded(kandi ...
- WINCE6.0+S3C2443的启动过程---eboot5
2.3.5 SD卡控制器的相关初始化 一个相关的帖子http://topic.csdn.net/u/20100812/16/d0d5108b-dce1-4535-9e15-6f87bad57e43.h ...
- WINCE6.0+S3C2443的启动过程---eboot2
1.3系统时钟设置 我的另一篇博客介绍了S3C2443的时钟管理http://blog.csdn.net/chinesedragon2010/archive/2010/09/24/5903553.as ...
- WINCE6.0+S3C2443的启动过程---eboot4
http://blog.csdn.net/chinesedragon2010/archive/2010/10/05/5922489.aspx 2 main函数 void main(void) { // ...
- WINCE6.0+S3C2443下的activesync问题
********************************LoongEmbedded******************************** 作者:LoongEmbedded(kandi ...
- 基于Windows 7旗舰版搭建WinCE6.0开发环境的过程
首先感谢JeffreyLi提供了更简便的安装WinCE6.0 R3的方法,今天验证过了,确实比我之前整理的<WinCE6.0 R3的安装步骤>方便很多,十分感谢! 为了方便大家参考,重新整 ...
最新文章
- 我的理解:box-sizing
- python填写excel-Python向excel中写入数据的方法
- HSI颜色空间及其应用
- python编写星号菱形中间是空的_简单空实心图形打印|Python练习系列[3]
- java面向对象编程集合边框_Java学习系列(七)Java面向对象之集合框架详解(上)
- Debian GNU/Linux 9 将切换至 GCC6 编译器
- 实现才是目的——《大道至简》第六章读后感
- Apache配置HTTPS功能
- 5919. 所有子字符串中的元音
- (菜鸟入门)使用pytorch框架实现前馈神经网络
- 在d3中使用2D.js获取图形间的交点
- caffe---之eltwise层
- jenkins+saltstack+pipeline 部署springcloud 多模块jar包
- OpenCV-Python图像模糊处理
- noip2015初赛入围名单
- 【最佳实践】瀚高数据库安全版v4.5.8非root用户运行的安装配置
- 柯尼卡美能达C364e安装步骤(全)-柯美复印机如何装机-柯美C364e驱动安装-柯美复印机安装扫描
- NGUI制作Word图文混排效果
- html5 localstorage 生命周期,cookie、localStorage和sessionStorage 三者之间的区别以及存储、获取、删除等使用方式...
- Java卡开发相关专利
热门文章
- 027_html框架
- python re库函数_python re库的正则表达式学习笔记
- c#图片base64去转义字符_C# 将图片转成Base64字符串,再将字符串转成图片,然后将图片存储到服务器文件夹中,求代码。感激不尽...
- python3的socket_python2 与 python3 socket编程的一点小区别
- 汽车线束测试软件,Aigtek线束测试仪,汽车线束测试_高精度自动测试_操作简单...
- vbyone接口引脚定义_一文了解A、B、C、D、E 5 种HDMI接口类型!网友:今天总算明白了...
- python分解word文档为多个_将一个word文档按一页或多页拆分成多个文档
- Vcenter 管理中心 在服务器上新建虚拟机及安装系统
- 数据结构——图:极大小连通子图、图的存储结构、图的遍历
- nvidia显卡cuda的性能_性能追平上代万元旗舰!NVIDIA GeForce RTX 3070规格解析