本文共 10077 字,大约阅读时间需要 33 分钟。
怎么查看 memblock 的消费者 memblock=debuglog 中查看关键字 "memblock_reserve: ["
start_kernel -> setup_arch -> arm_memblock_initmemblock_reserve: [0x50100000-0x51080143] arm_memblock_init+0x48/0x148 // start_kernel->setup_arch->arm_memblock_init->memblock_reserve(__pa(KERNEL_START), KERNEL_END - KERNEL_START);memblock_reserve: [0x50004000-0x50007fff] arm_memblock_init+0x88/0x148 // start_kernel->setup_arch->arm_memblock_init->arm_mm_memblock_reserve();->memblock_reservememblock_reserve: [0x5fffe000-0x5fffffff] memblock_alloc_range_nid+0xc0/0x148 // start_kernel->setup_arch->paging_init->devicemaps_init->early_alloc->memblock_allocmemblock_reserve: [0x5fffde70-0x5fffdfff] memblock_alloc_range_nid+0xc0/0x148 // start_kernel->setup_arch->paging_init->devicemaps_init->mdesc->map_io/smdk6410_map_io->s3c64xx_init_io-> iotable_init(s3c_iodesc -> memblock_allocmemblock_reserve: [0x5fffc000-0x5fffcfff] memblock_alloc_range_nid+0xc0/0x148 // start_kernel->setup_arch->paging_init->devicemaps_init->mdesc->map_io/smdk6410_map_io->s3c64xx_init_io-> iotable_init(s3c_iodesc -> create_mapping -> __create_mapping -> alloc_init_p4d -> alloc_init_pud -> alloc_init_pmd -> alloc_init_pte -> arm_pte_alloc -> early_alloc -> memblock_allocmemblock_reserve: [0x5fffb000-0x5fffbfff] memblock_alloc_range_nid+0xc0/0x148 // start_kernel->setup_arch->paging_init->devicemaps_init->mdesc->map_io/smdk6410_map_io->s3c64xx_init_io-> iotable_init(s3c_iodesc -> create_mapping -> __create_mapping -> alloc_init_p4d -> alloc_init_pud -> alloc_init_pmd -> alloc_init_pte -> arm_pte_alloc -> early_alloc -> memblock_allocmemblock_reserve: [0x5fffa000-0x5fffafff] memblock_alloc_range_nid+0xc0/0x148 // start_kernel->setup_arch->paging_init->devicemaps_init->mdesc->map_io/smdk6410_map_io->s3c64xx_init_io-> iotable_init(s3c_iodesc -> create_mapping -> __create_mapping -> alloc_init_p4d -> alloc_init_pud -> alloc_init_pmd -> alloc_init_pte -> arm_pte_alloc -> early_alloc -> memblock_allocmemblock_reserve: [0x5fff9000-0x5fff9fff] memblock_alloc_range_nid+0xc0/0x148 // start_kernel->setup_arch->paging_init->devicemaps_init->mdesc->map_io/smdk6410_map_io->s3c64xx_init_io-> iotable_init(s3c_iodesc -> create_mapping -> __create_mapping -> alloc_init_p4d -> alloc_init_pud -> alloc_init_pmd -> alloc_init_pte -> arm_pte_alloc -> early_alloc -> memblock_allocmemblock_reserve: [0x5fff8000-0x5fff8fff] memblock_alloc_range_nid+0xc0/0x148 // start_kernel->setup_arch->paging_init->devicemaps_init->mdesc->map_io/smdk6410_map_io->s3c64xx_init_io-> iotable_init(s3c_iodesc -> create_mapping -> __create_mapping -> alloc_init_p4d -> alloc_init_pud -> alloc_init_pmd -> alloc_init_pte -> arm_pte_alloc -> early_alloc -> memblock_allocmemblock_reserve: [0x5fffde48-0x5fffde6f] memblock_alloc_range_nid+0xc0/0x148 // start_kernel->setup_arch->paging_init->devicemaps_init->mdesc->map_io/smdk6410_map_io->s3c64xx_init_io-> iotable_init(mach_desc -> memblock_allocmemblock_reserve: [0x5fff7000-0x5fff7fff] memblock_alloc_range_nid+0xc0/0x148 // start_kernel->setup_arch->paging_init->kmap_init->early_pte_alloc->arm_pte_alloc->early_alloc->memblock_allocmemblock_reserve: [0x5fffde20-0x5fffde47] memblock_alloc_range_nid+0xc0/0x148 // start_kernel->setup_arch->paging_init->tcm_init->iotable_init(dtcm_iomap->memblock_allocmemblock_reserve: [0x5fffddf8-0x5fffde1f] memblock_alloc_range_nid+0xc0/0x148 // start_kernel->setup_arch->paging_init->tcm_init->iotable_init(itcm_iomap->memblock_allocmemblock_reserve: [0x5fff6000-0x5fff6fff] memblock_alloc_range_nid+0xc0/0x148 // start_kernel->setup_arch->paging_init->early_alloc->memblock_allocstart_kernel->setup_arch->paging_init->bootmem_init->memblock_allow_resize memblock_reserve: [0x5fdf6000-0x5fff5fff] memblock_alloc_range_nid+0xc0/0x148 // start_kernel->setup_arch->paging_init->bootmem_init->zone_sizes_init->free_area_init->alloc_node_mem_map->memblock_alloc_node->memblock_alloc_try_nidmemblock_reserve: [0x5fffddc0-0x5fffdddf] memblock_alloc_range_nid+0xc0/0x148 // start_kernel->setup_arch->paging_init->bootmem_init->zone_sizes_init->free_area_init->free_area_init_core->setup_usemap->memblock_alloc_node->memblock_alloc_try_nidmemblock_reserve: [0x5fffdd80-0x5fffdd9f] memblock_alloc_range_nid+0xc0/0x148 // start_kernel->setup_arch->request_standard_resources->memblock_allocmemblock_reserve: [0x5fffdcc0-0x5fffdd71] memblock_alloc_range_nid+0xc0/0x148 // start_kernel ->setup_command_line-> saved_command_line = memblock_allocmemblock_reserve: [0x5fffdc00-0x5fffdcb1] memblock_alloc_range_nid+0xc0/0x148 // start_kernel ->setup_command_line-> static_command_line = memblock_allocmemblock_reserve: [0x5fdf5000-0x5fdf5fff] memblock_alloc_range_nid+0xc0/0x148 // start_kernel ->setup_per_cpu_areas->pcpu_alloc_alloc_info->memblock_allocmemblock_reserve: [0x5fded000-0x5fdf4fff] memblock_alloc_range_nid+0xc0/0x148 // start_kernel ->setup_per_cpu_areas->memblock_alloc_from->memblock_alloc_try_nidmemblock_reserve: [0x5fffdbc0-0x5fffdbc3] memblock_alloc_range_nid+0xc0/0x148 // start_kernel ->setup_per_cpu_areas->pcpu_setup_first_chunk -> memblock_allocmemblock_reserve: [0x5fffdb80-0x5fffdb83] memblock_alloc_range_nid+0xc0/0x148 // start_kernel ->setup_per_cpu_areas->pcpu_setup_first_chunk -> memblock_allocmemblock_reserve: [0x5fffdb40-0x5fffdb43] memblock_alloc_range_nid+0xc0/0x148 // start_kernel ->setup_per_cpu_areas->pcpu_setup_first_chunk -> memblock_allocmemblock_reserve: [0x5fffdb00-0x5fffdb03] memblock_alloc_range_nid+0xc0/0x148 // start_kernel ->setup_per_cpu_areas->pcpu_setup_first_chunk -> memblock_allocmemblock_reserve: [0x5fffda80-0x5fffdaf7] memblock_alloc_range_nid+0xc0/0x148 // start_kernel ->setup_per_cpu_areas->pcpu_setup_first_chunk -> memblock_allocmemblock_reserve: [0x5fffda00-0x5fffda5b] memblock_alloc_range_nid+0xc0/0x148 // start_kernel ->setup_per_cpu_areas->pcpu_setup_first_chunk -> pcpu_alloc_first_chunk -> memblock_allocmemblock_reserve: [0x5fffd600-0x5fffd9ff] memblock_alloc_range_nid+0xc0/0x148 // start_kernel ->setup_per_cpu_areas->pcpu_setup_first_chunk -> pcpu_alloc_first_chunk -> memblock_allocmemblock_reserve: [0x5fffd1c0-0x5fffd5c3] memblock_alloc_range_nid+0xc0/0x148 // start_kernel ->setup_per_cpu_areas->pcpu_setup_first_chunk -> pcpu_alloc_first_chunk -> memblock_allocmemblock_reserve: [0x5fffd0c0-0x5fffd1bf] memblock_alloc_range_nid+0xc0/0x148 // start_kernel ->setup_per_cpu_areas->pcpu_setup_first_chunk -> pcpu_alloc_first_chunk -> memblock_allocmemblock_free: [0x5fdf5000-0x5fdf5fff] setup_per_cpu_areas+0x11c/0x168 // start_kernel ->setup_per_cpu_areas->pcpu_free_alloc_info->memblock_free_early->memblock_freememblock_reserve: [0x5fdcd000-0x5fdecfff] memblock_alloc_range_nid+0xc0/0x148 // start_kernel->vfs_caches_init_early -> dcache_init_early -> alloc_large_system_hash -> memblock_allocmemblock_reserve: [0x5fdbd000-0x5fdccfff] memblock_alloc_range_nid+0xc0/0x148 // start_kernel->vfs_caches_init_early -> inode_init_early -> alloc_large_system_hash -> memblock_allocstart_kernel->vfs_caches_init_early// 之后就没有 用过 memblock_reserve
MEMBLOCK configuration: memory size = 0x10000000 reserved size = 0x011c5ed8 memory.cnt = 0x1 memory[0x0] [0x50000000-0x5fffffff], 0x10000000 bytes flags: 0x0 // 全部内存 reserved.cnt = 0x10 reserved[0x0] [0x50004000-0x50007fff], 0x00004000 bytes flags: 0x0 // 页表,页目录表 reserved[0x1] [0x50100000-0x51080143], 0x00f80144 bytes flags: 0x0 // kernel reserved[0x2] [0x5fdbd000-0x5fdf4fff], 0x00038000 bytes flags: 0x0 // inode_hashtable : 文件系统相关 // dentry_hashtable : 文件系统相关 // setup_per_cpu_areas中的memblock_alloc_from : per_cpu 变量相关 reserved[0x3] [0x5fdf6000-0x5fffcfff], 0x00207000 bytes flags: 0x0 // buddy 中的 所有的 struct page // paging_init->early_alloc : zero page // paging_init->kmap_init->early_pte_alloc : fixmap 相关 // 4个 s3c64xx_init_io-> iotable_init(s3c_iodesc -> create_mapping : 设备的一级页表在 0x50004000-0x50007fff , 申请设备的二级页表(1个页) reserved[0x4] [0x5fffd0c0-0x5fffd5c3], 0x00000504 bytes flags: 0x0 // 2个 setup_per_cpu_areas->pcpu_setup_first_chunk -> pcpu_alloc_first_chunk reserved[0x5] [0x5fffd600-0x5fffda5b], 0x0000045c bytes flags: 0x0 // 2个 setup_per_cpu_areas->pcpu_setup_first_chunk -> pcpu_alloc_first_chunk reserved[0x6] [0x5fffda80-0x5fffdaf7], 0x00000078 bytes flags: 0x0 // 1个 setup_per_cpu_areas->pcpu_setup_first_chunk reserved[0x7] [0x5fffdb00-0x5fffdb03], 0x00000004 bytes flags: 0x0 // 1个 setup_per_cpu_areas->pcpu_setup_first_chunk reserved[0x8] [0x5fffdb40-0x5fffdb43], 0x00000004 bytes flags: 0x0 // 1个 setup_per_cpu_areas->pcpu_setup_first_chunk reserved[0x9] [0x5fffdb80-0x5fffdb83], 0x00000004 bytes flags: 0x0 // 1个 setup_per_cpu_areas->pcpu_setup_first_chunk reserved[0xa] [0x5fffdbc0-0x5fffdbc3], 0x00000004 bytes flags: 0x0 // 1个 setup_per_cpu_areas->pcpu_setup_first_chunk reserved[0xb] [0x5fffdc00-0x5fffdcb1], 0x000000b2 bytes flags: 0x0 // 1个 setup_command_line-> static_command_line = memblock_alloc reserved[0xc] [0x5fffdcc0-0x5fffdd71], 0x000000b2 bytes flags: 0x0 // 1个 setup_command_line-> static_command_line = memblock_alloc reserved[0xd] [0x5fffdd80-0x5fffdd9f], 0x00000020 bytes flags: 0x0 // 1个 request_standard_resources reserved[0xe] [0x5fffddc0-0x5fffdddf], 0x00000020 bytes flags: 0x0 // 1个 free_area_init->free_area_init_core->setup_usemap reserved[0xf] [0x5fffddf8-0x5fffffff], 0x00002208 bytes flags: 0x0 // tcm_init->iotable_init(itcm_iomap // static_vm // tcm_init->iotable_init(dtcm_iomap // static_vm // smdk6410_map_io->s3c64xx_init_io-> iotable_init(mach_desc // static_vm // smdk6410_map_io->s3c64xx_init_io-> iotable_init(s3c_iodesc // static_vm // devicemaps_init->early_alloc // vectors
消费者有1. 页表2. kernel3. per_cpu4. 文件系统5. buddy中的struct page6. zero page的 物理页7. fixmap 的 4KB 二级页表8. 设备的 n*4KB 二级页表9. static_vm // add_static_vm_early10. vectors // vectors = early_alloc11. resource 12. command_line13. setup_usemap为什么这些模块会成为 memblock_alloc 的消费者 ???大概是需要内存 为什么 需要 alloc 的内存 而不是建立 全局变量 而且现在必须用,不能等到buddy建立, 而此时只有 memblock ,所以只能用 memblock_alloc
per_cpu 基于 chunk内存分配器chunk 基于 vmalloc和buddy
转载地址:http://djigi.baihongyu.com/