s3c6410_MMU地址映射过程详述

发布者:MysticJourney最新更新时间:2024-09-04 来源: cnblogs关键字:s3c6410  MMU  地址映射 手机看文章 扫描二维码
随时随地手机看文章

参考:


1)《ARM1176 JZF-S Technical Reference Manual》:


Chapter 3 System Control Coprocessor


Chapter 6 Memory Management Unit


2)u-boot源码:


u-boot-x.x.x/cpu/s3c64xx/start.S


u-boot-x.x.x/board/samsung/smdk6410/lowlevel_init.S


1. ARMv6 MMU简述


1)MMU由协处理器CP15控制;


2)MMU功能:地址映射(VA->PA),内存访问权限控制;


3)虚拟地址到物理地址的转换过程:Micro TLB->Main TLB->Page Table Walk


参考《ARM1176 JZF-S Technical Reference Manual》6.3节,Memory access sequence


摘录参考手册中的一段描述:


When the processor generates a memory access, the MMU:

1. Performs a lookup for a mapping for the requested virtual address and current ASID and 

   current world, Secure or Non-secure, in the relevant Instruction or Data MicroTLB.

2. If step 1 misses then a lookup for a mapping for the requested virtual address and current 

   ASID and current world, Secure or Non-secure, in the main TLB is performed.


If no global mapping, or mapping for the currently selected ASID, or no matching NSTID, for 

the virtual address can be found in the TLBs then a translation table walk is automatically 

performed by hardware, unless Page Table Walks are disabled by the PD0 or PD1 bits in the 

TTB Control register, that cause the processor to return a Section Translation fault. See 

Hardware page table translation on page 6-36.


If a matching TLB entry is found then the information it contains is used as follows:

1. The access permission bits and the domain are used to determine if the access is permitted. 

   If the access is not permitted the MMU signals a memory abort, otherwise the access is 

   enabled to proceed. Memory access control on page 6-11 describes how this is done.

2. The memory region attributes control the cache and write buffer, and determine if the 

   access is Secure or Non-secure cached, uncached, or device, and if it is shared, as Memory 

   region attributes on page 6-14 describes.

3. The physical address is used for any access to external or tightly coupled memory to 

   perform Tag matching for cache entries.


2. 址映射过程详述


参考《ARM1176 JZF-S Technical Reference Manual》6.11节,Hardware page table translation


关于页表:ARMv6的MMU进行地址映射时涉及到两种页表,一级页表(first level page table)和二级页表(coarse page table)。


关于映射方式:映射方式有两种,段映射和页映射。段映射只用到一级页表,页映射用到一级页表和二级页表。


关于映射粒度:段映射的映射粒度有两种,1M section和16M supersection;页映射的映射粒度也有两种,4K small page和64K large page。


硬件在做地址转换时,如何知道当前是什么映射方式以及映射粒度是多少呢?


这些信息可以从页表的入口描述符中获得。


一级页表的入口描述符(first-level descriptor)格式如下:

e8a984e418a5d166bfc0fb59c97f8712_170024084207712.png?imageView2/2/w/1000

第[1:0]位决定映射方式:


[1:0]=10b时,是段映射,此时只需作一级映射,描述符的最高12或8位存放的是段基址;


[1:0]=01b时,是页映射,此时虚拟地址转换为物理地址需要经历二级映射,描述符的最高22位存放的是二级页表的物理地址;


第[18]位决定段映射的粒度:


[18]=0b时,映射粒度为1M,描述符的最高12位存放段基址;


[18]=1b时,映射粒度为16M,描述符的最高8位存放段基址;


当映射方式为页映射时,我们用到二级页表,二级页表的入口描述符(second-level descriptor)格式如下:

5d93e19e2297b210bf99145e0165107b_170024548584232.png?imageView2/2/w/1000

第[1:0]位决定页映射的映射粒度:


[1:0]=10b或11b时,映射粒度为4KB,描述符的最高20位为页基址;


[1:0]=01b时,映射粒度为64KB,描述符的最高16位为页基址;


下面分4种情况对地址映射过程做详细描述:


1)段映射,映射粒度为1M


2)段映射,映射粒度为16M


3)页映射,映射粒度为4K


4)页映射,映射粒度为64K


2.1段映射,映射粒度为1M


当映射方式为段映射,且映射粒度为1M时,映射图如下:

b230befc91428bc4a3943e538b1c9157_170026156085634.png?imageView2/2/w/1000

