PowerPC的MMU初始化

转自:http://blog.chinaunix.net/uid-24148050-id-2951898.html
 
【吾阅吾评】:

MMU具有虚拟地址和物理地址转换、内存访问权限保护等功能,这将使能Linux操作系统能单独为系统中的每个用户进程分配独立的内存空间并保证用户空间不能访问内核空间的


地址,为操作系统的虚拟内存管理模块提供硬件基础。


对于包含MMU的处理器而言,Linux系统提供了复杂的存储管理系统,使能进程所能访问的内存达到4GB。


Linux系统中,进程的4GB内存空间被划分为两部分---用户空间和内核空间。用户空间地址一般分布为0~3GB,这样,剩下的3-4GB为内核空间。


用户进程只能访问用户空间的虚拟地址,不能访问内核空间的虚拟地址。用户进程只有通过系统调用(代表用户进程在内核态执行)等方式才可以访问到内核空间。


每个进程的用户空间都是完全独立、互不相干的,用户进程各自有不同的页表。而内核空间由内核负责映射,它并不会跟着进程改变,是固定的。内核空间地址有自己


对应的页表,内核的虚拟空间独立于其它程序。

 

看uboot汇编,一看到MMU就头大。总算下狠心把MMU初始化搞的大致明白了
MMU初始化重要的有2个,TLB和LAW
    通过TLB,把EA(Effective address)转换为RA(Real Address)
    通过LAW,根据RA选择合适的controller,最终把RA(Real Address)放到地址总线上去
下面以MPC8560来举例

-------------------------- 格机格机格机格机格机格机 ------------------------------


Effective Address   -->     Virtual Address   -->    Real Address    -->  Bus Addess
    EA 有效地址                 VA 虚拟地址               RA 物理地址           总线地址
      32 bit                     41 bit                   32 bit          取决于地址总线位宽

下面是一张图,讲述了TLB把EA转换为RA的过程


第一步:根据 EA有效地址产生 VA虚拟地址。虚拟地址为 41位,构成如下:

bit[0], AS,地址空间域
    0 是和中断处理及系统级的代码和数据关联
    1 是应用程序的代码和数据 

    用户模式的程序运行时,一般 MSR[IS,DS]为 1,只允许访问应用程序的代码及数据地址空间。
    进入中断时,MSR[IS,DS]自带清 0,因此可以利用系统级的 TLB(TS=0)来访问中断处理相关的代码。 

bit[1-8],PID,进程标识符

    由 PID寄存器提供,多数操作系统都未实现,默认 0

bit[9-40] 即原来的 EA地址 (页表号+页内offset,)


第二步:根据虚拟地址匹配TLB,匹配过程如下:

V域为 1,当前 TLB项有效;
MSR[IS,DS]和 TLB表项的 TS域一致;
TID一致或者 TLB表达 TID为 0,全局共享;
由表项的SIZE域根据公式 n = 32–log2 (page size in bytes)计算虚拟地址中 EPN的值,然后和TLB的 EPN域进行匹配且匹配成功。

第三步,根据TLB生成 RA

TLB匹配成功后,将提取 TLB表的 RPN和 ERPN域,构成 RA物理实际地址的页编号部分,而页内偏移由 EA的低地址部分提供,相关构成如下:

RA = ERPN0:3 || RPN0:n–1 || EAn:31


第四步,匹配LAW,生成总线地址


用RA来检索LAW entry,下面是一个LAW的例子
 
比如命中了 PCI law entry,就会通过PCI的相关地址转换寄存器生成bus address总线地址,
然后送到PCI总线上

-------------------------- 格机格机格机格机格机格机 ------------------------------


EA(有效地址) ---> RA(物理地址) 
   由CPU的MMU来完成的,有些CPU core在uboot下是关闭MMU的,所以uboot中使用的 EA==RA

RA(物理地址) ---> EA(有效地址) 
   在linux操作系统中,此中转换是通过ioremap()来完成的 

-------------------------- 格机格机格机格机格机格机 ------------------------------

