美文网首页
进程内存布局

进程内存布局

作者: 牛逼人物888 | 来源:发表于2020-02-06 16:55 被阅读0次

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


相关文章

  • 进程内存布局

    ARM64内核的内存布局 进程有用户态和内核态,同样进程的地址空间包括用户地址空间和内核地址空间,用户态访问用户地...

  • 进程的内存布局

    进程的内存布局 内存地址由高到低依次是: kernel space stack:向下增长 dynamic libr...

  • 进程的内存布局

    在讲进程的内存布局,也就是进程的虚拟地址空间的时候,首先应该对虚拟内存有一定的了解:虚拟内存浅析。下面开始正题。 ...

  • Go 语言设计与实现-Part2

    20.栈内存管理 linux内存布局下图是 Linux 下一个进程里典型的内存布局image.png 栈是由高地址...

  • iOS 面试题及答案20道61~80(四)

    iOS 面试题及答案20道61~80(三) 61:谈谈iOS内存 61.1: 内存区域划分 iOS进程内存布局从高...

  • program break

    1.进程的内存分布布局 每个进程所分配的内存由很多部分组成,通常称之为段(segment) 文本段:文本段包含了进...

  • linux 内存看一篇就够了(多图)

    ​ 正文 0 内存模块 1 linux内存总体布局:内存分成用户态和内核态 4G进程地址空间解析 内核地址空间 进...

  • 进程所使用的内存空间

    进程的内存空间布局 Kernel space:内核态内存空间,用户代码无法读写,否则会导致“段错误”的异常 Ran...

  • 进程内存布局(Linux Memory Layout of a

    > text segment :这是由 C P U执行的机器指令部分 > Initialized data seg...

  • 进程内存布局(Linux Memory Layout of a

    传送门:https://www.jianshu.com/p/0cd8522b9598[https://www.ji...

网友评论

      本文标题:进程内存布局

      本文链接:https://www.haomeiwen.com/subject/mvijxhtx.html