首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

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

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地址空间。

66010

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

1 linux的分页机制 1.1 四级分页机制 前面我们提到Linux内核仅使用了较少的分段机制,但是却对分页机制的依赖性很强,其使用一种适合32位和64位结构的通用分页模型,该模型使用四级分页机制,即...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.3K41

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)的基地址。...PUD页表:pgd(pud)-->pmd-->pte; 4.pgd_offset_k函数 通过pgd_offset_k()宏来得到具体的PGD页面目录项的表项。

95820

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

Linux宏定义可以看出PGDIR_SHIFT对应PML4,值为39;PUD_SHIFT对应Directory Ptr,值为30;PMD_SHIFT对应Directory,值为21;使用4KB也大小时...因此,在这里稍微调整了实现—告诉Linux在第一级有2048个条目,每个都是8字节。二级页表包含两个连续排列的硬件PTE表项,前面的表项是包含Linux需要的状态信息的Linux PTE。...ARMv7页表属性的定义分为Linux版本的页表和ARMv7硬件的页表。 Linux版本的PTE页表属性定义加入前缀L_,如下所示: /* * "Linux" PTE definitions....define PMD_SIZE 2MB #define PTRS_PER_PMD 512 ARMv8 Linux下发PGD,PUD,PMD,PTE并没有使用汇编语言,而是使用C语言实现,对应的函数如下...pudp, pud); /* 将pud写入pudp所指地址 */ if (pud_valid(pud)) { dsb(ishst); isb(); } } static inline void

3.1K10

内核必须懂(七): Linux四级页表(x64)

目录 前言 Intel四级页表 实操寻址 获取cr3 获取PGD 获取PUD 获取PMD 获取PTE 获取内容 最后 ---- 前言 Linux四级页表的作用主要就是地址映射, 将逻辑地址映射到物理地址...Linux的四级页表就是依据CPU的四级页表来设计的. 这里主要说的就是Intel x64页面大小为4KB的情况, 如图所示: ?...在Linux当中, 第一级页表称为PGD, 当然是有历史原因的, 可以自行google. 所以Linux的四级页表分别是PGD -> PUD -> PMD -> PTE. ?.../fileview /dev/dram 输入之前计算出来的地址0x40c787f8, 就可以得到之中的内容, 也就是PUD, 从CPU图来说就是PDPTE: ?...---- 获取PUD 这里获取到的是67 50 75 76 00 00 00 80, 但是注意, Intel是和显示顺序反过来的. 也就是76755067, 然后后面的12-bits是页面属性.

7K40

宋宝华: ARM64 Linux内核页表的块映射

当然,更牛逼的情况下,内核应该也可以直接用【38:30】位的PUD来进行映射,这样映射关系是1GB的,则整个1GB后面占TLB的时候,只需要占一个入口。 ?...但是对于内核的线性映射区域而言,即便我们进行了1GB的PUD映射,这1G内部就可以进一步切割为4KB页或者2MB的巨页。记住:内核态的线性映射区的映射只是个映射关系,不是个分配关系。...我用qemu启动了一个4GB内存的ARM64虚拟机,可以看到前1GB的虚拟地址空间大多数是PMD和PTE映射,后面的3GB,全是PUD映射: ?...=0: $ cat /proc/cmdline root=/dev/vda2 rw console=ttyAMA0 ip=dhcp rodata=0 原因是内核在几种情况下,是不会做这种PMD和PUD...牧春童鞋在“Linux阅码场”这里还有一些精彩的文章: 宋牧春:Linux设备树文件结构与解析深度分析(1) 宋牧春:Linux设备树文件结构与解析深度分析(2) 宋牧春:多图详解Linux内存分配器

3.3K10

Linux 匿名页的反向映射

