首页 > 其他分享 >buddy初始化

buddy初始化

时间:2022-11-17 08:22:19浏览次数:56  
标签:__ 初始化 buddy zone memblock free 内存 page

1、memblock初始化

start_kernel
    setup_arch(将初始化配置memblock)
        memblock_reserve(__pa_symbol(_text),(unsigned long)__end_of_kernel_reserve -(unsigned long)_text);(预留代码段)
            memblock_add_range(将该区间的物理内存添加到memblock.reserved里)
        memblock_reserve(0, PAGE_SIZE);(预留第一个page size)
        early_reserve_initrd
            memblock_reserve(预留ramdisk)
        e820__memory_setup
            memory_setup
                e820__memory_setup_default
                    e820__update_table(通过e820将bios传递下来的物理内存信息保存到e820_table里)
            e820__print_table(打印e820_table的内存信息)
        e820__memblock_setup
            memblock_add(将e820_table的内存信息保存到memblock.memory里)
        pagetable_init
            native_pagetable_init
                paging_init
                    zone_sizes_init(设置每个zone的最大内存范围)
                        free_area_init_nodes
                            find_min_pfn_with_active_regions(先找到注册好的start_pfn)
                            find_zone_movable_pfns_for_nodes(如果cmdline有配置movable zone,则将hotplug的内存添加到movable zone里)
                            free_area_init_node(初始化每个node的pgdat)
                            calculate_node_totalpages(计算node的总内存)
                                for (i = 0; i < MAX_NR_ZONES; i++) (设置每个zone的内存区域)
                                    zone_spanned_pages_in_node(将该ndoe的内存先存放到movable zone里,其余的zone的内存初始是没有内存的,后面分配的时候才从movable里申请再填充到对应的zone里)
                            alloc_node_mem_map(分配pgdat->node_mem_map,node_mem_map用来存放page数据结构信息的,通过pgdat->node_mem_map物理页框和page映射)
                            free_area_init_core
                                for (j = 0; j < MAX_NR_ZONES; j++)(对node的每个zone配置)
                                    set_pageblock_order(设置pageblock大小)
                                    memmap_init
                                        memmap_init_zone(将每个zone的物理内存划分成page管理)
                                            __init_single_page
                                            set_pageblock_migratetype(page, MIGRATE_MOVABLE); (初始化所有的内存为movable migrate type)

2、释放memblock到buddy

    mm_init(memblock释放到buddy)
        memblock_free_all
            free_low_memory_core_early
                for_each_free_mem_range(将memblock.memory的每个内存区域释放到buddy里)
                    __free_memory_core
                        __free_pages_memory
                            memblock_free_pages
                                __free_pages_core
                                    __free_pages_ok
                                        free_one_page
                                            free_one_page(page_zone(page), page, pfn, order, migratetype); (将page添加到对应zone的migrate type里,初始化migrate type为movable)
                                                __mod_zone_freepage_state
                                                    __mod_zone_page_state
                                                        zone_page_state_add(更新zone->vm_stat[NR_FREE_PAGES]的free page计数信息)
                               add_to_free_area (将物理内存添加到zone->free_area里)

3、总结:

1)、从bios里获取内存信息到e820表上;
2)、setup_arch里,初始化每个node的zone内存区域;一开始的时候,只有movable里有内存;
3)、mm_init里,将memblock的内存释放到movable zone的free_area里;

标签:__,初始化,buddy,zone,memblock,free,内存,page
From: https://www.cnblogs.com/hhdd666/p/16898243.html

相关文章

  • 初始化钩子
    目录介绍添加命令行选项使用pytest_configure钩子在conftest文件中注册标签在执行测试结束之前执行改钩子介绍调用插件和conftest.py文件的初始化挂钩。添加命令行选......
  • 解决JsonPath.read初始化时候报错Defaulting to no-operation (NOP) logger implement
    报错如下:解决方案:<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.5</version>......
  • Day6-1 三种初始化及下标越界
    三种初始化及内存分析Java内存:堆:存放new的对象和数组可以被所有的线程共享,不会存放别的对象引用栈:存放基本变量类型(会包含这个基本类型的具体数值)引用......
  • 内存分析及数组的3种初始化
    内存分析Java内存分析:数组的3种初始化静态初始化int[]a={1,2,3};Man[]mans={newMan(1,1),newMan(2,2)};动态初始化int[]a=newint[2];a[0]......
  • P5309 [Ynoi2011] 初始化
    P5309[Ynoi2011]初始化考虑暴力,模拟题意,时间复杂度竟是\(O(\frac{n^2}{x})\),那么对于\(x\ge\sqrt{n}\)的修改就可以暴力了,这不是根号分治吗。再去考虑\(x<\sqrt{n}......
  • vue创建项目、初始化项目
    vue创建项目、初始化项目、vue请求代理条件:@vue/cli5.0.4node/v14.0.0一、安装脚手架工具 @vue/clinpminstall-g@vue/clinpminstall-g@vue/[email protected]......
  • 激活函数---->反向传播----》更新参数----》初始化
    神经元包含了非线性计算,用g()来表示,非线性计算由激活函数来实现,激活函数统一表示成g(z),常见的激活函数:1、sigmoid函数如果神经元采用sigmoid函数作为激活函数,那么单个神经元......
  • WinDBG详解进程初始化dll是如何加载的
    一:背景1.讲故事有朋友咨询个问题,他每次在调试WinDbg的时候,进程初始化断点之前都会有一些dll加载到进程中,比如下面这样:Microsoft(R)WindowsDebuggerVersion10.0.252......
  • initContainer 初始化容器
    initContainer1.概述1.1初始化容器的用途Init容器可以包含一些安装过程中应用容器中不存在的实用工具或个性化代码;Init容器可以安全地运行这些工具,避免这些工具导致......
  • shell 的初始化流程
    目录shell初始化基本概念loginshellinteractiveshell不同的组合读取配置文件的区别这套神秘机制造成的麻烦~/.bashrc与~/.bash_profile之间的互动cron......