虚拟地址到物理地址的映射过程如下:


虚拟地址的[31:20]位存放一级页表的入口index,[19:0]位存放段偏移;


从TTBR(translation table base register,协处理器CP15中的一个寄存器,用于存放一级页表的基址)寄存器中获取一级页表的基址;


一级页表基址+ VA[31:20] = 该虚拟地址对应的页表描述符的入口地址;


页表描述符的[31:20]位为该虚拟地址对应的物理段基址;


物理段基址+ VA[19:0]段偏移= 物理地址


由映射图可知,一个虚拟地址可以索引2^12个一级页表入口,每个入口映射2^20大小的内存,故虚拟地址可以映射的最大物理内存为:2^12 * 2^20,即4G。


2.2 段映射,映射粒度为16M


当映射方式为段映射,且映射粒度为16M时,映射图如下:

75dcd3175e3e4b419f2d61fa5678e7a3_170026409982226.png?imageView2/2/w/1000

虚拟地址到物理地址的映射过程如下:


虚拟地址的[31:24]位存放一级页表的入口index,[23:0]位存放段偏移;


从TTBR(translation table base register,协处理器CP15中的一个寄存器,用于存放一级页表的基址)寄存器中获取一级页表的基址;


一级页表基址+ VA[31:24] = 该虚拟地址对应的页表描述符的入口地址;


页表描述符的[31:24]位为该虚拟地址对应的物理段基址;


物理段基址+ VA[23:0]段偏移= 物理地址


由映射图可知,一个虚拟地址可以索引2^8个一级页表入口,每个入口映射2^24大小的内存,故虚拟地址可以映射的最大物理内存为:2^8 * 2^24,即4G。


2.3 页映射,映射粒度为4K


当映射方式为页映射,且映射粒度为4K时,映射图如下:

f91604fbf173fa035e5001a0ce327879_170027042028013.png?imageView2/2/w/1000

虚拟地址到物理地址的映射过程如下:


虚拟地址的[31:20]位存放一级页表的入口index,[19:12]位存放二级页表的入口index,[11:0]位存放页偏移;


从TTBR(translation table base register,协处理器CP15中的一个寄存器,用于存放一级页表的基址)寄存器中获取一级页表的基址;


一级页表基址+ VA[31:20] = 一级页表描述符的入口地址;


一级页表描述符的[31:10]位存放二级页表的基址;


二级页表基址+ VA[19:12] = 二级页表描述符的入口地址;


二级页表描述符的[31:12]位存放该虚拟地址在内存中的物理页基址;


物理页基址+ VA[11:0]页偏移= 物理地址


由映射图可知,一个虚拟地址可以索引2^12个一级页表入口,每个一级页表入口指向的二级页表最大可以有2^8个二级页表入口,每个二级页表入口映射2^12大小的内存,故虚拟地址可以映射的最大物理内存为:2^12 * 2^8 * 2^12 ,即4G。


2.4 页映射,映射粒度为64K


当映射方式为页映射,且映射粒度为64K时,映射图如下:

96a84eedea46b4972b8ccf780f52d805_170027413429127.png?imageView2/2/w/1000

虚拟地址到物理地址的映射过程如下:

虚拟地址的[31:20]位存放一级页表的入口index,[19:16]位存放二级页表的入口index,[15:0]位存放页偏移;


从TTBR(translation table base register,协处理器CP15中的一个寄存器,用于存放一级页表的基址)寄存器中获取一级页表的基址;


一级页表基址+ VA[31:20] = 一级页表描述符的入口地址;


一级页表描述符的[31:10]位存放二级页表的基址;


二级页表基址+ VA[19:16] = 二级页表描述符的入口地址;


二级页表描述符的[31:16]位存放该虚拟地址在内存中的物理页基址;


物理页基址+ VA[15:0]页偏移= 物理地址  


由映射图可知,一个虚拟地址可以索引2^12个一级页表入口,每个一级页表入口指向的二级页表最大可以有2^4个二级页表入口,每个二级页表入口映射2^16大小的内存,故虚拟地址可以映射的最大物理内存为:2^12 * 2^4 * 2^16 ,即4G。


2.5 地址映射总图


《ARM1176 JZF-S Technical Reference Manual》中有一张对上述四种映射情况的汇总图:

bb0c58534604fa237ca08e2b04ccf5d0_170028384674213.png?imageView2/2/w/1000

