Chinaunix首页 | 论坛 | 博客
  • 博客访问: 111426
  • 博文数量: 6
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 360
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-28 10:01
文章分类

全部博文(6)

文章存档

2011年(1)

2008年(5)

我的朋友

分类:

2008-03-06 22:00:36

文件: Bootloader.rar
大小: 6KB
下载: 下载
BootLoader,step1:

为了后面的叙述方便,这里把所安排的 RAM 空间范围的大小记为:stage2_size(字节),把起始地址和终止地址分别记为:stage2_start stage2_end(这两个地址均以 4 字节边界对齐)。因此:

stage2_endstage2_startstage2_size

另外,还必须确保所安排的地址范围的的确确是可读写的 RAM 空间,因此,必须对你所安排的地址范围进行测试。具体的测试方法可以采用类似于 blob 的方法,也即:以 memory page 为被测试单位,测试每个 memory page 开始的两个字是否是可读写的。为了后面叙述的方便,我们记这个检测算法为:test_mempage,其具体步骤如下:

1 先保存 memory page 一开始两个字的内容。

2 向这两个字中写入任意的数字。比如:向第一个字写入 0x55,第 2 个字写入 0xaa

3 然后,立即将这两个字的内容读回。显然,我们读到的内容应该分别是 0x55 0xaa。如果不是,则说明这个 memory page 所占据的地址范围不是一段有效的 RAM 空间。

4 再向这两个字中写入任意的数字。比如:向第一个字写入 0xaa,第 2 个字中写入 0x55

5 然后,立即将这两个字的内容立即读回。显然,我们读到的内容应该分别是 0xaa 0x55。如果不是,则说明这个 memory page 所占据的地址范围不是一段有效的 RAM 空间。

6 恢复这两个字的原始内容。测试完毕。

为了得到一段干净的 RAM 空间范围,我们也可以将所安排的 RAM 空间范围进行清零操作。”

 

这段汇编应该怎么写?我试着写了一些,近乎是伪代码,因为ARM汇编实在是不熟啊:

MEMPAGE EQU 0x4 ;0x4为步长

test_mempage:

ldr r0, =stage2_start ;stage2_start是内存开始地址 

loop:

       ldr r1, [r0], #0x4

       ldr r2, [r0], #0x8

       mov r0+#0x4, 0x55

       mov r0+#0x8, 0xaa

       ldr r3, [r0], #0x4

       ldr r4, [r0], #0x8

       cmp r3, #0x55

       bne error

       cmp r4, #0xaa

       bne error

 

mov r0+#0x4, 0xaa

       mov r0+#0x8, 0x55

       ldr r3, [r0], #0x4

       ldr r4, [r0], #0x8

       cmp r3, #0xaa

       bne error

       cmp r4, #0x55

       bne error

       add r0, r0, #MEMPAGE

       b loop

error:

       //…..

 

阅读(1675) | 评论(4) | 转发(0) |
给主人留下些什么吧!~~

forl2008-03-13 08:09:24

.text .globl testram @ r0 = address to test @ returns r0 = 0 - ram present, r0 = 1 - no ram @ clobbers r1 - r4 testram: ldmia r0, {r1, r2} @ store current value in r1 and r2 mov r3, #0x55 @ write 0x55 to first word mov r4, #0xaa @ 0xaa to second stmia r0, {r3, r4} ldmia r0, {r3, r4} @ read it back teq r3, #0x55 @ do the values match teqeq r4, #0xaa bne bad @ oops, no mov r3, #0xaa @

chinaunix网友2008-03-08 23:51:10

这段代码不能光从字面上所理解的那样去写

chinaunix网友2008-03-07 15:07:14

另外,步长需要大一点,这样速度太慢了,现在的内存都是KB的整数倍,或是MB的整数倍,没必要取这么小。

chinaunix网友2008-03-07 14:57:07

呵呵,汇编不熟可以用C写嘛!