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相关推荐

  1. WINCE6.0 + S3C2443的启动过程---nboot篇

    WINCE6.0 + S3C2443的启动过程---nboot篇 我们启动WINCE6.0的方式是:nboot+eboot+NK.那么是如何启动WINCE6.0系统映像的呢?首先是nboot把eboo ...

  2. WINCE6.0+S3C2443的启动过程---eboot1

    WINCE6.0+S3C2443的启动过程---eboot 我们知道从nboot把eboot从nandflash中拷贝到内存指定的地址后,就接着在这个地址处开始运行eboot了,之后,nboot的工作 ...

  3. WINCE6.0+S3C2443的启动过程---内核启动

    ********************************LoongEmbedded******************************** 作者:LoongEmbedded(kandi ...

  4. WINCE6.0+S3C2443的启动过程---eboot6

    ********************************LoongEmbedded******************************** 作者:LoongEmbedded(kandi ...

  5. WINCE6.0+S3C2443的启动过程---eboot5

    2.3.5 SD卡控制器的相关初始化 一个相关的帖子http://topic.csdn.net/u/20100812/16/d0d5108b-dce1-4535-9e15-6f87bad57e43.h ...

  6. WINCE6.0+S3C2443的启动过程---eboot2

    1.3系统时钟设置 我的另一篇博客介绍了S3C2443的时钟管理http://blog.csdn.net/chinesedragon2010/archive/2010/09/24/5903553.as ...

  7. WINCE6.0+S3C2443的启动过程---eboot4

    http://blog.csdn.net/chinesedragon2010/archive/2010/10/05/5922489.aspx 2 main函数 void main(void) { // ...

  8. WINCE6.0+S3C2443下的activesync问题

    ********************************LoongEmbedded******************************** 作者:LoongEmbedded(kandi ...

  9. 基于Windows 7旗舰版搭建WinCE6.0开发环境的过程

    首先感谢JeffreyLi提供了更简便的安装WinCE6.0 R3的方法,今天验证过了,确实比我之前整理的<WinCE6.0 R3的安装步骤>方便很多,十分感谢! 为了方便大家参考,重新整 ...

最新文章

  1. 我的理解:box-sizing
  2. python填写excel-Python向excel中写入数据的方法
  3. HSI颜色空间及其应用
  4. python编写星号菱形中间是空的_简单空实心图形打印|Python练习系列[3]
  5. java面向对象编程集合边框_Java学习系列(七)Java面向对象之集合框架详解(上)
  6. Debian GNU/Linux 9 将切换至 GCC6 编译器
  7. 实现才是目的——《大道至简》第六章读后感
  8. Apache配置HTTPS功能
  9. 5919. 所有子字符串中的元音
  10. (菜鸟入门)使用pytorch框架实现前馈神经网络
  11. 在d3中使用2D.js获取图形间的交点
  12. caffe---之eltwise层
  13. jenkins+saltstack+pipeline 部署springcloud 多模块jar包
  14. OpenCV-Python图像模糊处理
  15. noip2015初赛入围名单
  16. 【最佳实践】瀚高数据库安全版v4.5.8非root用户运行的安装配置
  17. 柯尼卡美能达C364e安装步骤(全)-柯美复印机如何装机-柯美C364e驱动安装-柯美复印机安装扫描
  18. NGUI制作Word图文混排效果
  19. html5 localstorage 生命周期,cookie、localStorage和sessionStorage 三者之间的区别以及存储、获取、删除等使用方式...
  20. Java卡开发相关专利

热门文章

  1. 027_html框架
  2. python re库函数_python re库的正则表达式学习笔记
  3. c#图片base64去转义字符_C# 将图片转成Base64字符串,再将字符串转成图片,然后将图片存储到服务器文件夹中,求代码。感激不尽...
  4. python3的socket_python2 与 python3 socket编程的一点小区别
  5. 汽车线束测试软件,Aigtek线束测试仪,汽车线束测试_高精度自动测试_操作简单...
  6. vbyone接口引脚定义_一文了解A、B、C、D、E 5 种HDMI接口类型!网友:今天总算明白了...
  7. python分解word文档为多个_将一个word文档按一页或多页拆分成多个文档
  8. Vcenter 管理中心 在服务器上新建虚拟机及安装系统
  9. 数据结构——图:极大小连通子图、图的存储结构、图的遍历
  10. nvidia显卡cuda的性能_性能追平上代万元旗舰!NVIDIA GeForce RTX 3070规格解析