3. 关于一级页表基址


参考《ARM1176 JZF-S Technical Reference Manual》6.12 MMU descriptors


ARMv6中有两个协处理器寄存器用来存放一级页表基地址,TTBR0和TTBR1。操作系统把虚拟内存划分为内核空间和用户空间,TTBR0存放用户空间的一级页表基址,TTBR1存放内核空间的一级页表基址。


In this model, the virtual address space is divided into two regions:

• 0x0 -> 1<<(32-N) that TTBR0 controls

• 1<<(32-N) -> 4GB that TTBR1 controls.

 

N的大小由TTBCR寄存器决定。0x0 -> 1<<(32-N)为用户空间,由TTBR0控制,1<<(32-N) -> 4GB为内核空间,由TTBR1控制。


N的大小与一级页表大小的关系图如下:

ed7f7986a4e0fec49eac373a581fb010_170030589833174.png?imageView2/2/w/1000

操作系统为用户空间的每个进程分配各自的页表,即每个进程的一级页表基址是不一样的,故当发生进程上下文切换时,TTBR0需要被存放当前进程的一级页表基址;TTBR1中存放的是内核空间的一级页表基址,内核空间的一级页表基址是固定的,故TTBR1中的基址值不需要改变。


4.  u-boot中MMU初始化代码分析


u-boot中的MMU地址映射方式为段映射,映射粒度为1M,只用到一级页表。


start.S中的MMU初始化代码如下:


#ifdef CONFIG_ENABLE_MMU

enable_mmu:

    /* enable domain access */

    ldr    r5, =0x0000ffff

    mcr    p15, 0, r5, c3, c0, 0        @ load domain access register


    /* Set the TTB register */

    ldr    r0, _mmu_table_base

    ldr    r1, =CFG_PHY_UBOOT_BASE

    ldr    r2, =0xfff00000

    bic    r0, r0, r2

    orr    r1, r0, r1

    mcr    p15, 0, r1, c2, c0, 0


    /* Enable the MMU */

mmu_on:

    mrc    p15, 0, r0, c1, c0, 0

    orr    r0, r0, #1            /* Set CR_M to enable MMU */

    mcr    p15, 0, r0, c1, c0, 0

    nop

    nop

    nop

    nop

#endif

#ifdef CONFIG_ENABLE_MMU

_mmu_table_base:

    .word mmu_table

#endif


对协处理器的寄存器操作参考:


《ARM1176 JZF-S Technical Reference Manual》Chapter 3 System Control Coprocessor


MMU初始化过程中有一步是将页表基址(CFG_PHY_UBOOT_BASE + mmu_table)存入TTBR0中,在lowlevel_init.S中可以看到对页表的初始化:


#ifdef CONFIG_ENABLE_MMU


