首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏操作系统

    与三级介绍

    在操作系统与计组学习中,我们会学习到这个概念,可以说,如今计算机的函数内存调用有很大一部分都离不开的调用,本文旨在详解的概念应用以及操作系统中的三级,三级对于节省空间起了至关重要的作用 三级 所谓三级,就是将原来的虚拟地址的页码27位分为三级,每一级9位: 而原来的表工作流程也变为下图: 通过虚拟地址转换时,首先通过前9位码找到第一层目录,第一层目录中包含了中间的物理地址 : 物理地址(56位) = 底层PPN(44位) + 虚拟地址offset(12位) 在三级的基础上,假设只使用了几个页面,那么中间层只需要加载0号即可,底层只需要加载要使用的几个表项即可 ,中间层省了511个页面,底层省下了511*512个页面 简单理解,其实单级就是用长宽高之积来描述长方体,而三级就是用长、宽、高三个坐标来描述长方体,这样做的目的就是大大节省了加载所需要的空间 至此,有关于与三级的介绍就到这里了,的存在对于内核区与用户区加载代码起了至关重要的作用,真正理解的转换机制有助于我们对操作系统的虚拟内存有更深刻的认识

    1.4K10编辑于 2024-10-17
  • 来自专栏虚拟化云计算

    一文看懂影子和扩展

    后引入机制,把虚拟地址送往MMU,MMU查TLB不中的情况下,依次查就可以找到对应的物理地址。 二.影子 (Shadow page table) 影子我用一句话来描述就是:VMM把Guest和Host中的合并成一个,称为影子,来实现GVA->HPA映射。 4, 把GVA -> HPA,这一路的映射关系记录到中,这个就是影子。 虚拟机和影子通过一个哈希建立关联(当然也有其他的关联方式),客户机操作系统把当前进程的基址载入PDBR时而VMM将会截获这一特权指令,将进程的影子基址载入客户机PDBR,使客户机在恢复运行时 硬件层面引入EPTP寄存器,来指向EPT基地址。Guest运行时,Guest被载入PDBR,而 EPT 被载入专门的EPT 指针寄存器 EPTP。

    3.6K20编辑于 2023-03-27
  • 来自专栏linux驱动个人学习

    内核调试

    一、配置内核 首先配置内核,使其支持导出内核到debugfs下面: Kernel hacking ---> ---> [*] Export kernel pagetable layout to 而为了快速方便找到对应物理而将所有的帧结构体映射到此区域,后续只需使用virt_to_page, phys_to_page等宏实现虚拟地址,物理地址到对应结构体的快速查询。 地址空间port属性说明 第一列 当前的映射范围地址 第二列 代表此映射范围大小 PMD PUD PTE 当标识为PMD PUD表示当前映射为block映射,如当前为4K,则pud的block映射一次性可映射 当标识为PTE表示为映射即PAGE_SIZE大小4K。 USR AP标记,用于标识当前范围是否在用户空间还是内核空间可读可写或者仅读。 x表述当前范围特权级别模式可执行,就是内核的可执行代码段,在内核中这段一般指向内核的text*段 SHD 表示可共享属性,在arm64上表述为多核之间可共享其可见 AF 访问标志,当首次映射时,

    76610编辑于 2024-03-04
  • 来自专栏大数据那些事

    多级的好处

    ,如果只使用了一个,一个表项的大小为4byte,32位系统有4GB的物理空间(一个进程看到是4GB大小的虚拟空间),每一个表项对应着物理空间的第xxx(4KB大小的),那么应该有4GB/4KB= 如果是二级,规则就会改变,让二级对应到物理内存上的4KB大小的,一级此时变成映射为物理地址的4MB(这样子是无法定位到具体的(4KB)的,所以二级再去找),这样先找到一级,一级再和二级进行结合 ,二级表相当于一级4MB分成了1024个(1KB个)4KB,找完后二级充当了offset的角色,此时定位到具体的4KB的页面,再用一级的offset一结合定位到具体物理地址。 这样一个进程浪费掉的空间是一级占用的:(4GB/4MB)*4byte=4KB,二级浪费掉的是1kb(1个一级占用这么多)*1kb(此时有1kb(4GB/4MB)个一级)=4MB,加起来是 4MB+4KB,比光用一级要多4KB,但是2级是可以不存在的,比如此时程序只用了%20的,那么4MB就需要乘以%20,这样一下子就比只有一级时少了。

    2.2K30发布于 2021-11-29
  • 来自专栏逆向技术

    内核知识第八讲,PDE,PTE,目录,的内存管理

          内核知识第八讲,PDE,PTE,目录,的内存管理 一丶查看GDT. 首先我们的CR3寄存器保存了的首地址. 这里有一个目录,还有的关键词. 目录: 也称为PDE,而称之为PTE. 而我们Ring3下的修改内存分页保护属性,其实就是将这个的这个RW位进行置位. 而我们的虚拟地址当作下表进行查表. 我们的虚拟地址不是分为了20位了吗. 前10位当作 目录的下表.  后10位当作的下表 设有物理地址为:   00401 000 那么下表则为:   00401 = 0000000001 0000000001 通过虚拟地址得知,目录是第一项,而也是第一项. 分为高10位,和低10位做 PDE,和PTE的索引. 然后进行查表. 最后的通过PTE查询的高20位加上原虚拟地址的低12位, 然后就找到了物理地址.

    2.3K10编辑于 2022-05-10
  • 来自专栏进步集

    【进程 进程通常存在PCB中

    通俗解释进程-科学家做蛋糕 科学家做蛋糕 然后女儿被蜜蜂蛰了 进程–在内核 内存管理 经典 老式 管理方法: 基址寄存器(程序开始的地方) + 界限寄存器(程序长度) 空闲内存管理 每个框有一个编号,即“框号”(框号=帧号=内存块号=物理块号=物理页号),框号从0开始 将进程的逻辑地址空间也分为与框大小相等的一个个部分,每个部分称为一个“”或“页面”。 操作系统以框为单位为各个进程分配内存空间。进程的每个页面分别放入一个框中。也就是说,进程的页面与内存的框有一一对应的关系。 各个页面不必连续存放,可以放到不相邻的各个框中。 重要的数据结构—— 为了能知道进程的每个页面在内存中存放的位置,操作系统要为每个进程建立一张。 注:通常存在PCB中 一个进程对应一张 进程的每个页面对应一个表项 每个表项由“页号”和“块号”组成 表记录进程页面和实际存放的内存块之间的映射关系

    2.1K20编辑于 2022-11-13
  • 来自专栏linux驱动个人学习

    ARM32 映射

    32bit虚拟地址的高12bit(bit[31:20])作为访问一级的索引值,找到相应的表项,每个表项指向一个二级。 我们从ARM linux内核建立具体内存区间的映射过程中来看映射是如何实现的。 首先通过init_mm结构体得到的基地址,然后通过addr右移PGDIR_SHIFT得到pgd的索引值,最后在一级中找到表项pgd指针。 ,注意ARM Linux中实现了两份,硬件的地址r0+2048。 ) /* shared(v6), coherent(xsc3) */ #define L_PTE_NONE (_AT(pteval_t, 1) << 11) 第9~10行代码设置ARM硬件的PTE_EXT_TEX

    3.2K30发布于 2020-05-09
  • 来自专栏c++与qt学习

    操作系统多级与快--12

    2的20次方个表项都得放在内存中,需要4M内存;系统中并发10个进程,就需要40M内存。 32位: 总空间[0,4G]! 对于CPU而言,其主要瓶颈就在访存上,如果中表项不是连续的,那么就意味着,我们每执行一条指令,就额外需要10几次访存。 这显然行不通,因此中表项必须是连续的才行,即使没用到,也保留。 假设每章下面有10个小节,而我们通过看章节名,直接跳过了25个章节下面的250个小节,相当于省去了250次比较的过程 如果将这种思想放到管理上来,就引出了下面的目录(章)+(节),对于可以直接跳过其中小节的章节 对于逻辑地址(虚拟地址)而言,它的前10位表示的是目录号,即最多可以表示2^10目录,随后是10位的页号,表示一个目录下最多存放2^10表项。 目录中每个表项,可以看做是一个章节,每个章节指针指向了一个存放着2^10表项的页面,并且该页面中的表项也都是连续存放的,可以直接通过1次访存定位到具体的表项,然后通过表项找到对应的实页号。

    2.6K51编辑于 2022-08-23
  • 来自专栏逆向技术

    x86分复习之10-10-12分

    目录 x86保护模式 10 - 10 - 12分模式 一丶x86 10 - 10 -12分 1.简介 2.x86分之线性地址 3.x86分之寻址简介 二丶x86下10-10-12分寻址实战 2.1 通过CR3查询目录(也就是我所说的第一个数组) 然后数组中记录着另一个数组的起始地址() 中记录着就是物理所在的内存了. 转换之后按照10-10-12来进行分位. 10-10-12的意思就是一个线性地址有32bit(位) 我们按照 10-10-12来将这个32bit位进行分组,然后转为10进制.高位10个二进制代表查询目录的索引 第二个10位代查询的索引. 1 1 0 确定了目录是在第一项 也是第一项 所以有时候大家调试程序多的时候对0x00401000

    1.4K20发布于 2020-11-11
  • 来自专栏码农UP2U

    指针数组和的类比

    本篇文章谈一下 C 语言中的指针数组和 CPU 的的类比。 0x01:C 语言中的几个简单概念 以前学习 C 语言的时候,有一些概念好像很绕,但是仔细想想,与其说是绕,不如说是语文的理解能力有限。 0x03:指针数组和的类比 CPU 的分页机制其实和 C 语言的指针数组几乎就是同一个东西,其实就是同一个东西。除了像是指针数组外,如果用过在 CE 下找基址的话,其实我感觉也和这个很类似。 CR3 是 CPU 的一个控制寄存器,指向了顶级的基址,它其实就是一个数组指针。 至于 PML4、PDPT、PD、PT 就是数组,前面三个就是指针数组,依次指向它们的下级,它们是有层级关系的。 的整个层级只有 4 层吧,就是 4 级,主流的 Linux 好像也是四级吧。不过,新版的 Linux 中要更新到 5 级了~! 比如 C 语言的指针、汇编的寻址、上面提到的之类的。

    8410编辑于 2026-03-16
  • 来自专栏Ywrby

    25-两级

    两级 单级的问题 某计算机系统按字节寻址,支持32位的逻辑地址,采用分页存储管理,页面大小为4KB,表项长度为4B。 相应的,一个进程的中,最多会有220 = 1M = 1,048,576个表项,所以一个最大需要220*4B=2^{22}B,共需要2^{22}/2^{12}=2^{10}个框存储该页。 根据页号查询的方法:K号对应的表项存放位置=始址+K*4要在所有的表项都连续存放的基础上才能用这种方法找到表项 需要专门给进程分配2^{10}=1024个连续的框来存放它的 同时根据局部性原理可知 因此没有必要让整个都常驻内存。 问题一:必须连续存放,因此当很大时,需要占用很多个连续的框。 个表项,因此每1K个连续的表项为一组,每组刚好占一个内存块,再讲各组离散地放到各个内存块中) 另外,要为离散分配的再建立一张,称为目录,或称外层,或称顶层 问题二:没有必要让整个常驻内存

    1.5K20编辑于 2022-10-27
  • 来自专栏嵌入式iot

    ARMV8 mmu结构分析

    1.概述 armv8 mmu结构比较复杂,总体说来可以将MMU分为以下几个部分: (1)虚拟地址(VA)为48位,而一般只使用到39位(512G内核,512G用户) (2)可以配置成3级(64K )或者4级(4K) 最高的地址位是48为的地址,用4级进行管理。 2.虚拟地址格式 按照虚拟地址格式可以分为以下几种: 4K时的映射 ? 64K时的映射 ? 由于需要进行4K的映射,所以需要3个512字节的数组用来存放表项。 ? 那么我们相信分析一下的映射过程: 第一步:定义一个的开始地址 main_tll[0]=(unsigned long)((unsigned char*)&T0_L1[0]) | // physical

    2.7K10发布于 2020-03-17
  • 来自专栏Miigon's Blog

    笔记 Lab3: Page tables |

    ,9 bit 一级索引找到二级,9 bit 二级索引找到三级,9 bit 三级索引找到内存,最低 12 bit 为内偏移(即一个 4096 bytes)。 ,还会把内所有的叶节点对应的物理也释放掉。 // 递归释放进程独享的,释放本身所占用的空间,但**不释放指向的物理** kvm_free_kernelpgtbl(p->kernelpgtbl); p->kernelpgtbl 要实现这样的效果,我们需要在每一处内核对用户进行修改的时候,将同样的修改也同步应用在进程的内核上,使得两个的程序段(0 到 PLIC 段)地址空间的映射同步。 // 将 src 的一部分页映射关系拷贝到 dst 中。 // 只拷贝表项,不拷贝实际的物理内存。

    2.2K20编辑于 2022-10-27
  • 来自专栏嵌入式与Linux那些事

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

    中间的8个bit位叫做L2索引,在Linux内核中叫做PT,。最低的12位叫做索引。 在ARM处理器中,TTBRx寄存器存放着基地址,我们这里的一级有4096个表项。 MMU访问是硬件实现的,但的创建和填充需要Linux内核来填充。通常,一级和二级存放在主存储器中。 ARM32 一级表项 下面这张图来自ARMV7的手册。 bit31:bit10:指向二级基地址。 二级的表项 bit0:禁止执行标志。 X86的PGD是从bit22 ~ bit31,总共10bit位,1024表项。PT从bit12 ~ bit 21 ,总共 10 bit位,1024表项。 一套是为了迎合ARM硬件的真实,另一套是为了迎合Linux真实的。 对于PTE来说,一下子就多出了一套,一套256表项,每个表项占用4字节。

    1.2K10编辑于 2024-06-11
  • 来自专栏Linux内核深入分析

    学习ARM64转换流程

    而在Linux中存储虚拟地址到物理地址转化的关系的称为。 目前最新的linux内核已经支持了5级。下图是一个4级的转化关系图。 ? Table Entry) 如果是5级的话,会在PGD和PUD之间增加一个level叫P4D。 LINUX目前是支持5级,当然也可以通过config(CONFIG_PAGE_LEVELS)去配置的,目前手上的模拟板使用的是三级,如果使用三级的话,PUD等于PMD。 前期条件是目前配置的是3级。 目前此地址是线性地址,转化关系比较简单。 PMD_SHIFT ==> 中级目录索引的偏移 PAGE_SHIFT ==> 内的偏移 当前模拟板是只有三级,则就没有P4D和PUD,这样的话PGD=PMD了。

    2.6K21发布于 2020-04-30
  • 来自专栏乐行僧的博客

    二级的划分和由来

    46610编辑于 2022-02-25
  • 来自专栏c++与qt学习

    MIT 6.S081 Lab Three --

    修改struct proc来为每一个进程维护一个内核,修改调度程序使得切换进程时也切换内核。 对于这个步骤,每个进程的内核都应当与现有的的全局内核完全一致。 ---- 代码解析 注意一点: 实验二的要求是让每个进程在内核中执行时,使用自己的副本 本实验主要是让每个进程都有自己的内核,这样在内核中执行时使用它自己的内核的副本。 (1). 如下,历遍整个内核,然后将所有有效的表项清空为零。如果这个表项不在最后一层的上,需要继续进行递归。 不要忘记在userinit的内核中包含第一个进程的用户 用户地址的PTE在进程的内核中需要什么权限? ---- 代码解析 本实验是实现将用户空间的映射添加到每个进程的内核,将进程的用户态复制一份到进程的内核态就好。 首先添加复制函数。

    66141编辑于 2023-10-11
  • 来自专栏IOT物联网小镇

    Linux从头学16:操作系统-如何把【目录和】当做普通物理进行操作的?

    ,还要补上低位的 12 个 0); 根据线性地址的中间 10 位,找到 0x0800_4000 这个中的索引 1,从而确定普通物理的物理地址是 0x0210_1000(表项中的值是 0x02101 我们就来构造一个线性地址 addr,让它经过3次查表操作之后,能够指向目录的物理地址。 一级查表:构造线性地址的前 10 位,来确定的物理地址 一级查表:查找的对象是目录。 二级查表:构造线性地址的中间 10 位,来确定“普通”的物理地址 二级查表:查找的对象是,也就是一级查表得到的那个“”。 虽然一级查表的结果是目录自己,但是处理器不管这些,它会把这个当做来使用。 现在,来考虑线性地址addr的中间10位,它决定了中的索引号。 目录中的这个表项位于索引值256的地方,因此可以构造出线性地址的前10位是:0100_0000_00(0x100)。 所以,经过一级查表得到的这个的物理地址是 0x0800_0000。

    2.1K20发布于 2021-10-19
  • 驱动开发:内核解析内存四级

    当今操作系统普遍采用64位架构,CPU最大寻址能力虽然达到了64位,但其实仅仅只是用到了48位进行寻址,其内存管理采用了9-9-9-9-12的分页模式,9-9-9-9-12分表示物理地址拥有四级, 9-9-9-9-12的分页模式是一种常见的分页方案,其中物理地址被分成四级:PXE(Page Directory Pointer Table Entry)、PPE(Page Directory Entry 每个级别的都负责将虚拟地址映射到更具体的物理地址。通过这种层次化的结构,操作系统可以更有效地管理和分配内存。 PTE 0即可解析,如下所示,当前地址0位置处的PTE基址是FFFF898000000000,由于PTE的一个大小是0x1000所以当内存地址高于0x1000时将会切换到另一个中,如下FFFF898000000008 则是另一个中的地址。

    41430编辑于 2023-10-11
  • 驱动开发:内核解析内存四级

    当今操作系统普遍采用64位架构,CPU最大寻址能力虽然达到了64位,但其实仅仅只是用到了48位进行寻址,其内存管理采用了9-9-9-9-12的分页模式,9-9-9-9-12分表示物理地址拥有四级, 9-9-9-9-12的分页模式是一种常见的分页方案,其中物理地址被分成四级:PXE(Page Directory Pointer Table Entry)、PPE(Page Directory Entry 每个级别的都负责将虚拟地址映射到更具体的物理地址。通过这种层次化的结构,操作系统可以更有效地管理和分配内存。 PTE 0即可解析,如下所示,当前地址0位置处的PTE基址是FFFF898000000000,由于PTE的一个大小是0x1000所以当内存地址高于0x1000时将会切换到另一个中,如下FFFF898000000008 则是另一个中的地址。

    93390编辑于 2023-05-29
领券