arm64架构-内存管理学习记录
文章平均质量分 84
liuhangtiant
这个作者很懒,什么都没留下…
展开
-
build_all_zonelists函数解析
基础知识点为什么需要zonelist?之前bootmem_init初始化的时候,已经初始化了内存节点的zone成员,该成员是一个struct zone数组,存放该内存节点的zone信息。对于uma系统来说,这已经够了,因为uma系统只有一个本地内存节点,所有zone的信息都存放在本地内存节点的zone成员中。对于numa系统来说,除了本地内存节点,还可以存在一个或多个远端内...原创 2018-07-08 10:33:26 · 1667 阅读 · 1 评论 -
Linux elf文件的加载过程分析
前言在linux shell命令行启动一个程序时,实际上新启动的进程是作为shell进程的子进程存在的。shell进程会先fork出一个子进程,此时子进程是父进程的一个拷贝,所以其代码段和数据段都来自于父进程,但是子进程是要执行新的程序的,所以会调用execv函数,载入新的程序,此过程中,子进程的代码段,数据段等都会替换成新的进程的。本文主要是对elf文件的加载过程做一个简要的分析。lin...原创 2019-08-10 20:08:32 · 1887 阅读 · 0 评论 -
Linux内核各个段的权限设置
前言MMU除了管理虚拟地址到物理地址的映射外,还管理的访问权限。Linux内核分了很多段,如代码段,只读数据段,数据段等,不同的段访问权限肯定是不同的。代码段一般来说可读可执行,并且只能在特权模式下执行,但是不可写;只读数据段只能读,不能写也不能执行;数据段可以读写,不能执行。本文主要就是来介绍下linux内核各个段的权限设置问题,关于用户进程各个段的权限设置会在另外一篇文章中介绍。Linu...原创 2019-08-05 00:01:51 · 2790 阅读 · 2 评论 -
Buddy system之free_pages
释放pages的基础知识在“Buddy system基础 ”这篇文章中已经讲过了,这里主要分析释放pages的代码。代码框架free_pages |----->__free_pages(virt_to_page((void *)addr), order); | |----->__free_pages_ok(page, order); | | ...原创 2018-07-15 22:01:36 · 385 阅读 · 0 评论 -
Buddy system之alloc_pages
申请pages的基础知识在“Buddy system基础 ”这篇文章中已经讲过了,这里主要分析申请pages的代码。代码框架alloc_pages //alloc_pages_node(numa_node_id(), gfp_mask, order) |----->return __alloc_pages_node(nid, gfp_mask, order); |...原创 2018-07-15 21:58:20 · 715 阅读 · 0 评论 -
Buddy system基础
基础知识点Buddy system是linux内核中大名鼎鼎的页面管理子系统,它潜伏在linux内核底层,看起来神秘而难以捉摸。然而当揭开它神秘的面纱,才发现大道至简。如果让我用两个词来描述buddy system,我会选择:简单,优雅。什么是buddy system?buddy是伙伴的意思,buddy system就是伙伴系统。在人的社交中,伙伴是两个关系比较近的人,而在页面...原创 2018-07-15 21:33:06 · 7818 阅读 · 2 评论 -
ARMV8 MM之物理地址/虚拟地址映射
ARMV8 MM之物理地址/虚拟地址映射对于CPU来说,如果没有启动MMU,那么CPU直接通过物理地址寻址,如果启用了MMU,那么CPU通过虚拟地址寻址,MMU负责将虚拟地址转换为物理地址,进而访问实际的物理地址空间。本文主要介绍ARMV8虚拟地址到物理地址的映射方案。1. Translation stageARMV8支持两个stage的地址转换,分别是stage1和stage...原创 2018-04-18 23:21:21 · 4337 阅读 · 2 评论 -
Linux内核启动阶段虚实地址映射
前言编译kernel的时候,会通过链接脚本指定编译出来的image的布局以及image的运行地址,这里说的运行地址,是从CPU的视角来说的,是一个虚拟地址。CPU执行代码的时候,要么是顺序执行,要么是跳转到其他地址去执行,跳转的话又分为相对跳转和绝对跳转,顺序执行和相对跳转实际上都是相对PC当前位置做一个偏移,这种指令是位置无关指令,而绝对跳转是明确指定跳转到某个地址去,是位置相关指令,位置相...原创 2018-05-06 23:38:20 · 2431 阅读 · 1 评论 -
Linux内核固定虚拟地址映射
前面我们说到,为kernel image设置了虚实地址转换表,并且开启了mmu。但是现在从虚拟地址空间CPU只能看到kernel image,如果此时想访问其他物理地址空间怎么办?用ioremap吗?要知道,此时内存子系统还没有初始化,ioremap无法工作。为了解决这一问题,Linux内核定义了一段固定的虚拟地址空间,所谓固定就是说在编译时就确定的,内核启动早期会将某些物理地址映射到这段固定虚拟...原创 2018-05-20 23:10:09 · 3198 阅读 · 6 评论 -
bootmem_init函数解析
BootMem内存管理方案过于简单,无法满足内存的需求,它最重要的使命其实是为建立buddy内存管理方案服务。而bootmem_init函数就是建立buddy内存管理方案的重要一步。基础知识点内存节点在多处理其系统中,存在两种共享存储模型:UMA Uniform-Memory-Access,一致性内存访问模型。该模型中,只有一个物理内存,所有的处理器共享一个物理内存...原创 2018-06-25 00:06:42 · 1613 阅读 · 0 评论 -
BootMem之MemBlock
Memblock基础内容Memblock结构体memblock |----->bottom_up | 内存分配从高地址到低地址,还是从低地址到高地址 |----->current_limit | 可以使用的内存的上限 |----->memory | 记录完整的内存资源 |-----&a原创 2018-06-03 22:31:26 · 1567 阅读 · 2 评论 -
Linux内存管理之揭开mmap的神秘面纱
前言我们首先来看一幅图Linux内存管理的最底层是buddy内存管理方案,也就是我们常说的伙伴算法,管理伙伴算法我们不做详诉,有兴趣的可以自行百度,我们这里只要知道buddy内存池中只能分配2^n个page的内存,比如1,2,4,8……个pages,然而正常使用的时候不会碰巧就需要1,2,4,8……个pages。所以基于buddy内存池,还需要有上一级的内存管理系统,内核里面采用的是slab...原创 2019-09-02 00:32:26 · 1459 阅读 · 2 评论