ppc e500 的 MMU 是无法关闭的。
所以在uboot中需要对其做初始化,基本原理是用一些静态数组的值来初始化 TLB 和 LAW 的 entry

    ######################## 文件 /uboot/cpu/mpc8560/start.S #################
    226 /* Invalidate MMU L1/L2 */
    227 li r2, 0x001e
    228 mtspr MMUCSR0, r2
    229 isync
    230
    232 / * Invalidate all TLB0 entries. 禁用所有TLB0的entry,只有4个 */
    234 li r3,4
    235 li r4,0
    236 tlbivax r4,r3
    241
    253 bl tlb1_entry  /* 注意,tlb1_entry 这个section可以看做一个数组,来描述TLB0和TLB1 */
    254 mr r5,r0       /* 注意,r0 里存的是第68行的 EA, 此EA里保存的是TLB entry数组大小 */
    255 li r1,0x0020   /* max 16 TLB1 plus some TLB0 entries */
    256 mtctr r1
    257 lwzu r4,0(r5) /* 从(r5中存的)EA中load值到r4中,现在r4里面存的是TLB entry 的个数*/
    258
    259 0: cmpwi r4,0  /* 循环初始化TLB entry了,每初始化一个,r4就减1,r4为0时跳转到第276行*/
    260 beq 1f
    261 lwzu r0,4(r5)   /* r5 在不断的增加4,即EA在不断的增加4,即在遍历TLB entry 数组 */
    262 lwzu r1,4(r5)
    263 lwzu r2,4(r5)
    264 lwzu r3,4(r5)
    265 mtspr MAS0,r0   /* 用从TLB entry 数组来初始化 TLB */
    266 mtspr MAS1,r1
    267 mtspr MAS2,r2
    268 mtspr MAS3,r3
    269 isync
    270 msync
    271 tlbwe
    272 isync
    273 addi r4,r4,-1
    274 bdnz 0b
    275
    276 1:
        /***** 省略 ****/
    299 /* set up local access windows, defined at board/<boardname>/init.S */
    300 lis r7,CFG_CCSRBAR@h
    301 ori r7,r7,CFG_CCSRBAR@l
    302
    303 bl law_entry      /* 注意,law_entry 这个section可以看做一个数组,来描述LAW */
    304 mr r6,r0          /* 注意,r0 里存的是第321行的 EA, 此EA里保存的是LAW entry数组大小*/
    305
    306 li r1,0x0009      /* 10 LAWs for MPC8548. */
    307 mtctr r1
    308 lwzu r5,0(r6)     /* 从(r6中存的)EA中load值到r5中,现在r5里面存的是TLB entry 的个数*/
    309
    310 li r2,0x0c28     /* the first pair is reserved for boot-over-rio-or-pci */
    311 li r1,0x0c30
    312
    313 0: cmpwi r5,0    /* 循环初始化LAW entry,每初始化一个,r5减1,r5为0时跳转到第325行 */
    314 beq 1f
    315 lwzu r4,4(r6)    /* 从(r6中存的)EA中load值, r6也跟着不断增加,即遍历LAW数组 r6 <-- r6+4 r4 <-- *(r6) */
    316 lwzu r3,4(r6)
    317 stwx r4,r7,r2    /* 写LAWBAR寄存器 *(r7+r2) <-- r4 */
    318 stwx r3,r7,r1
    319 addi r5,r5,-1
    320 addi r2,r2,0x0020 /* LAWBAR[0-7]寄存器的偏移量是0x0020 r2 <-- r2 + 0x0020 */
    321 addi r1,r1,0x0020
    322 bdnz 0b
    323
    324 /* Jump out the last 4K page and continue to 'normal' start */
    325 1: bl 3f
    326 b _start
    327
    328 3: li r0,0
    329 mtspr SRR1,r0 /* Keep things disabled for now */
    330 mflr r1
    331 mtspr SRR0,r1
    332 rfi
    ############### 文件 board/pq37pc/pq37pc_8560/init.S ########################
     49
     50 #define entry_start \
     51 mflr r1 ; \ /* LR的值(即bl tlb1_entry 的下一条指令的EA)保存到 r1 中(见上面第254行) */
     52 bl 0f ;     /* 直接跳到0处执行代码,起始就是符号entry_end处(见下面第55行) */
     53
     54 #define entry_end \
     55 0: mflr r0 ; \ /* 把LR的值(即bl 0f的下一条指令的EA) 存到 r0 中 (见下面第68行) */
     56 mtlr r1 ; \    /* 把r1的值放到LR中(是bl tlb1_entry的下一条指令的EA)
     57 blr ;          /* 跳转到LR处,即执行 bl tlb1_entry的下一条指令 (即第254行的地址) */
     58
     59
     60 .section .bootpg, "ax"
     61 .globl tlb1_entry
     62 tlb1_entry:
     63 entry_start
     64
     65 /*
     66 * Number of TLB0 and TLB1 entries in the following table
     67 */
     68 .long 21
     69
     70 #if (CFG_CCSRBAR_DEFAULT != CFG_CCSRBAR)
     78 .long TLB1_MAS0(0, 0, 0)
     79 .long TLB1_MAS1(1, 0, 0, 0, 0)
     80 .long TLB1_MAS2(E500_TLB_EPN(CFG_CCSRBAR_DEFAULT), 0,0,0,0,1,0,1,0)
     81 .long TLB1_MAS3(E500_TLB_RPN(CFG_CCSRBAR_DEFAULT), 0,0,0,0,0,1,0,1,0,1)
     82 #else
     83 #error("Update the number of table entries in tlb1_entry")
     84 #endif
     85
    /******** 省略其他的TLB配置(Data Cache,DDR、LocalBus等) *********/
    275
    276 entry_end
    295
    296 #define LAWBAR0 ((CFG_DDR_SDRAM_BASE>>12) & 0xfffff)
    297 #define LAWAR0 (LAWAR_EN | LAWAR_TRGT_IF_DDR | (LAWAR_SIZE & LAWAR_SIZE_2G))
    298
    302 #define LAWBAR3 ((CFG_RIO_MEM_BASE>>12) & 0xfffff)
    303 #define LAWAR3 (LAWAR_EN | LAWAR_TRGT_IF_LBC | (LAWAR_SIZE & LAWAR_SIZE_256M))
    304
    308 #define LAWBAR4 ((CFG_LBC_BASE_1>>12) & 0xfffff)
    309 #define LAWAR4 (LAWAR_EN | LAWAR_TRGT_IF_PCI | (LAWAR_SIZE & LAWAR_SIZE_512M))
    310
    313 #define LAWBAR5 ((CFG_LBC_BASE_3>>12) & 0xfffff)
    314 #define LAWAR5 (LAWAR_EN | LAWAR_TRGT_IF_LBC | (LAWAR_SIZE & LAWAR_SIZE_256M))
    315
    317 .section .bootpg, "ax"
    318 .globl law_entry
    319 law_entry:
    320 entry_start
    321 .long 0x04
    322 .long LAWBAR0,LAWAR0
    323 .long LAWBAR3,LAWAR3
    324 .long LAWBAR4,LAWAR4
    325 .long LAWBAR5,LAWAR5
    326 entry_end
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值