Linux bootmem (4)

本文档详细介绍了Linux内核如何映射kernel地址空间,包括使用swapper_pg_dir代表kernel地址空间,创建page table并映射kernel代码段。接着,讲解了cpu设置,包括启用MMU前的准备工作,如设置CPACR和MDSCR寄存器。最后,描述了内存属性定义,MAIR寄存器的配置,以及TCR寄存器的设置,以启用MMU并进入虚拟地址时代。
摘要由CSDN通过智能技术生成

映射kernel地址空间

swapper_pg_dir其实就是swapper进程(pid等于0的那个,其实就是idle进程)的地址空间,用它来代表kernel地址空间。和恒等映射的区别是,这段空间映射没有扩展页表的需求,当然它也是使用section mapping。和前面的恒等映射一样,swapper_pg_dir也是需要3个页面。

映射kernel空间

adrp  x0, swapper_pg_dir   kernel页表基地址

mov_q        x5, KIMAGE_VADDR + TEXT_OFFSET      // compile time __va(_text) 代码段开始虚拟地址

add   x5, x5, x23                    // add KASLR displacement

create_pgd_entry x0, x5, x3, x6   建立各个中间leveltable描述符

adrp  x6, _end                        // runtime __pa(_end) 代码段结束物理地址

adrp  x3, _text                       // runtime __pa(_text) 代码段开始物理地址

sub    x6, x6, x3                      // _end - _text        代码段长度

add   x6, x6, x5                      // runtime __va(_end)  代码段结束虚拟地址

create_block_map x0, x7, x3, x5, x6 创建PTE

adrp  x0, idmap_pg_dir

ldr     x1, =(IDMAP_DIR_SIZE + SWAPPER_DIR_SIZE + RESERVED_TTBR0_SIZE)

dmb  sy

bl      __inval_dcache_area 再次清理cache

ret     x28

ENDPROC(__create_page_tables)

上面调用的函数在前面都介绍过,不再次介绍了。至此内核地址空间被全部映射。

ffffff8008080000 T _text

ffffff8009175000 A _end

sharkl3 1h10 arm64的kernel使用了17,780,736字节,即不到20MB字节。

因为level2页表采用了block型描述符,每个entry管2MB,需要10个entry就够了。

http://www-x-wowotech-x-net.img.abc188.com/content/uploadfile/201804/b8e81524313791.png 左侧是内核虚拟地址分配图

cpu设置

stext--> __cpu_setup

这部分代码主要是在使能mmu前对cpu做一些设置。

ENTRY(__cpu_setup)

         tlbi    vmalle1                                  // Invalidate local TLB

         dsb    nsh

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值