FS4412裸机程序------uboot下的MMU验证

1、使用vim查看编译后的uboot目录中的u-boot.map文件,可以看出uboot的运行地址(加载地址)的起始地址为0xc3e0_0000,结束地址为0xc3f7_6578

在这里插入图片描述
在这里插入图片描述

2、从FS4412的原理图(FS4412_CoreBoard_V2)与Exynos4412的手册(Exynos(通用版)客户手册)可以看到1GB的DDR3在物理空间上的分布为0x4000_00000xA000_0000(共1.5GB),而uboot的起始地址为0xc3e0_0000,所以可以断定:uboot开启了MMU,将uboot的加载地址空间0xc3e0_00000xc3f7_6578映射到物理地址空间0x4000_0000~0xA000_0000的某个位置。

Exynos4412中有两个独立的DRAM控制器,分别叫DMC0和DMC1,可以接2组不同的DDR内存。DMC0和DMC1分别支持大1.5GB的DRAM,它们都支持DDR2/DDR3和LPDDR2等,512 Mb, 1 Gb, 2 Gb, 4 Gb and 8 Gbit的内存设备,支持16/32bit的位宽。DRAM0 对应的地址是0x4000_0000~0xAFFF_FFF共1.5GB,DRAM1 对应的地址是0xA000_000~0x0000_0000共1.5GB。
在这里插入图片描述
4412的1GB的DRAM是由4片大小为256M*16的DDR3芯片组合而成(查看芯片型号可以得到)
芯片型号:K4B4G1646B-HYXX

  • 第一位: K表示内存
  • 第二位:4表示flash类型 DRAM
  • 第三位:B表示DDR3
  • 第4~5位. Density(注:实际单位应该是bit,而不是Byte),我们的是4Gbit=4G/16(数据位)=256MByte
  • 第6~7位. organization:数据线引脚个数,我们的是16

分析完成,开发板上共有4片这样的内存芯片,总容量就是256M*4=1G
这四片DDR 芯片被分成了两两一组,组成32位数据,四片都是挂接到DMC0处,原理图如下:
在这里插入图片描述

3、从u-boot-2010.03-FS4412/board/samsung/fs4412/lowlevel_init.S文件中可以看到如果定义了宏“CONFIG_ENABLE_MMU”则会通过调用“enable_mmu”来启动MMU。

在这里插入图片描述
“mmu_table”决定了虚拟地址空间与物理地址空间的映射关系,fs4412中的uboot 是这样安排的:

#ifdef CONFIG_ENABLE_MMU

/*
 * MMU Table for SMDKC210
 * 0x0000_0000 -- 0x1FFF_FFFF => A:0x0000_0000 -- 0x1FFF_FFFF
 * 0x2000_0000 -- 0x3FFF_FFFF => Not Allowed
 * 0x4000_0000 -- 0x5FFF_FFFF => A:0x4000_0000 -- 0x5FFF_FFFF
 * 0x6000_0000 -- 0xBFFF_FFFF => Not Allowed
 * 0xC000_0000 -- 0xDFFF_FFFF => A:0x4000_0000 -- 0X5FFF_FFFF
 * 0xE000_0000 -- 0xFFFF_FFFF => Not Allowed
 */

    /* form a first-level section entry */
.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

.section .mmudata, "a"
    .align 14
    // the following alignment creates the mmu table at address 0x4000.
    .globl mmu_table
mmu_table:
    .set __base,0
    // Access for iRAM
.rept 0x200
FL_SECTION_ENTRY __base,3,0,0,0
.set __base,__base+1
.endr

// Not Allowed
.rept 0x400 - 0x200
.word 0x00000000
.endr

.set __base,0x400
// 512MB for SDRAM with cacheable
.rept 0x800 - 0x400
FL_SECTION_ENTRY __base,3,0,1,1
.set __base,__base+1
.endr

// access is not allowed.
.rept 0xc00 - 0x800
.word 0x00000000
.endr

.set __base,0x400
// 512MB for SDRAM with cacheable
.rept 0xE00 - 0xC00
FL_SECTION_ENTRY __base,3,0,1,1
.set __base,__base+1
 .endr

     // access is not allowed.
     .rept 0x1000 - 0xE00
     .word 0x00000000
     .endr

 #endif
4、物理地址与虚拟地址的对应关系

(1)0x0000_0000 – 0x1FFF_FFFF => A:0x0000_0000 – 0x1FFF_FFFF
共 512MB 的虚拟地址与物理地址空间完全一致,且一一对应,由 Exynos4412技术参数手册可知,除了 DDR 以外的物理地址空间,其它全部物理地址空间(包括 iROM:0x0000_0000 ~ 0x0001_0000、iROM MIRROR: 0x0200_0000 ~ 0x0201_0000、 iRAM: 0x0202_0000 ~ 0x0206_0000、……、SFR:0x1000_0000 ~ 0x1400_0000 等)都可以通过虚拟地址空间 0x0000_0000 – 0x1FFF_FFFF 来访问,因为是一致且一一对应,所以看起来与直接访问物理地址一样,但实际上中间隔了一层 MMU。
在这里插入图片描述
(2)0x2000_0000 – 0x3FFF_FFFF
因为没有 Exynos4412 没有 0x2000_0000 – 0x3FFF_FFFF 物理地址空间,所以uboot 不映射此虚拟地址空间,表示 0x2000_0000 – 0x3FFF_FFFF 虚拟地址空间不能访问。
(3)0x4000_0000 – 0x7FFF_FFFF => A:0x4000_0000 – 0x7FFF_FFFF
共 1024MB 的虚拟地址与物理地址空间完全一致,且一一对应,由Exynos4412 技术参数手册可知,0x4000_0000 – 0x7FFF_FFFF 的物理地址空间(共1GB)是 DMC-0 对应的物理地址空间 0x4000_0000 – 0x9FFF_FFFF(1.5GB)的一个子集,fs4412 的 1GB 的物理内存 DDR3 正在对应到 0x4000_0000 – 0x7FFF_FFFF,因为是一致且一一对应,所以看起来与直接访问物理地址一样,但实际上中间隔了一层 MMU。
(4)0x8000_0000 – 0xBFFF_FFFF
在 Exynos4412 的物理地址空间中 0x8000_0000 – 0x9FFF_FFFF 对应的是DMC-0 的高 512MB 的物理地址空间,但 fs4412 只在 DMC-0 接了 1GB 的 DDR3物理内存,所以 0x8000_0000 – 0x9FFF_FFFF 没有实际的物理存储器与之对应;同理,0xA000_0000 – 0xBFFF_FFFF 是 DMC-1 的低 512MB 的物理地址空间,fs4412 没有与物理地址空间 0xA000_0000 – 0xFFFF_FFFF(共 1.5GB)对应的物理存储器,所以 uboot 不映射 0x8000_0000 – 0xBFFF_FFFF 的虚拟地址空间,表示 0x8000_0000 – 0xBFFF_FFFF 的虚拟地址空间不能访问。
(5)0xC000_0000 – 0xDFFF_FFFF => A:0x4000_0000 – 0X5FFF_FFFF
0xC000_0000 – 0xDFFF_FFFF 共 512MB 的虚拟地址映射到物理地址空间0x4000_0000 – 0x5FFF_FFFF,由 Exynos4412 技术参数手册可知,0x4000_0000 --0x7FFF_FFFF 的物理地址空间(共 1GB)是 DMC-0 对应的物理地址空间0x4000_0000 – 0x9FFF_FFFF(1.5GB)的一个子集,fs4412 的 1GB 的物理内存DDR3 对应到 0x4000_0000 – 0x7FFF_FFFF,0x4000_0000 – 0x5FFF_FFFF 是这 1GBDDR3 内存中低 512MB,而虚拟地址空间 0xC000_0000 – 0xDFFF_FFFF 对应到了这一物理地址空间。
(6)0xE000_0000 – 0xFFFF_FFFF
Exynos4412 中的 0xE000_0000 – 0xFFFF_FFFF 物理地址空间对应的 DMC-1 的高 512MB 物理地址空间,因为 fs4412 没有实际物理存储器接到 DMC-1,所以0xE000_0000 – 0xFFFF_FFFF 物理地址空间不可访问,uboot 也不映射此虚拟地址空间,表示 0xE000_0000 – 0xFFFF_FFFF 虚拟地址空间不能访问。

