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

在Linux内核的mm_struct中,'pgd‘属性是物理地址还是虚拟地址?

在Linux内核的mm_struct中,'pgd'属性是虚拟地址。

在Linux内核中,mm_struct结构体是用来描述进程的内存布局的数据结构。pgd是mm_struct结构体中的一个字段,代表Page Global Directory(页全局目录)。它是用来存储进程的页表基址(Page Table Base Address),即页表的起始地址。

页表是用来实现虚拟内存地址到物理内存地址的映射的数据结构。在x86架构中,页表采用多级结构,其中最高级的页表是页全局目录,用于建立虚拟地址到物理地址的映射。pgd保存的是页全局目录的起始地址。

由于pgd保存的是虚拟地址,因此它指向的是内核虚拟地址空间中的一个页表。在使用时,需要通过虚拟地址转换机制(例如x86的分页机制)将虚拟地址转换为物理地址。

推荐腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云服务器(ECS):https://cloud.tencent.com/product/cvm
  • 腾讯云弹性伸缩(Auto Scaling):https://cloud.tencent.com/product/as
  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云数据库(TencentDB):https://cloud.tencent.com/product/cdb
  • 腾讯云人工智能(AI):https://cloud.tencent.com/product/ai
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【内存管理】页表映射基础知识

中间8个bit位叫做L2索引,Linux内核叫做PT,页表。最低12位叫做页索引。 ARM处理器,TTBRx寄存器存放着页表基地址,我们这里一级页表有4096个页表项。...二级页表通常是动态分配,可以通过虚拟地址中间8bit位L2索引访问二级页表,L2索引存放着最终物理地址高20bit位,然后和虚拟地址低12bit位就组成了最终物理地址。...以上就是虚拟地址转换为物理地址过程。 MMU访问页表硬件实现,但页表创建和填充需要Linux内核来填充。通常,一级页表和二级页表存放在主存储器。...匿名页,即是vma->vm_ops为空,即vm_operations函数指针为空 我们知道进程task_struct结构包含了一个mm_struct结构指针,mm_struct用来描述一个进程虚拟地址空间...因此ARM移植到Linux时只能参考x86版本Linux内核实现。 X86PGD从bit22 ~ bit31,总共10bit位,1024页表项。

23410

通过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.9K32
  • Linux内核如何私闯进程地址空间并修改进程内存

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

    3.1K20

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

    根据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.3K20

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

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

    10.1K1110

    韦东山: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源文件,示例代码如下: ?

    7K40

    Linux内存管理之MMU过程

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

    2.3K42

    探秘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.3K51

    韦东山: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源文件,示例代码如下: 还有一个更简单函数:

    4K31

    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.8K41

    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 , 表示有多少个 " 进程 " 共享 " 用户虚拟地址空间 " , 即 线程组 进程

    46210

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

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

    1.5K20

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

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

    3.5K42

    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.9K30

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

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

    1.9K22

    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.7K90

    深入理解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节描述硬件页表属性相互对应,其含义与硬件页表属性含义一致。

    3.6K11

    深入理解虚拟 物理地址转换,页表--基于ARMV8

    页表转换寄存器描述符 1.1,页表/页目录结构 基于前言中内核配置,内核采用39位虚拟地址,因此可寻址范围为2^39 = 512G,采用(linux 默认为五级页表,另外还有PUD,P4D,由于本文只配置三级...; 当bit[1:0] = {1,0|0,0}时,该表项为无效项; 转换表描述符lower attributes存储相关属性信息,mmu查找到相应表项时,首先会查询属性信息,确认地址相关属性(...2.3 用户/内核PGD表基地址 基于之前分析可知,用户虚拟地址内核虚拟地址转换为物理地址时候使用不同页表基地址寄存器(TTBRx),因此他们转换基于不同全局页目录表PGD。...其中内核全局页目录表PGD存储init_mm.pgd,我们知道内核常驻内存,因此内核PGD表只有一份,他不会因为进程切换而改变,所有内核地址访问都依赖这一个PGD表;用户全局页目录表PGD存储进程描述符...页表查询,因此进程切换时,TTBR0值(task_struct.mm.pgd)要同时改变,这也与linux每一个进程都独占整个虚拟(此为512G)地址空间相对应; 三、转换流程 据此可以画出如下转换框图

    52100

    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.4K40

    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
    领券