/*

 * MMU Table for SMDK6400

 */


    /* 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

    // 1:1 mapping for debugging

    .rept 0xA00

    FL_SECTION_ENTRY __base,3,0,0,0

    .set __base,__base+1

    .endr


    // access is not allowed.

    .rept 0xC00 - 0xA00

    .word 0x00000000

    .endr


    // 128MB for SDRAM 0xC0000000 -> 0x50000000

    .set __base, 0x500

    .rept 0xC80 - 0xC00

    FL_SECTION_ENTRY __base,3,0,1,1

    .set __base,__base+1

    .endr


    // access is not allowed.

    .rept 0x1000 - 0xc80

    .word 0x00000000

    .endr


#endif


下面对页表的初始化代码作详细解释:


/* 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

 

定义一个宏FL_SECTION_ENTRY用来设置页表入口描述符,base即物理基址,ap即access permission,d即domain,c即cacheable,b即bufferable。


内存访问控制和段属性相关描述请参考:


《ARM1176 JZF-S Technical Reference Manual》6.6 Memory access control和6.7 Memory region attributes。


.section .mmudata, 'a'

    .align 14

    // the following alignment creates the mmu table at address 0x4000.

 


定义一个名为mmudata的段,段属性为“a”,allowable,该段16K对齐。从u-boot.lds中可以看到,u-boot的各个段在内存中的分布依次为:.text,.rodata,.data,.got,.u_boot_cmd,.mmudata,.bss。


为什么页表是16K对齐呢?


在上一节我们讲过:有两个寄存器TTBR0和TTBR1用来存放一级页表基址,操作系统把虚拟地址空间划分为用户空间和内核空间,0x0 -> 1<<(32-N)为用户空间,由TTBR0控制,1<<(32-N) -> 4GB为内核空间,由TTBR1控制,N的大小由TTBCR寄存器决定。由于u-boot主要作用是硬件初始化和引导操作系统,所以没有必要对虚拟地址空间进行划分,即N=0,整个虚拟地址空间由TTBR0控制,TTBR0的格式如下:

2934f11375cd9333eaa8a64086d86a88_170033171391449.png?imageView2/2/w/1000

N=0时,[31:14]存放页表基址,即一级页表的基址为([31:14]<<14),2^14为16K。


    .set __base,0

    // 1:1 mapping for debugging

    .rept 0xA00

    FL_SECTION_ENTRY __base,3,0,0,0

    .set __base,__base+1

    .endr

 

对虚拟地址0x0-0xA0000000作平行映射(flat mapping),即把虚拟地址0x0-0xA0000000映射到物理地址0x0-0xA0000000。


// access is not allowed.

    .rept 0xC00 - 0xA00

    .word 0x00000000

    .endr


不对虚拟地址空间0xA0000000-0xC0000000作映射,即禁止访问虚拟地址空间0xA0000000-0xC0000000。


// 128MB for SDRAM 0xC0000000 -> 0x50000000

    .set __base, 0x500

    .rept 0xC80 - 0xC00

    FL_SECTION_ENTRY __base,3,0,1,1

    .set __base,__base+1

    .endr

把虚拟地址空间0xC0000000-0xC8000000映射到物理地址空间0x50000000-0x58000000,0x50000000-0x58000000为sdram的地址空间,此时sdram有128M。


// access is not allowed.

    .rept 0x1000 - 0xc80

    .word 0x00000000

    .endr


不对虚拟地址空间0xc8000000-0xffffffff作映射,即禁止访问虚拟地址空间0xc8000000-0xffffffff。

关键字:s3c6410  MMU  地址映射 引用地址:s3c6410_MMU地址映射过程详述

上一篇:s3c6410_中断
下一篇:s3c6410_uboot中的代码重定位(nand->sdram)

推荐阅读最新更新时间:2026-03-22 10:25

使用MMU进行地址映射的启动代码结构探讨
本文是对《使用AXD调试MMU地址映射程序手记(二)》一文的补充,首先对编写启动代码所需要了解的基本知识和大多数初学者可能比较模糊的基本概念作了简单介绍,然后对启动代码的结构或说流程做了一些探讨。 事实上,对于一个简单的嵌入式应用,编写启动代码并不困难,但如果要在启动代码中使用MMU并完成地址重映射,有一些关键的步骤就值得商酌。 本文仅是笔者学习过程中的一点心得,纰漏之处在所难免,旨在抛砖引玉,给初学者一个思考的方向,更多以及更权威内容请参考文后所列的参考资料。 一、映像文件基本组成 映像文件加载时域包括RO和RW段,运行时域则包括RO、RW和ZI三个段。其中RO和RW段的内容在加载时和运行时是一样的,只是存储空间可能不同
[单片机]
基于S3C6410的ARM11学习(十五) MMU来了
如今,已经是到了main的世界了。下面就要来体验ARM11的MMU,这个东西在STM32中是没有的。之前在核心初始化过程中,是将MMU功能给关闭的。那是因为那个时候,操作的都是物理地址,所以需要将MMU关闭。 MMU,内存管理单元。主要是有两个作用: 1、 将虚拟地址转化为物理地址 2、 内存的访问权限管理 上面这个图就说明了MMU的作用。 有三个任务在运行,运行的地址都是0x400000,如果不进行处理,这肯定是不行的。所以加入了MMU,MMU其实就是一个页表。将虚拟地址通过查表的方式,对应到物理地址去。虽然三个任务的运行地址都是0x400000,但是这个地址是虚拟地址,在页表中,将每个任务的虚拟地址对
[单片机]
基于<font color='red'>S3C6410</font>的ARM11学习(十五) <font color='red'>MMU</font>来了
STM32/CPU地址映射的概念
1总线的由来 很多人对总线和地址映射的概念都是一头雾水,但是我们如果知道为何需要总线和地址映射,他们是在什么背景下被衍化出来的,自然而然对此概念就清清楚楚了。 我们知道CPU都是通过总线访问外设,例如STM32使用AMBA规范的总线和外设进行交互,那么在总线的概念没有被提出来的时候,外设是怎样被访问的呢? 其实在最早期还没有总线概念的时候,CPU设计者会直接把CPU内核和各种接口控制器设计到一起,如果要访问一个硬件,直接在内核里面对各种接口控制器进行操作,从而操作相应的硬件。我们看下图。 后来设计者发现如果每添加一个外设都要修改CPU内核,这样不具有很好的扩展性,为了使得外设的改变(增加、删除、修改)不影响CPU内核架
[单片机]
STM32/CPU<font color='red'>地址</font><font color='red'>映射</font>的概念
MC9S12G128内存映射(本地地址,逻辑地址,全局地址
最近在搞飞思卡尔单片机,属于入门菜鸡的级别,现在总结下对于MC9S12G128内存映射,即主要是本地地址,逻辑地址,全局地址概念的理解,之前看.prm文件简直一头雾水,没有人可以问(因为大家都很忙),自己琢磨了一阵觉得有些头绪,网上的资料很多,但是绝活哥及大佬只是高屋建瓴的一笔带过,剩下我这个菜鸡原地一脸懵逼,如有错误,欢迎指正。 上图 上图简直不要太经典,简直不要太简练 16位单片机,最大寻址能力即2的16次方,65535/1024=64k,当flash内存大于64k时,地址怎么索引呢,即有了分页窗口的说法。 本地地址,就是0到64k,在寻址范围内的地址,16k一页,共四页 0x0000-0x3FFF(包含寄存器空间
[单片机]
MC9S12G128内存<font color='red'>映射</font>(本地<font color='red'>地址</font>,逻辑<font color='red'>地址</font>,全局<font color='red'>地址</font>)
STM32单片机的重映射地址映射的使用方法及步骤
重映射 STM32中对于一些端口的外设已经被其他引脚所使用,这是就需要用端口重映射来解决了,很方便。 以USART1为例 重映射的步骤为: 打开重映射时钟和USART重映射后的I/O口引脚时钟, RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE); I/O口重映射开启。 GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE); 配制重映射引脚, 这里只需配置重映射后的I/O,原来的不需要去配置。 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;GPIO_InitS
[单片机]
STM32单片机的重<font color='red'>映射</font>与<font color='red'>地址</font><font color='red'>映射</font>的使用方法及步骤
STM32IO及定时器映射地址
意义: 有时候我们在操作多个STM32 IO 时,硬件设计未必有规律,比如输出引脚是:PB3,PC4,PC5,PD0,但是操作这些引脚具有共性,或者说我们想用 for(it i = 0; i 4; i++) 像操作数组一样操作这些引脚,程序将变得非常简洁,这时候把 IO 映射到地址就可以实现该目的。 方法: 1.//位带操作,实现51类似的GPIO控制功能 //具体实现思想,参考《CM3权威指南》第五章(87~92页),M4同M3类似,只是寄存器地址变了 //IO口操作宏定义 #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFF
[单片机]
linux中S3C2440的物理地址映射到虚拟地址详解
linux-2.6.30.4\arch\arm\plat-s3c\include\plat\ map-base.h #defineS3C_ADDR_BASE (0xF4000000) #ifndef __ASSEMBLY__ #define S3C_ADDR(x) ((void__iomem __force *)S3C_ADDR_BASE+ (x)) #else #defineS3C_ADDR(x) (S3C_ADDR_BASE+ (x)) #endif #define S3C_VA_IRQ S3C_ADDR(0x00000000) /* irq controller(s) */ #d
[单片机]
ARM地址映射机制
ARM体系结构中,系统上电或复位后,处理器将从地址0x0处取第一条指令,因此,上电的时候,地址0x0处必须是非易失性的ROM或FLASH。但是,为了加快中断响应速度,方便更改中断向量表,有时需要把中断向量表复制到RAM中去,然后把RAM重新映射到地址0x0处,这就用到了地址重映射机制。因为地址重映射是在程序执行过程中进行的,必须考虑程序执行流程的连续性。 引导加载程序: 一个嵌入式系统的软件通常可以分为3个部分:引导加载程序, 嵌入式操作系统, 用户应用程序. 引导加载程序是系统加电后运行的第一段软件代码. 简单地说, 就是在操作系统内核运行之前运行的一段小程序(在嵌入式系统中通常叫做Bootloader). 通过这段小程序, 可
[单片机]
ARM<font color='red'>地址</font>重<font color='red'>映射</font>机制
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved