首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

通过fork来剖析Linux内核内存管理和进程管理(上)

实际上,除了0号进程,其他所有进程无论内核线程还是普通用户进程和线程都是fork出来,而创建进程内核所做事情,要么在内核空间直接创建出所谓内核线程,要么通过fork,clone这样系统调用陷入内核空间来创建..._el1,当进行va->pa转换时候,mmu会判断地址属于用户空间地址还是内核空间,如果用户空间就使用ttbr0_el1作为base来进行页表walk,当地址属于内核空间地址就使用ttbr1_el1...内核将mm->pgd虚拟地址转化为物理地址之后设置到了ttbr0_el1,将为进程分配ASID设置到了ttbr1_el1(其实ttbr0_el1和ttbr1_el1都有ASID域,究竟设置到那个寄存器由...2)访问内核空间虚拟地址 访问内核空间虚拟地址,也会首先从tlb查找对应表项,找不到就会从ttbr1_el1开始遍历各级页表,然后最终将叶子表项(即是最后一级页表表项)填充到tlb,并返回物理地址...没有找到就要接受系统惩罚,需要遍历多级页表项然后获得所需要表项从表项获得物理地址,这个过程呢需要根据用户空间虚拟地址还是内核空间虚拟地址,从ttbr0_el1或 ttbr1_el1开始遍历多级页表

1.7K21

Linux内核如何私闯进程地址空间并修改进程内存

我们知道,原始野人社会,没有家庭观念,所有的资源都是部落内共享,所有的野人都可以以任意方式在任意时间和任何其他野人交互。类似Dos这样操作系统就是这样,内存地址空间并没有隔离。...操作系统,家庭类似于虚拟地址空间,而房子就是页表。 邻居不能闯入你房子,但特权管理机构只要理由充分,就可以进入普通人家房子,touch这家人东西。...---- 仔细看上面那个内核模块 get_pte 函数,这个函数要想写对,你必须对你想蹂躏进程所在机器MMU有一定了解,比如是32位系统还是64位系统,3级页表还是4级页表或者5级?...有啊,别忘了一切皆文件,恰好在proc文件系统,就有这么一个文件: /proc/$pid/pagemap 读取这个文件,得到就是进程虚拟地址页表项,下图截自内核Doc:Documentation/...---- 虚拟地址空间每进程,而物理地址空间则是所有进程共享。换句话说,物理地址全局

3K20
您找到你想要的搜索结果了吗?
是的
没有找到

手动玩转虚拟地址物理地址转化

根据TTBR(0/1)寄存器获取到页表基地址 页表基地址+PGD_Index获取PGD一项,此项就是PMD表基地址 根据PDM基地址+PMD_Index获取PMD一项,此项就是PTE表基地址...根据PTE基地址+PTE_Index获取直接页表基地址 根据直接页表地址+offset就可以获取真正物理地址 转化之前先确认此地址属于用户空间还是内核空间。...用户地址:页表基地址mm_structpgd 内核空间: 页表基地址init_mm→pgd 很明显我们需要转化地址属于内核空间,则首先需要确认init_mm→pgd值,它来了 init_mm...present意思页是否有效,无效代表虚拟到物理地址之间转化无效,当访问虚拟地址时候就会page fault protection :权限之类,是否读写执行权限之类。...如果你访问一段虚拟地址,页表无法执行权限,但是你想执行这段代码就会出错 reference: 引用之类 cache: cache是否有效。

2.2K20

Linux内存管理之MMU过程

「那么CPU如何通过MMU和Cache来访问内存呢?」 ? 可以看出虚拟地址物理地址转换关键过程Table Walk Unit。...虚拟地址转换为物理地址本质 我们知道内核寻址空间大小由CONFIG_ARM64_VA_BITS控制,这里以48位为例,ARMv8,Kernel Space页表基地址存放在TTBR1_EL1...有了宏观概念,下面我们以内核态寻址过程为例看下如何把虚拟地址转换为物理地址。...不管页表还是要访问数据都是以页为单位存放在主存,因此每次访问内存时都要先获得基址,再通过索引(或偏移)页内访问数据,因此可以将线性地址看作若干个索引集合。...下面我们动手操作一下,通过代码来深度理解下虚拟地址如何转化为物理地址

