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

Linux:页表中PGD、PUD、PMD等概念介绍

1、PGD: Page Global Directory Linux系统中每个进程对应用户空间的pgd是不一样的,但是linux内核 的pgd是一样的。...--> copy_mm() --> mm_init() --> pgd_alloc() --> set_pgd_fast() --> get_pgd_slow() --> memcpy(&PGD + USER_PTRS_PER_PGD..., swapper_pg_dir +USER_PTRS_PER_PGD, (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t)) 这样一来,每个进程的页面目录就分成了两部分...可以看出Linux系统中每个进程的页面目录的第二部分是相同的,所以从进程的角度来看,每个进程有4G字节的虚拟空间,较低的3G字节是自己的用户空间,最高的1G字节则为与所有进程以及内核共享的系统空间。...每个进程有它自己的PGD( Page Global Directory),它是一个物理页,并包含一个pgd_t数组。

3.5K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

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

    Linux 的页全局目录对应80x86 的页目录指针表(PDPT),取消了页上级目录,页中间目录对应80x86的页目录,Linux的页表对应80x86的页表。...1.3 为什么linux热衷:分页>分段 那么,为什么Linux是如此地热衷使用分页技术而对分段机制表现得那么地冷淡呢,因为Linux的进程处理很大程度上依赖于分页。...2 linux中页表处理数据结构 2.1 页表类型定义pgd_t、pmd_t、pud_t和pte_t Linux分别采用pgd_t、pmd_t、pud_t和pte_t四种数据结构来表示页全局目录项、页上级目录项...Acessed或者Dirty位被清除(对于每个现有的页表,Linux总是 强制设置这些标志)。 pud_bad宏和pgd_bad宏总是产生0。...3.2 Linux中通过4级页表访问物理内存 linux中每个进程有它自己的PGD( Page Global Directory),它是一个物理页,并包含一个pgd_t数组。

    3.5K42

    ARM32 页表映射

    在32bit中的Linux内核中一般采用3层映射模型,第1层是页面目录(PGD),第2层是页面中间目录(PMD),第3层才是页面映射表(PTE)。...因为Linux内核默认的PGD从21位开始,也就是bit[31:21],一共2048个一级页表项;而ARM32硬件结构上,PGD是从20bit开始的,页表项为4096个,比Linux内核多一倍,那么代码实现上取巧了...而在真实硬件中,一个PGD页表项,只有256个PTE,也就是说,前512个PTE页表项是给OS用的(也就是Linux内核用的页表,可以用于模拟L_PTE_DIRTY、L_PTE_YOUNG等标志位),后...因此r0指Linux版本的页面表地址,r1表示要写入的Linux版本的PTE页面表项内容,这里指Linux版本的页面表项内容,而非硬件版本的页面表项内容。...linux内核最早基于x86体系结构设计的,所以linux内核关于页表的许多术语和设计都是针对x86体系的,而ARM Linux只能从软件架构上去跟随了,因此设计了两套页表。

    2.8K30

    Linux内存初始化(下)

    我们接着看linux初始化内存的下半部分,等内存初始化后就可以进入真正的内存管理了,初始化我总结了一下,大体分为三步: 物理内存进系统前 用memblock模块来对内存进行管理 页表映射 zone初始化...前两步在linux里分别对应如下操作: fixed map 加载dtb :Uboot会将kernel image和dtb拷贝到内存中,并且将dtb物理地址告知kernel 系统解析dtb里的内存参数:...= early_pgtable_alloc();//分配一页大小的物理内存放进pgd pgd_t *pgd = pgd_set_fixmap(pgd_phys); map_kernel(pgd)...「Linux是如何组织物理内存的?」...最后 至此linux对物理内存的初始化和虚拟地址和物理地址的映射关系算是告一段落,相信你已经知道 linux 虚拟寻址空间layout的来龙去脉,以及如何把物理内存通过node, zone, page

    3.1K31

    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 , 表示 " 用户虚拟地址空间 " 大小 ; unsigned long task_size; /* size of task vm space */ 5、pgd...成员 pgd_t * pgd , 该指针指向 " 内存页 " 全局目录 , 第一级的页表 ; pgd_t * pgd; 6、mm_users 成员 atomic_t mm_users , 表示有多少个

    46010

    1.ARMv8-A架构

    TTBRx寄存器保存了第0级页表的基地址(L0 Table base address, Linux内核中称为PGD), L0页表中有512个表项(Table Descriptor),以虚拟地址的bit[...每个表项的内容含有下一级页表的基地址,即L1页表(Linux内核中称为PUD)的基地址。...PUD页表中有512个表项,以虚拟地址的bit[38:30]为索引值在PUD表中查找相应的表项,每个表项的内容含有下一级页表的基地址,即L2页表(Linux内核中称为PMD)的基地址。...PMD页表中有512个表项,以虚拟地址的bit[29:21]为索引值在PMD表中查找相应的表项,每个表项的内容含有下一级页表的基地址,即L3页表(Linux内核中称为PTE)的基地址。...首先通过init_mm数据结构的pgd成员来获取PGD页表的基地址,然后通过pgd_index()来计算PGD页表中的偏移量offset。

    1K21

    内核启动时为什么要做线性映射?

    10年以上工作经验,主要从事系统软件开发,涵盖:系统库开发、指令集优化、Linux内核开发等。累计为某些开源社贡献过一定数量的patch。...在 Linux 内核启动之后,对于 32 位的系统来说,他会把 0 ~ 896M 这部分低端内存(low memory)都做线性映射,不管这部分内存是否需要用到。...注意:linux内核虽然在开机的时候,映射了(对于64为平台来说)所有物理内存,但是他并没占有这些内存,只是为了访问方便。 以下代码来自于:linux-5.15,ARM64架构。...注意,对于一个典型ARM64 Linux架构来说,pte能映射2^9*4K = 2M地址空间。...注意,对于一个典型ARM64 Linux架构来说,pmd能映射2^9*2M = 1G地址空间。

    77510

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

    页表的一些术语 现在Linux内核中支持四级页表的映射,我们先看下内核中关于页表的一些术语: 全局目录项,PGD(Page Global Directory) 上级目录项,PUD(Page Upper...Linux内核关于页表的函数 Linux内核中页表操作的宏定义 Linux内核中封装了很多宏来处理页表 #define pgd_offset_k(addr) pgd_offset(&init_mm,addr...ARM32页表和Linux页表那些奇葩的地方 ARM32硬件页表中PGD页目录项PGD是从20位开始的,但是为何头文件定义是从21位开始?...因此ARM在移植到Linux时只能参考x86版本的Linux内核的实现。 X86的PGD是从bit22 ~ bit31,总共10bit位,1024页表项。...因此,Linux实现的时候,就分配了一个page 来存放这些页表。 这一套方案的话,相当于每个PGD页表项有8字节,包含指向两套PTE页表项的entry。每4个字节指向一个物理的二级页表。

    22910

    ARM64 Kernel Image Mapping的变化

    来源: wowotech | http://www.wowotech.net/memory_management/436.html 引言 随着linux的代码更新,阅读linux-4.15代码,从中发现很多与众不同的地方...而是因为linux代码更新的太快,网上的博客和书籍跟不上linux的步伐而已。究竟是哪些发生了差异了?...这段映射在linux中称为identity mapping。第二次是kernel image映射。而这段映射在linux-4.15代码上映射区域是VMALLOC区域。...例如计算virt地址在PGD也表中的indedx,可以传递shift = PGDIR_SHIFT,ptrs = PTRS_PER_PGD,tbl传递PGD页表基地址。...当然是利用linux中常用手段自定义代码段。自定义的代码段的名称是".idmap.text"。除此之外,肯定还需要在链接脚本中声明两个标量,用来标记代码段的开始和结束。

    2.3K40

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

    页表转换寄存器描述符 1.1,页表/页目录结构 基于前言中的内核配置,内核采用39位虚拟地址,因此可寻址范围为2^39 = 512G,采用(linux 默认为五级页表,另外还有PUD,P4D,由于本文只配置三级...2.3 用户/内核PGD表基地址 基于之前的分析可知,用户虚拟地址和内核虚拟地址转换为物理地址的时候使用不同的页表基地址寄存器(TTBRx),因此他们的转换是基于不同的全局页目录表PGD。...其中内核全局页目录表PGD存储在init_mm.pgd中,我们知道内核是常驻内存的,因此内核的PGD表只有一份,他不会因为进程的切换而改变,所有内核地址访问都依赖这一个PGD表;用户全局页目录表PGD存储在进程描述符...task_struct.mm.pgd中,他是在用户进程被创建时同步被创建的,每一个进程描述符task_struct都对应有自己的task_struct.mm.pgd表,进程所有地址的访问都依赖于对应的task_struct.mm.pgd...页表的查询,因此在进程切换时,TTBR0中的值(task_struct.mm.pgd)是要同时改变的,这也与linux中每一个进程都独占整个虚拟(此为512G)地址空间相对应; 三、转换流程 据此可以画出如下转换框图

    52000

    Linux 匿名页的反向映射

    我们知道LINUX的内存管理系统中有”反向映射“这一说,目的是为了快速去查找出一个特定的物理页在哪些进程中被映射到了什么地址,这样如果我们想把这一页换出(SWAP),或是迁移(Migrate)的时候,就能相应该更改所有相关进程的页表来达到这个目的...1、为什么要使用反向映射   物理内存的分页机制,一个PTE(Page Table Entry)对应一个物理页,但一个物理页可以由多个PTE与之相对应,当该页要被回收时,Linux2.4的做法是遍历每个进程的所有...之后确实采用过此方法,为每个页结构(Page)维护一个链表,这样确实节省了时间,但此链表所占用的空间及维护此链表的代价很大,在2.6中弃之不用,但反向映射机制的思想不过如此,所以还是有参考价值的 2、Linux2.6...Linux采用三级页表: PGD:顶级页表,由pgd_t项组成的数组,其中第一项指向一个二级页表。...pgd_offset(mm, address) ((mm)->pgd+pgd_index(address)) // 再加上全局描述符基地址(存储在内存描述符mm_struct中的

    3.7K31

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

    set_pgd(pgdp, pgd) 向PGD写入指定的值 set_p4d(p4dp, p4d) 向P4D写入指定的值 分页机制与CPU体系架构强相关,因此分析Linux Kernel分页时还是需要根据体系架构分析...Linux对于上述PGD,PTE等数据的定义位于ARM体系架构目录,如下所示: /* * PMD_SHIFT determines the size of the area a second-level...而Linux有一个三层的页表结构,可以很容易地将其包装成适合两层的页表结构—只使用PGD和PTE。但是,Linux还要求每个页面有一个“PTE”表,而且至少要有一个“dirty”位。...define PMD_SIZE 2MB #define PTRS_PER_PMD 512 ARMv8 Linux下发PGD,PUD,PMD,PTE并没有使用汇编语言,而是使用C语言实现,对应的函数如下.../* 向内存下发PGD页表,入参分别为pgd页表虚拟地址和pgd表项*/ static inline void set_pgd(pgd_t *pgdp, pgd_t pgd) { if (in_swapper_pgdir

    3.6K11
    领券