久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: ARM11 S3C6410 的地址表 [打印本頁]

作者: heicc    時間: 2015-1-2 20:21
標題: ARM11 S3C6410 的地址表
參考: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)格式如下:

第[1:0]位決定映射方式:
[1:0]=10b時,是段映射,此時只需作一級映射,描述符的最高12或8位存放的是段基址;
[1:0]=01b時,是頁映射,此時虛擬地址轉換為物理地址需要經歷二級映射,描述符的最高22位存放的是二級頁表的物理地址;
第[18]位決定段映射的粒度:
[18]=0b時,映射粒度為1M,描述符的最高12位存放段基址;
[18]=1b時,映射粒度為16M,描述符的最高8位存放段基址;
當映射方式為頁映射時,我們用到二級頁表,二級頁表的入口描述符(second-level descriptor)格式如下:

第[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時,映射圖如下:

虛擬地址到物理地址的映射過程如下:
虛擬地址的[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時,映射圖如下:

虛擬地址到物理地址的映射過程如下:
虛擬地址的[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時,映射圖如下:

虛擬地址到物理地址的映射過程如下:
虛擬地址的[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時,映射圖如下:

虛擬地址到物理地址的映射過程如下:
虛擬地址的[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》中有一張對上述四種映射情況的匯總圖:



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的大小與一級頁表大小的關系圖如下:

操作系統為用戶空間的每個進程分配各自的頁表,即每個進程的一級頁表基址是不一樣的,故當發生進程上下文切換時,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 (ase << 20) | (ap << 10) |
          (d << 5) | (1<<4) | (c << 3) | ( << 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 (ase << 20) | (ap << 10) |
          (d << 5) | (1<<4) | (c << 3) | ( << 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的格式如下:

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。






歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 亚洲91av | 国产精品久久久久久久久久久久午夜片 | 亚洲在线免费观看 | 免费一级a毛片 | 在线观看日韩精品 | 天天干天天拍 | 成年人观看视频 | 亚洲第一av | 亚洲天堂色 | 黄色欧美视频 | 久久香蕉网| 国产小视频在线 | 国产视频一 | 亚洲视频中文字幕 | 一级黄色录像视频 | 黄色一级免费看 | 欧美成人精品 | 国产视频一区二区在线观看 | 欧美日韩一区二区在线 | 午夜成人在线视频 | 99视频网| 国产欧美一区二区精品性色超碰 | 九九国产精品视频 | 福利视频免费 | www.日韩在线 | 日韩av一区二区三区四区 | 成年在线观看 | 男女啪啪无遮挡 | 中文字幕亚洲精品 | 国产毛片av | 草草视频在线 | 网站毛片| 91国内精品 | 国产一区二区自拍 | 午夜视频在线看 | 亚洲成人二区 | 黄色录像免费看 | 日韩欧美精品一区二区 | 蜜桃视频成人 | 欧美午夜精品久久久久免费视 | 在线免费播放av |