2.2K42

韦东山:Linux驱动程序基石之mmap

解析如下: ① 每个APP在内核中都有一个task_struct结构体,它用来描述一个进程; ② 每个APP都要占据内存,task_struct中用mm_struct来管理进程占用内存; 内存在虚拟地址...、物理地址mm_struct中用mmap来描述虚拟地址,用pgd来描述对应物理地址。...每一个APP虚拟地址可能相同,物理地址不相同,这些对应关系保存在pgd。...二级页表地址旺射最小单位有4K、1K,Linux使用4K。 一级页表项里内容,决定了它是指向一块物理内存,还是指问二级页表,如下图: ?...3.3, 驱动程序要做事 驱动程序要做事情有3点: ① 确定物理地址 ② 确定属性:是否使用cache、buffer ③ 建立映射关系 参考Linux源文件,示例代码如下: ?

6.9K40

深入理解Linux内核进程上下文切换

实际上linux内核,进程上下文包括进程虚拟地址空间和硬件上下文。...,而这个地址空间linux内核通过数据结构来描述出来,从而使得每一个进程都感觉到自己拥有整个内存假象,cpu访问指令和数据最终会落实到实际物理地址,对用进程而言通过缺页异常来分配和建立页表映射...pgd中保存进程页全局目录虚拟地址(本文会涉及到页表相关一些概念,在此不是重点,不清楚可以查阅相关资料,后期有机会会讲解进程页表),记住保存虚拟地址,那么pgd何时被设置呢?...181行,最终将进程pgd虚拟地址转化为物理地址存放在ttbr0_el1,这是用户空间页表基址寄存器,当访问用户空间地址时候mmu会通过这个寄存器来做遍历页表获得物理地址(ttbr1_el1内核空间页表基址寄存器...),每次用户虚拟地址访问时候(内核空间共享不考虑),由于页表基地址寄存器内存放当前执行进程页全局目录物理地址,所以访问自己一套页表,拿到属于自己物理地址(实际上,进程访问虚拟地址空间指令数据时候不断发生缺页异常

9.2K109

探秘malloc如何申请内存

当我们尝试第一次读或者写时候,就会经过如下步骤: CPU将此虚拟地址,送到MMU上去 MMU会做虚拟到物理地址转化 MMU操作时发现,此虚拟地址还没有建立物理地址关系,则发生exception...当我们尝试写这个虚拟地址时候,就会发生上面一系列操作,我通过修改内核代码,当在申请此虚拟地址时候会发生panic,然后抓到dump。...can_reuse_spf_vma(vma, addr)) //如果不存在vma,则通过地址找到vma,vmamm_struct红黑树,只需要找此地址属于start...return 0; } 此函数主要是确认下当前错误来自内核还是应用层 当调用__do_page_fault处理完毕后,就会对结果做进一步处理 如果用户空间,则后发信号方式告知。...虚拟地址物理地址转化文档(手动玩转虚拟地址物理地址转化) 虚拟地址:0x00000076143BC000 mm_structpgd = rd(0xFFFFFFE2E5D8B000) = 0xE5D80003

2.3K40

韦东山:Linux驱动程序基石之mmap

映射关系保存在页表: 解析如下: ① 每个APP在内核中都有一个task_struct结构体,它用来描述一个进程; ② 每个APP都要占据内存,task_struct中用mm_struct来管理进程占用内存...; 内存在虚拟地址物理地址mm_struct中用mmap来描述虚拟地址,用pgd来描述对应物理地址。...vm_area_structvm_start、vm_end虚拟地址。 ④ vm_area_struct虚拟地址如何映射到物理地址去?...每一个APP虚拟地址可能相同,物理地址不相同,这些对应关系保存在pgd。...3.3, 驱动程序要做事 驱动程序要做事情有3点: ① 确定物理地址 ② 确定属性:是否使用cache、buffer ③ 建立映射关系 参考Linux源文件,示例代码如下: 还有一个更简单函数:

3.8K21

Linux用户态进程内存管理

下面闲话少说,开始本篇内容——进程内存消耗和泄漏 进程虚拟地址空间VMA(Virtual Memory Area) linux操作系统,每个进程都通过一个task_struct结构体描叙,每个进程地址空间都通过一个...上图中,task_structmm_struct就代表进程整个内存资源,mm_structpgd为页表,mmap指针指向vm_area_struct链表每一个节点就代表进程一个虚拟地址空间...但由于Lazy机制,这100M其实并没有获得,这100M全部映射到一个物理地址相同零页,且页表记录权限为只读。...,缺页中断处理程序读出虚拟地址和原因,去VMA查,发现是用户程序写malloc合法区域且有写权限,Linux内核就真正申请内存,页表对应一页权限也修改为R+W。...一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS 推荐阅读: CPU如何访问内存物理地址虚拟地址分布 Linux内核内存管理算法Buddy和Slab

2.7K41

Linux 内核 内存管理】虚拟地址空间布局架构 ③ ( 内存描述符 mm_struct 结构体成员分析 | mmap | mm_rb | task_size | pgd | mm_users )

文章目录 一、mm_struct 结构体成员分析 1、mmap 成员 2、mm_rb 成员 3、get_unmapped_area 函数指针 4、task_size 成员 5、pgd 成员 6、mm_users...成员 7、mm_count 成员 一、mm_struct 结构体成员分析 ---- mm_struct 结构体 Linux 源码 linux-4.12\include\linux\mm_types.h...#359 位置 ; 参考 【Linux 内核 内存管理】虚拟地址空间布局架构 ② ( 用户虚拟地址空间组成 | 内存描述符 mm_struct 结构体源码 ) 博客 ; 下面开始分析 mm_struct..." 大小 ; unsigned long task_size; /* size of task vm space */ 5、pgd 成员 pgd_t * pgd , 该指针指向 " 内存页 " 全局目录..., 第一级页表 ; pgd_t * pgd; 6、mm_users 成员 atomic_t mm_users , 表示有多少个 " 进程 " 共享 " 用户虚拟地址空间 " , 即 线程组 进程

39310

Linux虚拟地址空间 --- 虚拟地址、空间布局、内存描述符、写时拷贝、页表…

(多提一句,static修饰全局变量会由原来外部链接属性改为内部链接属性) 9.内核空间: 非常抱歉,我当前这个水平无法给您讲解透彻内核空间知识,下面的知识内容我从腾讯云开发社区找到内容,...虚拟地址空间本质就是内核一种数据结构,叫做mm_struct结构体,这个结构体描述虚拟地址空间最核心结构。 4.mm_struct内部结构(详谈OS画大饼) 1....因为虚拟地址包含所有的地址,也就是4GB空间,虽然虚拟,但是进程可以使用呀,所以如果进程虚拟地址访问了某个本不该属于当前进程地址,接下来通过页表映射到物理地址这个阶段,页表就会拦截进程非法访问地址请求...mm_struct里面,mm_struct无论区域起始和结束地址,还是区域里面程序对应代码和数据,都被操作系统填充好了,至于栈和堆空间开辟,CPU读取mm_struct代码段时候,也就是进程运行期间由操作系统分配相应空间就好了...还是选择32位虚拟地址空间编址,一个4GB一个16GB,但也没啥用,因为都是虚拟,仅仅只是空间范围而已。

1.4K20

Linux用户态进程内存管理

下面闲话少说,开始本篇内容——进程内存消耗和泄漏 进程虚拟地址空间VMA(Virtual Memory Area) linux操作系统,每个进程都通过一个task_struct结构体描叙,每个进程地址空间都通过一个...上图中,task_structmm_struct就代表进程整个内存资源,mm_structpgd为页表,mmap指针指向vm_area_struct链表每一个节点就代表进程一个虚拟地址空间...但由于Lazy机制,这100M其实并没有获得,这100M全部映射到一个物理地址相同零页,且页表记录权限为只读。...,缺页中断处理程序读出虚拟地址和原因,去VMA查,发现是用户程序写malloc合法区域且有写权限,Linux内核就真正申请内存,页表对应一页权限也修改为R+W。...malloc分配原理 malloc过程其实就是把VMA分配到各种段当中,这时候没有真正分配物理地址