5、宏“CONFIG_ENABLE_MMU”在 u-boot-2010.03-FS4412/include/configs/fs4412.h 中定义,默认是定义的,表示默认情况下 uboot 是开启 MMU 的,可以通过“#undef”取消此宏定义

在这里插入图片描述
另外 fs4412 的 uboot 的加载地址在 board\samsung\fs4412\config.mk 中有如下定义:
TEXT_BASE = 0xc3e00000
表示 uboot 要被加载到 0xc3e0_0000 地址上才能正确运行,由上述的映射关系可知,0xc3e0_0000 对应的物理地址为 0x43e0_0000,所以在 BL2 启动代码中应该有一段代码会将 uboot 从 SDCARD 或 eMMC 中拷贝到 0x43e00000 为起始地址的内存中去。

6、使用“go 70003000”来验证 MMU

(1)如果将u-boot-2010.03-FS4412/board/samsung/fs4412/lowlevel_init.S中的 MMU 映射关系修改为如下形式:

#ifdef CONFIG_ENABLE_MMU

/*
 * MMU Table for SMDKC210
 * 0x0000_0000 -- 0x1FFF_FFFF => A:0x0000_0000 -- 0x1FFF_FFFF
 * 0x2000_0000 -- 0x3FFF_FFFF => Not Allowed
 * 0x4000_0000 -- 0x5FFF_FFFF => A:0x4000_0000 -- 0x5FFF_FFFF
 * 0x6000_0000 -- 0xBFFF_FFFF => Not Allowed
 * 0xC000_0000 -- 0xDFFF_FFFF => A:0x4000_0000 -- 0X5FFF_FFFF
 * 0xE000_0000 -- 0xFFFF_FFFF => Not Allowed
 */

    /* form a first-level section entry */
.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

.section .mmudata, "a"
    .align 14
    // the following alignment creates the mmu table at address 0x4000.
    .globl mmu_table
mmu_table:
    .set __base,0
    // Access for iRAM
.rept 0x200
FL_SECTION_ENTRY __base,3,0,0,0
.set __base,__base+1
.endr

// Not Allowed
.rept 0x400 - 0x200
.word 0x00000000
.endr

.set __base,0x400
// 512MB for SDRAM with cacheable
.rept 0x600 - 0x400
FL_SECTION_ENTRY __base,3,0,1,1
.set __base,__base+1
.endr

// access is not allowed.
.rept 0xc00 - 0x600
.word 0x00000000
.endr

.set __base,0x400
// 512MB for SDRAM with cacheable
.rept 0xE00 - 0xC00
FL_SECTION_ENTRY __base,3,0,1,1
.set __base,__base+1
 .endr

     // access is not allowed.
     .rept 0x1000 - 0xE00
     .word 0x00000000
     .endr

 #endif

修改前:
在这里插入图片描述
修改后:
在这里插入图片描述
(2)由上面描述,0x70003000 应该不可以访问,在 uboot 中使用“dnw 70003000”下载 leds.bin 等裸机程序将会失败。
a.使用命令“./build_uboot.sh”重新编译uboot
在这里插入图片描述
b.编译完成
在这里插入图片描述
c.重新烧写uboot到SD卡
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
d.在uboot中通过“dnw 70003000”命令加载led.bin
在这里插入图片描述
e.在Ubuntu中使用dnw通过OTG线传输led.bin,提示无效地址“bad address”,说明uboot不能访问0x70003000
在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

后天必早起

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

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

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

打赏作者

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

抵扣说明:

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

余额充值