U-Boot内存管理

 如《

 

U-Boot PowerPC内存管理

下图是PowerPC e500的MMU结构框图。

MMU地址映射过程中涉及到3种地址形式:

  1. 32位有效地址EA:软件可以直接访问的地址;
  2. 41位虚拟地址VA:经过段映射的过渡地址,由32位EA和AS以及8位PID位组成;
  3. 36位物理地址RA:也称为实地址,由36位地址总线访问的地址空间。

PID0-2 用来存放当前进程有效地址的进程ID号,主要作用是在进程上下文切换时,提高TLB刷新的精准性。

LAW(Local Access Window) 用于描述PowerPC处理器物理地址空间的划分,其中LAWBAR用于指定基址,LAWAR用于指定此空间用作PCI、Local Bus还是DDR等设备的空间。

e500支持2种形式的TLB:TLB0和TLB1。

TLB0支持固定4K页大小映射,512个entry最大可以映射512*4K=2M的物理地址空间,需要动态更新,会产生TLB miss异常。TLB0灵活,可以满足复杂系统应用的要求。
TLB1 是一种段式映射,有效地址和物理地址之间是一一对应的关系。TLB1支持可变页大小映射,16个entry 支持4K~4G页大小的映射,最大可映射16*4G =64G的物理地址空间,不需要动态更新,不会产生TLB miss异常。TLB1不够灵活,无法满足复杂系统应用的要求。

PowerPC e500核心的MMU是无法跳过的,所以只能通过MMU来映射地址空间。虽然MMU中的TLB1段式映射不够灵活,但是简单,可以满足U-Boot中的内存固定映射需求。PowerPC对内存虚实地址映射的处理是先设置DDR内存的物理地址(LAW),再把虚拟地址到物理地址的映射关系写到TLB1中。

相关代码实现:

复制代码
phys_size_t fixed_sdram(void) { // ... 初始化DDR配置参数ddr_cfg_regs    ddr_size = (phys_size_t) CONFIG_SYS_SDRAM_SIZE * 1024 * 1024;     fsl_ddr_set_memctl_regs(&ddr_cfg_regs, 0);      if (set_ddr_laws(CONFIG_SYS_DDR_SDRAM_BASE, ddr_size,                     LAW_TRGT_IF_DDR_1) < 0) {         printf("ERROR setting Local Access Windows for DDR\n");         return 0;     }      return ddr_size; }  unsigned int setup_ddr_tlbs_phys(phys_addr_t p_addr, unsigned int memsize_in_meg) {  /// ... 计算size    for (i = 0; size && i < 8; i++) { /// ... 计算ram_tlb_address, p_addr,  ram_tlb_index, tlb_size         set_tlb(1, ram_tlb_address, p_addr,             MAS3_SX|MAS3_SW|MAS3_SR, wimge,             0, ram_tlb_index, tlb_size, 1);     }      return memsize_in_meg; }  unsigned int setup_ddr_tlbs(unsigned int memsize_in_meg) {     return         setup_ddr_tlbs_phys(CONFIG_SYS_DDR_SDRAM_BASE, memsize_in_meg); }
复制代码

 

U-Boot MIPS内存管理

MIPS的虚拟地址空间分为多个段,即Kseg0-3和Kuseg。其中kseg0/kseg1可以跳过MMU,支持直接映射,各512MB。kseg2/3和Kuseg必须经过MMU。

因为U-Boot阶段对内存的需求量很小,512MB内存空间已足够满足需要,所以MIPS对内存虚实地址映射的处理是先设置好DDR内存的物理地址BAR,把其虚拟地址设置到kseg0/1即可。没有必要经过MMU和TLB。换句话说,如果CPU需要访问高于512M的DDR内存物理地址空间,必须通过MMU地址转换。

 

相关代码实现:

复制代码
#define mem_map(x) (void *)(CAC_BASE + (x))
复制代码

 

U-Boot ARMv8内存管理

 ARMv8的MMU结构如下图,其支持:

  • L1指令TLB,全相连,48个entry,支持4KB, 64KB和1MB页面大小;
  • L1数据TLB,全相连,32个entry,支持4KB, 64KB和1MB页面大小;
  • L2 TLB,4路组相连,1024个entry,支持4KB, 64KB和1MB页面大小;
  • page table 查找由MMU中的Translation Control Unit (TCU) 硬件实现;

关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信