2.8K30

深入理解Linux内核页表映射分页机制原理

可见页表所需要空间很大,所以页表都存储物理内存。即MMU通将虚拟地址转换为物理地址,需要访问物理内存对应页表。...pgd_offset_k(addr) 根据入参虚拟地址address和init_mm,找到address页全局目录相应表项线性地址。仅用于内核页表。...页表映射过程MMU通过TTBRx和虚拟地址VA[31:20]索引到PGD一级页表,再由PGD一级页表和虚拟地址VA[19:12]索引到PTE页映射表,由PTE页映射表和虚拟地址VA[11:0]索引到物理地址...二级页表属性没有“dirty”位。 而Linux有一个三层页表结构,可以很容易地将其包装成适合两层页表结构—只使用PGD和PTE。...3.2节描述硬件页表属性相互对应,其含义与硬件页表属性含义一致。

2.9K10

Linux分页机制之分页机制实现详解--Linux内存管理(八)

因此,虚拟地址转化物理物理地址过程,每访问一级页表就会访问一次内存。 3.1.2 页表项 页表项从四种页表项数据结构可以看出,每个页表项其实就是一个无符号长整型数据。...每个页表项分两大类信息:页框基地址和页属性信息。x86-32体系结构,每个页表项结构图如下: ? 这个图一个通用模型,其中页表项前20位物理页基地址。...不管那一级页表,它功能就是建立虚拟地址物理地址之间映射关系,一个页和一个页框之间映射关系体现在页表项。...不管页表还是要访问数据都是以页为单 位存放在主存,因此每次访问内存时都要先获得基址,再通过索引(或偏移)页内访问数据,因此可以将线性地址看作若干个索引集合。...通过如下几个函数,不断向下索引,就可以从进程页表搜索特定地址对应页面对象 宏函数 说明 pgd_offset 根据当前虚拟地址和当前进程mm_struct获取pgd项 pud_offset 参数为指向页全局目录项指针

3.3K41

Linux内存管理--基本概念

• 内存节点node 内存节点node计算机系统对物理内存一种描述方法,一个总线主设备访问位于同一个节点中任意内存单元所花代价相同,而访问任意两个不同节点中内存单元所花代价不同...Linux内核中使用数据结构pg_data_t来表示内存节点node。如常用ARM架构为UMA架构。...如基于IA32体系结构个人计算机系统,由于历史原因使得ISA设备只能使用最低16MB来进行DMA传输。又如,由于Linux内核采用 • 物理页框page 2....每个pte_t指向一个物理页地址,并且所有的地址都是页对齐。因此32位地址中有PAGE_SHIFT(12)位空闲,它可以为PTE状态位。...• pgd_offset 根据当前虚拟地址和当前进程mm_struct获取pgd宏定义如下: • pmd_offset 根据通过pgd_offset

1.6K90

Linux内核页表管理-那些鲜为人知秘密