1、为什么要使用反向映射   物理内存的分页机制,一个PTE(Page Table Entry)对应一个物理页,但一个物理页可以由多个PTE与之相对应,当该页要被回收时,Linux2.4的做法是遍历每个进程的所有...之后确实采用过此方法,为每个页结构(Page)维护一个链表,这样确实节省了时间,但此链表所占用的空间及维护此链表的代价很大,在2.6中弃之不用,但反向映射机制的思想不过如此,所以还是有参考价值的 2、Linux2.6...Linux采用三级页表: PGD:顶级页表,由pgd_t项组成的数组,其中第一项指向一个二级页表。...pgd_present(*pgd)) goto out_unlock; pud = pud_offset(pgd, address); /* 获得pud...pud_present(*pud)) goto out_unlock; pmd = pmd_offset(pud, address); /* 获得pmd */ if (

3.7K31

操作系统的几种地址详解

= 0 PMD = 0 PT = 0101000111 offset = 001001011000 现在来理解Linux针对硬件的花招,因为硬件根本看不到所谓PUD,PMD,所以,本质上要求PGD索引...那么所谓先到PUD,到到PMD中做映射转换,就变成了保持原值不变,一一转手就可以了。...这样,就实现了“逻辑上指向一个PUD,再指向一个PDM,但在物理上是直接指向相应的PT的这个抽像,因为硬件根本不知道有PUD、PMD这个东西”。...= 0 PMD = 0 PT = 0101000111 offset = 001001011000 现在来理解Linux针对硬件的花招,因为硬件根本看不到所谓PUD,PMD,所以,本质上要求...这样,就实现了“逻辑上指向一个PUD,再指向一个PDM,但在物理上是直接指向相应的PT的这个抽像,因为硬件根本不知道有PUD、PMD这个东西”。

1.9K10

一文聊透 Linux 缺页异常的处理 —— 图解 Page Faults

但实际上,Linux 内核是用 TASK_SIZE_MAX 来定义用户空间的末尾的,也就是说 Linux 内核是使用 TASK_SIZE_MAX 来分割用户虚拟地址空间与内核虚拟地址空间的。...上图中展示的页目录项比特位布局笔者是按照 36 位物理内存地址所画,事实上 Linux 内核最大可支持 52 位的物理内存地址。...笔者曾在 《深入理解 Linux 物理内存管理》一文中为大家介绍了 Linux 内核在 NUMA 架构下物理内存管理的相关内容。...笔者在之前文章《一步一图带你构建 Linux 页表体系》 中的第 4.2.1 小节中详细介绍了 64 位页表项 pte 的比特位布局,以及各个比特位的含义。...= -ENOMEM); return found_page; } 前面我们提到,Linux 系统中同时允许多个交换区存在,内核将这些交换区组织在 swap_info 数组中。

1.9K22

linux内核进程创建fork源码解析

这次在自己写操作系统的时候,看了一遍linux内核的进程创建过程。算是有了比较深入的理解。     进程概念:进程是对正在运行程序的一个抽象。...下面看重要的函数dup_mmap复制vma和页表,先介绍下linux的页表结构,linux支持四级页表,但是有的cpu mmu只支持两级页表或者三级页表,比如x86_32如果不开启PAE则只支持2级页表...,开启PAE支持3级页表,x86_64支持四级页表,所以为了适应不同硬件,linux写了一个很巧妙的代码,在只支持二级页表的cpu中,pud和pmd的结果都是pgd,看以下代码 //在支持二级或三级页表的...= end); return 0; } 下面开始pud的复制函数,如果是二级三级页表返回的还是pgd ,啥也不做 /* * 复制pud表,linux通用代码实现是4级页表,但是通过高超代码设计可以适配...*src_pud, *dst_pud; //当前进程pud表,新进程pud表 unsigned long next; /* *如果cpu支持四级页表,如果pgd有对应的pud,则返回pud表指针

8.6K21

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

Linux内核为何使用多级页表?...PGD), 页4级目录(Page 4th Directory, P4D), 页上级目录(Page Upper Directory, PUD),页中间目录(Page Middle Directory..., PMD),直接页表(Page Table, PT),而支持arm64的linux使用4级页表结构分别是 pgd, pud, pmd, pt ,arm64手册中将他们分别叫做L0,L1,L2,L3级转换表...3.找到L1级转换表,然后从虚拟地址中获得L1索引,通过L1索引找到相应的表项(arm64中称为L1表描述符,内核中叫做PUD表项),从表项中获得L2转换表基地址。...4.找到L2级转换表,然后从虚拟地址中获得L2索引,通过L2索引找到相应的表项(arm64中称为L2表描述符,内核中叫做PUD表项),从表项中获得L3转换表基地址。

1.7K21

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券