Linux Kernel 内存管理
星空探索
linux
展开
-
Linux 子进程pgd处理
进程创建 fork函数运行。copy_mm()--> dup_mmstatic struct mm_struct *mm_init(struct mm_struct *mm, struct task_struct *p, struct user_namespace *user_ns){ mm->mmap = NULL; mm->mm_rb = RB_ROOT;原创 2018-02-07 10:56:58 · 1310 阅读 · 0 评论 -
内存管理之bootmem管理之释放内存
主要还是两个函数free_bootmem_node和free_bootmem这里主要是标记相应比特位为0,空闲。/** * free_bootmem_node - mark a page range as usable * @pgdat: node the range resides on * @physaddr: starting address of the ran原创 2017-03-06 10:10:15 · 381 阅读 · 0 评论 -
内存管理之bootmem管理之标记内存为reserve
主要提供reserve_bootmem_node和reserve_bootmem/** * reserve_bootmem_node - mark a page range as reserved * @pgdat: node the range resides on * @physaddr: starting address of the range * @size:原创 2017-03-06 10:09:53 · 1135 阅读 · 0 评论 -
内存管理之bootmem管理之对外分配函数
alloc_bootmem_bdata和alloc_bootmem_corestatic void * __init alloc_bootmem_bdata(struct bootmem_data *bdata, unsigned long size, unsigned long align, unsigned long goal, unsigned原创 2017-03-06 10:09:12 · 338 阅读 · 0 评论 -
内存管理之bootmem管理之释放所有bootmem内存
主要是提供__free_pages_boot_core()函数,对外提供__free_pages_bootmem()和deferred_free_range()__free_pages_bootmem()1. free_bootmem_late2. free_all_bootmem_core 《3. __memblock_free_late/* * f原创 2017-03-06 10:07:54 · 544 阅读 · 0 评论 -
内存管理之bootmem管理之free_all_bootmem
/** * free_all_bootmem - release free pages to the buddy allocator * * Returns the number of pages actually released. */unsigned long __init free_all_bootmem(void){ unsigned long total_p原创 2017-03-06 10:06:25 · 925 阅读 · 0 评论 -
内存管理之bootmem管理之__free_pages_boot_core
__free_pages_boot_corestatic void __init __free_pages_boot_core(struct page *page, unsigned int order){ unsigned int nr_pages = 1 << order; struct page *p = page; unsigned int loop; pr原创 2017-03-06 10:05:10 · 578 阅读 · 0 评论 -
释放页到伙伴系统之free_one_page
主要是free_one_page()对外提供__free_pages_ok和free_hot_cold_page/* * Freeing function for a buddy system allocator. * * The concept of a buddy system is to maintain direct-mapped table * (co原创 2017-03-06 10:02:46 · 842 阅读 · 0 评论 -
内存管理之memblock
memblock, Logical memory blocks.管理struct memblock { bool bottom_up; /* is bottom up direction? */ phys_addr_t current_limit; struct memblock_type memory; struct memblock_type reserved;#if原创 2017-03-06 10:01:46 · 532 阅读 · 0 评论 -
内存管理之memblock添加
这里主要提供两个函数memblock_add()和memblock_add_node(),如果标记内存则调用memblock_reserve()。这些函数核心调用memblock_add_range()/** * memblock_add_range - add new memblock region * @type: memblock type to add ne原创 2017-03-06 09:59:47 · 472 阅读 · 0 评论 -
内存管理之memblock管理之移除块
static int __init_memblock memblock_remove_range(struct memblock_type *type, phys_addr_t base, phys_addr_t size){ int start_rgn, end_rgn; int i, ret; ret = memblock_isolate_range(t原创 2017-03-06 09:56:27 · 804 阅读 · 0 评论 -
内存管理之bootmem管理之标记内存
主要有mark_bootmem_node和mark_bootmem两个函数static int __init mark_bootmem_node(bootmem_data_t *bdata, unsigned long start, unsigned long end, int reserve, int flags){ unsigned long sidx,原创 2017-03-06 10:10:48 · 326 阅读 · 0 评论 -
内存管理之bootmem管理之内存分配
内存管理之bootmem管理之初始化内存管理之bootmem管理之内存分配bootmem管理中,内存分配的核心是alloc_bootmem_bdata()函数void * __init alloc_bootmem_bdata(struct bootmem_data *bdata, unsigned long size, unsigned long align,原创 2017-03-06 10:11:19 · 456 阅读 · 0 评论 -
Linux 内核页表初始化
前面我们讨论了页描述符对象分配,以及初始化。接下来我们再来了解内核页表建立初始化处理。针对ARM64进行。start_kernel --> setup_arch --> paging_init()void __init paging_init(void){ phys_addr_t pgd_phys = early_pgtable_alloc(); 分配页全局目录表地址原创 2018-02-07 10:31:24 · 1757 阅读 · 0 评论 -
Linux初始化页描述符对象
在前面我们讨论了内存节点node_mem_map成员的初始化。了解到此成员其实是以struct page为单位的数组,数组大小跟此节点内存大小相关,那么这些描述符是何时初始化呢,当前主要是在mem_init函数进行设置。start_kernel() --> mm_init --> mem_init()需要注意的是mem_init是跟体系结构相关的函数,比如针对ARM64的实现函数:原创 2018-02-07 10:12:05 · 861 阅读 · 0 评论 -
Linux内存管理之mem_map对象
在linux内核中,所有的物理内存都用struct page结构来描述,这些对象以数组形式存放,而这个数组的地址就是mem_map。内核以节点node为单位,每个node下的物理内存统一管理,也就是说在表示内存node的描述类型struct pglist_data中,有node_mem_map这个成员,其针对平坦型内存进行描述(CONFIG_FLAT_NODE_MEM_MAP),与此相反的是S原创 2018-02-07 09:53:46 · 9385 阅读 · 1 评论 -
页order设置
static inline void set_page_order(struct page *page, unsigned int order){ set_page_private(page, order); __SetPageBuddy(page);}static inline void rmv_page_order(struct page *page){ __Clear原创 2017-03-15 08:15:57 · 1163 阅读 · 0 评论 -
Linux kernel内存管理之free_area
zone 空闲页管理:/* Free memory management - zoned buddy allocator. */#ifndef CONFIG_FORCE_MAX_ZONEORDER#define MAX_ORDER 11#else#define MAX_ORDER CONFIG_FORCE_MAX_ZONEORDER#endif#define MAX_原创 2017-03-15 08:15:11 · 1894 阅读 · 0 评论 -
Linux 内存管理之memory compaction
Memory compaction The longstanding memory fragmentation problem has been covered many times in these pages. In short: as the system runs, pages tend to be scattered between users, making原创 2017-03-15 08:13:55 · 1281 阅读 · 0 评论 -
Linux Kernel 内存管理之CMA分配和释放
/** * cma_alloc() - allocate pages from contiguous area * @cma: Contiguous memory region for which the allocation is performed. * @count: Requested number of pages. * @align: Requested align原创 2017-03-15 08:12:58 · 4831 阅读 · 0 评论 -
Linux Kernel 内存管理之CMA
linux kernel中的CMA即,连续内存区管理,其提供配置为CONFIG_CMA和CONFIG_CMA_DEBUG毋庸置疑,其管理的是一块块连续内存块。这个在物理地址上是连续的。这点跟我们使用的伙伴算法以及虚拟地址有点不一样。尽管伙伴算法中使用kmalloc申请连续物理内存也可以,但是在长时间测试环境下,连续物理内存可能申请不到。因此,内核设计者设计了CMA,即连续物理内存管理。原创 2017-03-15 08:12:38 · 14345 阅读 · 0 评论 -
页描述符解读
每个物理页关联一个page描述符,这样通过软件形式维护物理内存:struct page {第1个 unsigned long flags;第2个 union { struct address_space *mapping; void *s_mem; atomic_t compound_mapcount; };第3个 union { pgoff_t ind原创 2017-03-15 08:12:17 · 1282 阅读 · 0 评论 -
Linux内核内存管理中伙伴查找和检查
对于一段连续内存块,我们这里假设为1024个页[0, 1023]。 |------------------------------------------------------| |0-------234-------------345------------678--------1023| 我们首先看看查找buddy算法,查找buddy需要一个pfn和其order。查找函数原创 2017-03-15 08:11:49 · 397 阅读 · 0 评论 -
内存管理之memblock管理之移除块 memblock_remove
memblock_removeint __init_memblock memblock_remove(phys_addr_t base, phys_addr_t size){ return memblock_remove_range(&memblock.memory, base, size);}原创 2017-03-06 09:34:29 · 746 阅读 · 0 评论 -
内存管理之memblock管理之移除块 memblock_free
memblock_freeint 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)ba原创 2017-03-06 09:31:57 · 653 阅读 · 0 评论 -
内存管理之memblock管理之移除块memblock_reserve
memblock_reserveint __init_memblock memblock_reserve(phys_addr_t base, phys_addr_t size){ memblock_dbg("memblock_reserve: [%#016llx-%#016llx] flags %#02lx %pF\n", (unsigned long long)bas原创 2017-03-06 09:27:22 · 1926 阅读 · 0 评论 -
zone_reclaim
int zone_reclaim(struct zone *zone, gfp_t gfp_mask, unsigned intorder){ int node_id; int ret; if (zone_pagecache_reclaimable(zone)min_unmapped_pages && zone_pag原创 2017-02-11 23:43:53 · 795 阅读 · 0 评论 -
__alloc_pages_slowpath
static inline struct page *__alloc_pages_slowpath(gfp_t gfp_mask, unsigned intorder, structalloc_context *ac){ boolcan_direct_reclaim = gfp_mask原创 2017-02-12 21:22:35 · 1324 阅读 · 0 评论 -
isolate_lru_page
isolate_lru_pageint isolate_lru_page(struct page *page){int ret = -EBUSY;VM_BUG_ON_PAGE(!page_count(page), page);WARN_RATELIMIT(PageTail(page), "trying to isolate tail page");i原创 2017-02-11 22:10:40 · 1201 阅读 · 0 评论 -
内存管理之bootmem管理之初始化
Discontiguous memory support,即非连续内存管理主要数据结构 struct bootmem_data#ifndef CONFIG_NO_BOOTMEM/* * node_bootmem_map is a map pointer - the bits represent all physical * memory pages (including原创 2017-03-08 08:02:10 · 479 阅读 · 0 评论 -
Linux 内存管理之node初始化
sched_class原创 2017-03-02 20:06:36 · 1557 阅读 · 0 评论 -
内存管理之函数mm_init解读之mem_init
linux kernel000000000000原创 2017-02-28 19:29:35 · 8936 阅读 · 1 评论 -
bootmem 释放页到伙伴系统
在前面介绍的mm_init中,其调用函数mem_init(),在这个函数中会把bootmem中空闲内存释放到伙伴系统。我们下面看bootmem中一个释放内存的函数free_all_bootmem unsigned long __init free_all_bootmem(void){ unsigned long total_pages = 0; bootmem_data_t原创 2017-03-01 14:15:54 · 483 阅读 · 0 评论 -
Linux 内核虚拟地址到物理地址转换讨论
memblock原创 2017-03-02 15:20:17 · 5796 阅读 · 0 评论 -
区zone的水位检查__zone_watermark_ok
sched_class原创 2017-03-02 19:35:49 · 1248 阅读 · 0 评论 -
isolate_lru_pages
static unsigned long isolate_lru_pages(unsigned longnr_to_scan, struct lruvec *lruvec, struct list_head*dst, unsignedlong *nr_scanned, struct scan_control *sc,原创 2017-02-11 22:28:35 · 896 阅读 · 0 评论 -
shrink_active_list
static void shrink_active_list(unsignedlong nr_to_scan, struct lruvec *lruvec, struct scan_control *sc, enum lru_list lru){ unsignedlong nr_taken; unsignedlong nr_scanned;原创 2017-02-11 22:45:43 · 575 阅读 · 0 评论 -
内存管理之memblock之大小限制
phys_addr_t __init_memblock memblock_start_of_DRAM(void){ return memblock.memory.regions[0].base;}phys_addr_t __init_memblock memblock_end_of_DRAM(void){ int idx = memblock.memory.cnt原创 2017-03-06 09:25:04 · 574 阅读 · 0 评论 -
pgdat_balanced
/* * pgdat_balanced() is used when checking if anode is balanced. * * For order-0, all zones must be balanced! * * For high-order allocations only zones thatmeet watermarks and are in a *原创 2017-02-11 23:21:10 · 348 阅读 · 0 评论 -
kswapd_shrink_zone
/* * kswapd shrinks the zone by the number ofpages required to reach * the high watermark. * * Returns true if kswapd scanned at least therequested number of pages to * reclaim or if the lac原创 2017-02-11 23:23:42 · 365 阅读 · 0 评论