,而页表管理虚拟内存管理尤为重要,本文主要以回答几个页表管理关键性问题来解析Linux内核页表管理,看一看页表管理那些鲜为人知秘密。...页表存放在物理内存,打开mmu之后,如果需要修改页表,需要将页表所在物理地址映射到虚拟地址才能访问页表(如内核初始化后会将物理内存线性映射,这样通过物理地址虚拟地址偏移就可以获得页表物理地址对应虚拟地址...页表项存放实? 页表基地址寄存器和各级页表项存放都是物理地址,而不是虚拟地址。 5. 开启mmu后地址转换过程?...虚拟地址转换物理地址过程:打开mmu后,cpu访问都是虚拟地址,当cpu访问一个虚拟地址时候,会通过cpu内部mmu来查询物理地址,mmu首先通过虚拟地址tlb查找,如果找到相应表项,直接获得物理地址...,可以将各级页表放到物理内存任何地方,无论硬件遍历还是内核遍历,比一级页表更复杂,但是为了节省内存,内核选择多级页表结构。

1.7K21

Linux C程序真的不能访问NULL指针吗?

本文表达宗旨: 任何虚拟地址,只要有合法页表映射,就能访问! ---- 提到C语言编程,我想几乎所有人都遭遇过NULL指针。我们代码总是不断判断指针是否为NULL: if (p1 !...---- 现代操作系统,程序访问地址都是虚拟地址,硬件MMU结合操作系统创建页表会在进程私有虚拟地址和全局物理地址之间做映射,当程序访问一个虚拟地址时候,该映射会将这次访问转换成到物理地址访问...所以, segfault本质程序访问虚拟内存地址无法合理映射到物理地址一种错误通知。 引发segfault地址成为非法地址。...下面该写内核模块了,为了简化操作,这里采用Guru模式stap脚本来进行编程: // mapNULL.stp%{#include #include <linux/sched.h...很显然,used内存calloc返回,这种内存被malloc内存管理结构锁管理,第一行16字节就是这种管理机构,如果我们破坏掉它,那么最后free处就会出错。

3.3K10

Linux内存管理与KSMA攻击

ARMv8 上面说过,64位CPU虚拟地址支持64位寻址,但实际上以目前硬件来看根本用不了这么多,对于Linux内核而言,ARMv8目标编译时可以指定虚拟地址位数,使用CONFIG_ARM64...Linux实现 上面ARMv8所支持页表分级策略,下面介绍Linux内核代码具体实现。...MMU启动过程,前者作为TTBR0,后者TTBR1。idmap,即identity map,表示物理地址虚拟地址一致映射关系,这是为了保证MMU开启前后代码临界区正确性。...其中Block类型Lower Attribute包含了Block地址读写属性: lower AP[2:1]即bits[7:6]取值所代表读写属性如下: ap KMSA原理,通过一次内核写...,特定地址伪造D_Block,伪造结果令我们可以一块新虚拟地址上(再次)映射内核物理地址

1.3K40

Linux内存描述之高端内存--Linux内存管理(五)

Linux内核高端内存由来 2.1 为什么需要高端内存? 高端内存物理地址大于 896M 内存。对于这样内存,无法内核直接映射空间”进行映射。...保护模式下,我们知道无论CPU运行于用户态还是核心态,CPU执行程序所访问地址都是虚拟地址,MMU 必须通过读取控制寄存器CR3值作为当前页面目录指针,进而根据分页内存映射机制(参看相关文档)...每个进程都有其自身页面目录PGDLinux将该目录指针存放在与进程对应内存结构task_struct.(struct mm_struct)mm->pgd。...现在进程A进入了内核 系统空间中运行,MMU根据其PGD虚拟地址完成到物理地址映射,最终完成从用户空间到系统空间数据复制。...进程切换时,要将寄存器CR3设置成指 向新进程页目录PGD,而该目录起始地址在内核空间中虚地址,但CR3所需要物理地址,这时候就要用__pa()进行地址转换。

12.2K22

ARM32 页表映射

32bitLinux内核中一般采用3层映射模型,第1层页面目录(PGD),第2层页面中间目录(PMD),第3层才是页面映射表(PTE)。...将这个12bit物理地址虚拟地址低20bit拼凑在一起,就得到32bit物理地址; 如果使用页面映射方式,段映射表就变成了一级映射表(First Level table,linux内核成为...我们从ARM linux内核建立具体内存区间页表映射过程来看页表映射如何实现。...prot_pte标志位linux内核采用,定义arch/arm/include/asm/pgtable-2level.h头文件。...代码L_PTE_VAILD和L_PTE_NONE这两个软件比特位后来添加,因此linux3.7及以前内核版本更加容易理解; 为什么这里要把ARM硬件版本页面表项内容清零呢?

2.8K30
领券