×
单片机 > 单片机程序设计 > 详情

ARMv8(aarch64)页表建立过程详细分析

发布时间:2024-04-28 发布时间:
|

1 ARMv8存储管理

1.1 Aarch64 Linux中的内存布局

ARMv8架构可以支持48位虚拟地址,并配置成4级页表(4K页),或者3级页表(64K页)。而本Linux系统只使用39位虚拟地址(512G内核,512G用户),配置成3级页表(4K页)或者2级页表(64K页)


用户空间的地址63:39位都置零,内核空间地址63:39都置一,虚拟地址的第63位可以用来选择TTBRx。swapper_pg_dir只包含内核全局映射,用户的pgd包含用户(非全局)映射。swapper_pg_dir地址在TTBR1中,不会写入TTBR0中。


AArch64Linux内存布局:


Start End Size Use


--------------------------------------------------------------------------------------------------


0000000000000000 0000007fffffffff 512GB user



ffffff8000000000 ffffffbbfffcffff ~240GB vmalloc



ffffffbbfffd0000 ffffffbcfffdffff 64KB [guardpage]



ffffffbbfffe0000 ffffffbcfffeffff 64KB PCII/O space



ffffffbbffff0000 ffffffbcffffffff 64KB [guard page]



ffffffbc00000000 ffffffbdffffffff 8GB vmemmap



ffffffbe00000000 ffffffbffbffffff ~8GB [guard,future vmmemap]



ffffffbffc000000 ffffffbfffffffff 64MB modules



ffffffc000000000 ffffffffffffffff 256GB memory


1.2 AArch64的虚拟地址格式

1.2.1 4K页时的虚拟地址


1.2.2 64K页时的虚拟地址




2 head.S页表建立过程分析

2.1 页表建立函数__create_page_tables

该函数用于在内核启动时,为FDT(设备树)、内核镜像创建启动所必须的页表。等内核正常运行后,还需运行create_mapping为所有的物理内存创建页表,这将覆盖__create_page_tables所创建的页表。


内核开始运行时创建页表源文件:arm64/kernel/head.Sline345


/*


* Setup the initial page tables. We only setup the barest amount which is


* required to get the kernel running. The following sections are required:


* -identity mapping to enable the MMU (low address, TTBR0)


* -first few MB of the kernel linear mapping to jump to once the MMU has


* been enabled, including the FDT blob (TTBR1)


*/


__create_page_tables:


pgtbl x25, x26,x24 //idmap_pg_dir and swapper_pg_dir addresses



/*


* 清空新建的两个页表TTBR0,TTBR1


*/


mov x0,x25


add x6,x26, #SWAPPER_DIR_SIZE


1: stp xzr,xzr, [x0], #16


stp xzr,xzr, [x0], #16


stp xzr,xzr, [x0], #16


stp xzr,xzr, [x0], #16


cmp x0,x6


b.lo 1b



ldr x7,=MM_MMUFLAGS



/*


* Create the identity mapping.


*/


add x0, x25,#PAGE_SIZE // sectiontable address


adr x3, __turn_mmu_on // virtual/physical address


create_pgd_entry x25, x0, x3, x5, x6 //展开见1.1.3


create_block_map x0, x7, x3, x5, x5, idmap=1



/*


* Map the kernel image (starting withPHYS_OFFSET).


*/


add x0,x26, #PAGE_SIZE //section table address


mov x5,#PAGE_OFFSET


create_pgd_entry x26, x0, x5, x3, x6


ldr x6,=KERNEL_END - 1


mov x3,x24 // physoffset


create_block_map x0, x7, x3, x5, x6



/*


* Map the FDT blob (maximum 2MB; must bewithin 512MB of


* PHYS_OFFSET).


*/


mov x3,x21 // FDTphys address


and x3,x3, #~((1 << 21) - 1) // 2MBaligned


mov x6,#PAGE_OFFSET


sub x5,x3, x24 //subtract PHYS_OFFSET


tst x5,#~((1 << 29) - 1) //within 512MB?


csel x21,xzr, x21, ne // zero the FDTpointer


b.ne 1f


add x5,x5, x6 // __va(FDTblob)


add x6,x5, #1 << 21 // 2MB forthe FDT blob


sub x6,x6, #1 //inclusive range


create_block_map x0, x7, x3, x5, x6


1:


ret


ENDPROC(__create_page_tables)




2.1.1 pgtbl x25, x26, x24分析

pgtbl是个宏,定义如下:


arm64/kernel/head.S line55


.macro pgtbl,ttb0, ttb1, phys


add ttb1,phys, #TEXT_OFFSET - SWAPPER_DIR_SIZE


sub ttb0,ttb1, #IDMAP_DIR_SIZE


.endm


pgtbl x25,x26, x24 //展开后如下


add x26,x24, #TEXT_OFFSET -SWAPPER_DIR_SIZE


sub x25,x26,#IDMAP_DIR_SIZE



其中各变量定义如下:


#defineSWAPPER_DIR_SIZE (3 * PAGE_SIZE)


#defineIDMAP_DIR_SIZE (2 *PAGE_SIZE)


说明:


1、关于TTBR0、TTBR1的介绍见ARM ARM 手册的Page B4-1708


2、x25中存TTBR0(TTBR0 holds the base address of translation table 0)的地址;


3、X26存TTBR1(TTBR1 holds the base address of translation table 1)地址;


4、X24 存PHYS_OFFSET,/* PHYS_OFFSET- the physical address of the start of memory. */


#definePHYS_OFFSET ({ memstart_addr; })


5、TEXT_OFFSET是Bootloader启动时传进来的参数,是内核Image加载时相对于RAM起始地址的偏移量


6、PAGE_OFFSEST:the virtual address of the start of the kernel image.






图1 pgtbl宏分析



2.1.2 MM_MMUFLAGS解释

在文件arm64/kernel/head.S line71:


/*


* Initial memory map attributes.


*/


#ifndefCONFIG_SMP


#definePTE_FLAGS PTE_TYPE_PAGE | PTE_AF


#definePMD_FLAGS PMD_TYPE_SECT | PMD_SECT_AF


#else


#definePTE_FLAGS PTE_TYPE_PAGE | PTE_AF |PTE_SHARED


#definePMD_FLAGS PMD_TYPE_SECT | PMD_SECT_AF| PMD_SECT_S


#endif



#ifdefCONFIG_ARM64_64K_PAGES


#defineM

[1] [2] [3]
ARMv8aarch64建立过程

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
如何升级STM32单片机的代码