向内存中连续存入数据_虚拟内存系列(二)MMU启动流程中基本数据结构

初次接触内核源码的内存初始化部分,需要一些硬件方面的知识,否则肯定不好理解代码。不过即便有,也会对内核中用来抽象化管理内存的数据结构有点茫然不知所措。这里对启动部分用到的数据结构进行总结。

meminfo

meminfo 这个数据结构是用来记录内存BANK信息。BANK的来源有两个:

  • cmdline中通过mem=来指定
  • 通过UBOOT传递TAG

两者最终都是调用arm_add_memory将内存BANK信息存到meminfo,包括bank的起始物理地址。源码中是通过一个全局变量struct meminfo meminfo(定义在arch/arm/mm/init.c)来记录这些内存bank的。

struct meminfo {int nr_banks;struct membank bank[NR_BANKS];};struct membank {unsigned long start;unsigned long size;unsigned int highmem;};

mem_block

mem_block这个数据结构的主要作用是将membank连接为更大的内存块。同时,也剥离了一些系统不可用于内存的物理地址(比如设备IO)。而在memblock_type这个结构中,用cnt记录了memory的可用块数量,max记录了region数组大小。regions数组的一个元素,即是一块连续的物理地址。

struct memblock {phys_addr_t current_limit;phys_addr_t memory_size;/* Updated by memblock_analyze() */struct memblock_type memory;struct memblock_type reserved;/*内存reserve,在什么情况下会reserved呢:比如init进程的gpd表。它也是作为一个block add到memblock中的*/};struct memblock_type {unsigned long cnt;/* number of regions */unsigned long max;/* regions数组的大小 */struct memblock_region *regions;//一个region 保存的是连续的物理内存,或者是IO(通常保存在type=reserve)};struct memblock_region {phys_addr_t base;phys_addr_t size;};

mem_type

mem_type 是用来标记内存页表的权限(protect,实际就是页表除地址部分其余bit的设置)和domain。源码中用一个数组来记录所有类型内存和IO的访问mem_types[](定义在arch/arm/mm/mmu.c)。

struct mem_type {pteval_t prot_pte;//二级页表protect 标志unsigned int prot_l1;//一级页表的protect 标志unsigned int prot_sect;//sector 方式映射时的protect 标志位unsigned int domain; //映射的页框所属的domain : kernel-0,user-1, io-2};#define MT_DEVICE0#define MT_DEVICE_NONSHARED1#define MT_DEVICE_CACHED2#define MT_DEVICE_WC3#define MT_UNCACHED4#define MT_CACHECLEAN5#define MT_MINICLEAN6#define MT_LOW_VECTORS7//0地址开始的向量#define MT_HIGH_VECTORS8//高地址开始的向量#define MT_MEMORY9 //RAM#define MT_ROM10#define MT_MEMORY_NONCACHED11#define MT_MEMORY_DTCM12#define MT_MEMORY_ITCM13

TBC

2542a37f2df9fb37e36d1d0426989fde.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值