进程内存布局

ARM64内核的内存布局

进程有用户态和内核态,同样进程的地址空间包括用户地址空间和内核地址空间,用户态访问用户地址空间,内核态访问内核地址空间,通过ION SMMU CAM分配的一块buffer,映射到用户地址空间,才能在用户态访问,映射到内核地址空间,才能在内核态访问

一、两种进程地址空间的布局介绍

1、在x86_32,虚拟地址空间从0到0xc0000000,每个用户进程有3GB可用。TASK_UNMAPPED_BASE一般起始于0x4000000(即1GB)。这意味着堆只有1GB的空间可供使用,继续增长则进入到mmap区域。这时mmap区域是自底向上扩展的。


2、使用固定值限制栈的最大长度。由于栈是有界的,因此安置内存映射的区域可以在栈末端的下方立即开始。这时mmap区是自顶向下扩展的。由于堆仍然位于虚拟地址空间中较低的区域并向上增长,因此mmap区域和堆可以相对扩展,直至耗尽虚拟地址空间中剩余的区域

二、进程的内存布局选择的工作由arch_pick_mmap_layout完成。其中arch_get_unmapped_area()完成从低地址向高地址创建新的映射,而arch_get_unmapped_area_topdown()完成从高地址向低地址创建新的映射。

kernel/msm-4.19/arch/arm64/mm/mmap.c

/*
 * This function, called very early during the creation of a new process VM
 * image, sets up which VM layout function to use:
 */
void arch_pick_mmap_layout(struct mm_struct *mm, struct rlimit *rlim_stack)
{
    unsigned long random_factor = 0UL;

    if (current->flags & PF_RANDOMIZE)
        random_factor = arch_mmap_rnd();

    /*
     * Fall back to the standard layout if the personality bit is set, or
     * if the expected stack growth is unlimited:
     */
    if (mmap_is_legacy(rlim_stack)) {
        mm->mmap_base = TASK_UNMAPPED_BASE + random_factor;
        mm->get_unmapped_area = arch_get_unmapped_area;
    } else {
        mm->mmap_base = mmap_base(random_factor, rlim_stack);
        mm->get_unmapped_area = arch_get_unmapped_area_topdown;
    }
}
三、arch_pick_mmap_layout什么时候调用

<4>[ 167.681299][02-14 21:01:39] Call trace:
<4>[ 167.681313][02-14 21:01:39] dump_backtrace+0x0/0x188
<4>[ 167.681320][02-14 21:01:39] show_stack+0x14/0x20
<4>[ 167.681329][02-14 21:01:39] dump_stack+0xc4/0xfc
<4>[ 167.681337][02-14 21:01:39] arch_pick_mmap_layout+0x198/0x1a8
<4>[ 167.681345][02-14 21:01:39] setup_new_exec+0x54/0x190
<4>[ 167.681354][02-14 21:01:39] load_elf_binary+0x328/0x1508
<4>[ 167.681359][02-14 21:01:39] search_binary_handler+0xac/0x218
<4>[ 167.681364][02-14 21:01:39] __do_execve_file+0x6ec/0x9d8
<4>[ 167.681369][02-14 21:01:39] set_binfmt+0x8c/0x1d8
<4>[ 167.681375][02-14 21:01:39] __arm_smccc_hvc+0x154/0x49c
<4>[ 167.681381][02-14 21:01:39] __arm_smccc_hvc+0x98/0x49c
<4>[ 167.681388][02-14 21:01:39] el0_svc+0x8/0xc


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容