u-boot之内存地址映射

总结

  1. 本篇主要分析内存地址映射
  2. ARM的段式映射中长度为1MB,那我们整个4G范围内需要4G/1MB=4096个映射单元

代码

1. 内存地址映射1

.macro FL_SECTION_ENTRY base,ap,d,c,b
	.word (\base << 20) | (\ap << 10) | \
	      (\d << 5) | (1<<4) | (\c << 3) | (\b << 2) | (1<<1)
.endm
mmu_table:
	.set __base,0
	// Access for iRAM
	.rept 0x100
	FL_SECTION_ENTRY __base,3,0,0,0
	.set __base,__base+1
	.endr
  • .rept.endr是一对特征体0x100就是十进行的256,因此循环了256次,则这一段共256MB
  • FL_SECTION_ENTRY宏的前20位设置基地址
  • 循环体中,__base初始为0,然后加1再进入FL_SECTION_ENTRY,类推。
  • .rept 0x100可以看成.rept 0x100 - 0x0,则映射的虚拟地址为0到0x10000000
  • 物理地址从0开始,直到0x1000000,因此映射的虚拟地址等于真实地址
  • 每执行一次左移20位 (10位是K,20位是M),因此从0到0x100,base和地址的对应关系如下
addressbase
00
0x001000001
0x002000002
0x003000003
0x004000004
…………
0x10000000256(0x100)

2. 内存地址映射2

// Not Allowed
.rept 0x200 - 0x100
.word 0x00000000
.endr
  • 循环了0x200-0x100=0x100(256)次,则映射了256MB
  • 映射的256MB的虚拟地址对应物理地址的0地址

3. 内存地址映射3

.set __base,0x200
// should be accessed
.rept 0x600 - 0x200
FL_SECTION_ENTRY __base,3,0,1,1
.set __base,__base+1
.endr
  • 映射了1G(0x400)的内存空间
  • 物理地址和虚拟地址都是从0x20000000开始至0x60000000

4. 内存地址映射4

.rept 0x800 - 0x600
.word 0x00000000
.endr
  • 映射了512MB(0x200)的空间到0地址

5. 内存地址映射5

.set __base,0x800
.rept 0xb00 - 0x800
FL_SECTION_ENTRY __base,3,0,0,0
.set __base,__base+1
.endr
  • 映射了768MB(0x300)的内存空间
  • 物理地址和虚拟地址都是从0x80000000至0xb0000000

6. 内存地址映射6

.set __base,0xB00
.rept 0xc00 - 0xb00
FL_SECTION_ENTRY __base,3,0,0,0
.set __base,__base+1
.endr
  • 映射了256MB(0x100)内存空间
  • 物理地址和虚拟地址都是从0xb0000000开始至0xc0000000

7.内存地址映射7

// 0xC000_0000映射到0x2000_0000
.set __base,0x300
//.set __base,0x200
// 256MB for SDRAM with cacheable
.rept 0xD00 - 0xC00
FL_SECTION_ENTRY __base,3,0,1,1
.set __base,__base+1
.endr
  • 映射了256MB(0x100)内存空间
  • 物理地址从0x30000000到0x40000000
  • 虚拟地址从0xc0000000到0xd0000000

8.内存地址映射8

set __base,0xD00
.rept 0x1000 - 0xD00
FL_SECTION_ENTRY __base,3,0,0,0
.set __base,__base+1
.endr
  • 映射了768MB(0x300)内存空间
  • 物理地址和虚拟地址都是从0xd0000000到0x1000000000

总结

虚拟地址(16进制)物理地址(16进制)长度
0-100000000-10000000256MB
10000000-200000000256MB
20000000-6000000020000000-600000001GB
60000000-800000000512MB
80000000-b000000080000000-b0000000768MB
b0000000-c0000000b0000000-c0000000256MB
c0000000-d000000030000000-40000000256MB
d0000000-100000000d0000000-0x100000000768MB
  • 因此此MMU的功能只是把虚拟地址的0xc0000000-0xd0000000映射到0x30000000-0x40000000
  • 除了两段不能访问的虚拟地址之外都和物理地址相同
  • 物理地址中的30000000-40000000做了两次映射,因此在此uboot中,虚拟地址30000000-40000000与c0000000-d0000000是同一段地址,只不过可能处在不同的板载芯片中。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贱贱的剑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值