分类:
2008-03-06 22:00:36
BootLoader,step1:
文件:
Bootloader.rar
大小:
6KB
下载:
下载
“为了后面的叙述方便,这里把所安排的 RAM 空间范围的大小记为:stage2_size(字节),把起始地址和终止地址分别记为:stage2_start 和 stage2_end(这两个地址均以 4 字节边界对齐)。因此:
stage2_end=stage2_start+stage2_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:
//…..
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 @