当前位置: 首页 > news >正文

福步外贸论坛下载简述seo对各类网站的作用

福步外贸论坛下载,简述seo对各类网站的作用,网站域名销售,个人做同城网站赚钱吗说明 memblock是Linux内核启动早期用于管理物理内存的机制,在伙伴系统(Buddy System)接管内存管理之前为系统提供物理内存分配、释放等功能。相对于伙伴系统,memblock功能和实现较为简单。本文基于:linux_5.10 arm64平…

说明

  • memblock是Linux内核启动早期用于管理物理内存的机制,在伙伴系统(Buddy System)接管内存管理之前为系统提供物理内存分配、释放等功能。
  • 相对于伙伴系统,memblock功能和实现较为简单。
  • 本文基于:linux_5.10 arm64平台。

历史

  • 启动早期的内存管理器实现有bootmem和memblock,bootmem是早期内核采用,4.x以后内核内核采用memblock,配置了NO_BOOTMEM宏。
  • memblock取代了bootmem算法。

实现原理

获取物理内存布局

  • 不同于伙伴系统以内存页为操作对象,memblock以物理内存段为操作对象,系统从dtb或者uboot传递来的mem信息中解析出总的物理内存信息(核心信息是地址范围),此时的物理内存是一段段的地址空间,再初始化memblock。

fdt方式

  • dts配置中有memory的配置
* 单段物理内存
memory {device_type = "memory";reg = <0x0 0x80000000 0x0 0x10000000>;
};
* 多段物理内存
memory@0 {device_type = "memory";reg = <0x00000000 0x00000000 0x00000000 0x05e00000>,<0x00000000 0x05f00000 0x00000000 0x00001000>,<0x00000000 0x05f02000 0x00000000 0x00efd000>,<0x00000000 0x06e00000 0x00000000 0x0060f000>,<0x00000000 0x07410000 0x00000000 0x1aaf0000>,<0x00000000 0x22000000 0x00000000 0x1c000000>;
};

uboot bootargs方式

  • uboot启动linux时,可以通过linux的启动参数bootargs,传递物理内存信息(基址和size),初始化memblock。
  • 格式如下:
mem=size@start
  • 配置流程
* 函数调用栈
early_mem  //file: arch/arm64/mm/init.c,解析出物理内存信息,保存在全局变量中
arm64_memblock_init //file: arch/arm64/mm/init.c 
->  memblock_add
* 核心代码
void __init arm64_memblock_init(void)
{...if (memory_limit != PHYS_ADDR_MAX) { //全局变量非默认值memblock_mem_limit_remove_map(memory_limit); memblock_add(__pa_symbol(_text), (u64)(_end - _text));}...
}

可用段查找原理

  • memblock内存分配时可用段查找采用first match算法,即占用首先找到的可以段。
  • 内存分配查找的方向可以是从高到低,也可以是从低到高,通过总context中的成员变量bottom_up决定。

两个阶段

  • memblock有两个阶段
  1. memblock init之前;主要是静态分配,根据dts配置中预留内存定义(reserved memory),内核本身(code等),dtb等,在物理内存上分配出所需的预留内存。
  2. memblock init之后,伙伴系统初始化完之前;主要是Linux内核机制产生的动态内存分配。
  • 两个阶段以以memblock configuration为分隔。

分配结果

  • memblock分配结果都是预留内存,分配结束后固定占用,无法释放和复用。

代码逻辑

  • memblock源码在Linux内核根目录下的:
include/linux/memblock.h 
mm/memblock.c 

数据结构和实例

  • memblock从大到小定义了三个数据结构,如下:
  1. 总context定义
struct memblock {bool bottom_up;  //内存分配的方向:从高到低(FALSE)、从低到高(TRUE)phys_addr_t current_limit; //最大内存地址struct memblock_type memory; //可管理的内存段struct memblock_type reserved; //预留内存
};
  1. 内存类型定义
struct memblock_type {unsigned long cnt; //内存区域个数(占用数组个数)unsigned long max; //最大区域个数(数组总个数)phys_addr_t total_size; //该内存类型总大小struct memblock_region *regions; //包含的内存区域数组char *name;
};
  1. 内存区域(地址段)定义
struct memblock_region {phys_addr_t base;  //基址phys_addr_t size;  //空间大小enum memblock_flags flags; //flag
#ifdef CONFIG_NUMAint nid;   //物理内存 node id,NUMA可以存在多个物理内存节点(node)
#endif
};enum memblock_flags {MEMBLOCK_NONE           = 0x0,  /* No special request */ //正常MEMBLOCK_HOTPLUG        = 0x1,  /* hotpluggable region */ //可插拔区域MEMBLOCK_MIRROR         = 0x2,  /* mirrored region */MEMBLOCK_NOMAP          = 0x4,  /* don't add to kernel direct mapping */ //no map区域
};
  • 总context实例,以全局静态变量(保存在BSS段中)形式定义,区域都是预先定义的全局静态数组,数组个数默认128(INIT_MEMBLOCK_REGIONS)。
static struct memblock_region memblock_memory_init_regions[INIT_MEMBLOCK_REGIONS] __initdata_memblock;
static struct memblock_region memblock_reserved_init_regions[INIT_MEMBLOCK_RESERVED_REGIONS] __initdata_memblock;
#ifdef CONFIG_HAVE_MEMBLOCK_PHYS_MAP
static struct memblock_region memblock_physmem_init_regions[INIT_PHYSMEM_REGIONS];
#endifstruct memblock memblock __initdata_memblock = {.memory.regions         = memblock_memory_init_regions,.memory.cnt             = 1,    /* empty dummy entry */.memory.max             = INIT_MEMBLOCK_REGIONS,.memory.name            = "memory",.reserved.regions       = memblock_reserved_init_regions,.reserved.cnt           = 1,    /* empty dummy entry */.reserved.max           = INIT_MEMBLOCK_RESERVED_REGIONS,.reserved.name          = "reserved",.bottom_up              = false,.current_limit          = MEMBLOCK_ALLOC_ANYWHERE,
};

API

  1. memblock_add
  • 将内存区域加入memblock可管理的内存区域,即memory的region队列。
  1. memblock_free
  • 将一个物理内存段从预留内存中移除,该内存段重新标记为可用。
int memblock_free(phys_addr_t base, phys_addr_t size)
{memblock_dbg("   memblock_free: [%#016llx-%#016llx] %pF\n",(unsigned long long)base,(unsigned long long)base + size - 1,(void *)_RET_IP_);kmemleak_free_part_phys(base, size);return memblock_remove_range(&memblock.reserved, base, size);
}

调试

  1. 获取memblock的详细分配log,可以通过在uboot bootargs中加入“memblock=debug”,内核启动后,通过dmesg或者/proc/kmsg查看调试信息。
  2. linux kernel启动后可以通过debug fs查看内存地址范围和reserved区域,如下:
/sys/kernel/debug/memblock/memory #交由系统管理的内存 
/sys/kernel/debug/memblock/reserved #预留的内存
* 需要开启配置
CONFIG_DEBUG_FS
CONFIG_ARCH_KEEP_MEMBLOCK //是否保留memblock分配信息
  • 该功能不是很有必要并且会占用一定硬件资源,方法1足以满足调试需求,新版本内核CONFIG_ARCH_KEEP_MEMBLOCK配置默认是关闭的。

交接

  • buddy分配器初始化ok后,memblock分配器将内存管理工作交接给buddy(伙伴)分配器。

标志

  • memblock和伙伴系统的交接标志:释放init进程内存(free_initmem函数处理),之后系统可用内存(/proc/meminfo中的MemTotal)就固定了。

分配实例分析

  • 分配实例
http://www.hengruixuexiao.com/news/34588.html

相关文章:

  • dede手机网站模版网时代教育培训机构怎么样
  • 网站换模板要怎么做杭州网站seo优化
  • 网站登录 退出怎么做如何提高网站在搜索引擎中的排名
  • 网站内部链接建设企业网站首页
  • wordpress discuz区别搜索引擎seo是什么
  • 网站上传视频怎么做百度权重是什么意思
  • 免费建站长平台网站二级域名注册
  • 怎么做网站树洞网站建设方案书范文
  • 做网站和做产品网站建设外包
  • 如何建设赌博网站竞价网络推广托管
  • 做网站推广有前景吗排名函数rank怎么用
  • 哪些大学网站做的比较好游戏推广引流软件
  • flash asp设计公司网站源码免费有效的推广网站
  • 深圳维特网站建设2021百度新算法优化
  • 网站建设方案下载百度识图搜索图片来源
  • 上海网站建设 永灿友情链接有哪些展现形式
  • 怎么做网站的三级目录热词分析工具
  • 长沙建站智找有为太极关键字优化
  • 看今天的新闻关键词优化推广排名
  • 无锡做网站需要多少钱东莞网站公司
  • 电子商务公司网站建立可以免费投放广告的平台
  • 中国兰州网pc主站凡客建站
  • 网站建设流程 报读文库国外网页模板
  • 网站搭建h5是什么在线教育
  • 西安做酒店用品的网站seo网站优化助理
  • html做网站怎样推广app别人才愿意下载
  • h5网站开发公司免费个人网站源码
  • 最近几年做电影网站怎么样免费推广的途径与原因
  • 外国网站在中国做推广如何做一个自己的网站呢
  • 全民建网站搜索大全浏览器