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

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

,而管理是在虚拟内存管理中尤为重要,本文主要以回答几个管理中关键性问题来解析Linux内核管理,看一看管理中那些鲜为人知秘密。...Linux内核为何使用多级?...2)使用多级结构优劣: 优势: 1.节省内存 2.可以按需分配各级 3.可以离散存储 劣势: 需要遍历多级,需要多次访问内存,实现复杂度高点 3)Linux内核综合考虑: 典型以时间换空间...2)Linux内核 填写,将基地址告诉mmu 内核初始化建立内核,实现缺页异常等机制为用户任务按需分配并映射。 当然,内核也可以遍历,如缺页异常时遍历进程。 10...., PMD),直接(Page Table, PT),而支持arm64linux使用4级结构分别是 pgd, pud, pmd, pt ,arm64手册中将他们分别叫做L0,L1,L2,L3级转换

1.7K21

多级好处

,如果只使用了一个,一个表项大小为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,这样一下子就比只有一级时少了。

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

一文看懂影子和扩展

二.影子 (Shadow page table) 影子我用一句话来描述就是:VMM把Guest和Host中合并成一个,称为影子,来实现GVA->HPA映射。...3, HVA->HPA,这一过程就是我们已知使用物理MMU完成VMM进程虚拟内存到物理内存转换。 4, 把GVA -> HPA,这一路映射关系记录到中,这个就是影子。...虚拟机和影子通过一个哈希建立关联(当然也有其他关联方式),客户机操作系统把当前进程基址载入PDBR时而VMM将会截获这一特权指令,将进程影子基址载入客户机PDBR,使客户机在恢复运行时...Guest运行时,Guest被载入PDBR,而 EPT 被载入专门EPT 指针寄存器 EPTP。...找到了目录HPA基地址,再通过GVA中Directory offset段,就找到VGA了,这个VGA再去EPT中进行GPA->HPA转换,就找到VGAHPA了。

1.5K20

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

进行"自操作" 在 x86 系统中,内存管理中分页机制是非常重要,在Linux操作系统相关各种书籍中,这部分内容也是重笔浓彩。...如果你看过 Linux 内核相关书籍,一定对下面这张图又熟悉、又恐惧: 这是 Linux 系统中,处理单元多级查询方式。...其中黄色背景部分:上级目录索引 和 中间目录索引,是 Linux 系统自己扩展,在原本 x86 处理器中是不存在,这也是导致 Linux 中相关部分代码更加复杂原因。...文章链接在此:Linux从头学15:【目录和】-理论 + 实例 + 图文最完全、最接地气详解!,但是其中有一个环节被特意忽略过去了。...详细讨论过程,请参考上一篇文章:Linux从头学15:【目录和】-理论 + 实例 + 图文最完全、最接地气详解!。

1.5K20

内核调试

page映射区,linux内核用page结构体管理所有物理内存,每一大小为PAGE_SIZE对于arm64,可能是4K,16K,64K。...而为了快速方便找到对应物理而将所有的帧结构体映射到此区域,后续只需使用virt_to_page, phys_to_page等宏实现虚拟地址,物理地址到对应结构体快速查询。...地址空间port属性说明 第一列 当前映射范围地址 第二列 代表此映射范围大小 PMD PUD PTE 当标识为PMD PUD表示当前映射为block映射,如当前为4K,则pudblock映射一次性可映射...当标识为PTE表示为映射即PAGE_SIZE大小4K。 USR AP标记,用于标识当前范围是否在用户空间还是内核空间可读可写或者仅读。...x表述当前范围特权级别模式可执行,就是内核可执行代码段,在内核中这段一般指向内核text*段 SHD 表示可共享属性,在arm64上表述为多核之间可共享其可见 AF 访问标志,当首次映射时,

13010

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

内核知识第八讲,PDE,PTE,目录,内存管理 一丶查看GDT....首先我们CR3寄存器保存了首地址. 这里有一个目录,还有关键词. 目录: 也称为PDE,而称之为PTE....CPU会通过虚拟地址,当作下表.去目录中查询.然后查到结果再去中查询.这样就查到对应物理地址了....PDE大小:   目录,存储在一个4K字节物理中,其中每一项是4个字节.保存了地址.   而最大是1M个. PTE大小.   PTE大小也和PDE一样....首先前边20位保存了或者物理地址基地址. 比如我们目录. 查到了第5项.那么从中取出千20位来,加上000就等于了.  然后从中查询千20位.

1.4K10

宋宝华: ARM64 Linux内核块映射

我们看看这种情况下,我们既可以用最终【20:12】对应PTE映射项,以4K为单位,进行虚拟地址到物理地址映射;又可以以【29:21】对应PMD映射项,以2M为单位,进行虚拟地址到物理地址映射...当然,如果用户态虚实映射是这样,用户实际得到了一个1GB。但是对于内核线性映射区域而言,即便我们进行了1GBPUD映射,这1G内部就可以进一步切割为4KB或者2MB。...我们把它们全部选中,这样我们可以得到一个debugfs接口: /sys/kernel/debug/kernel_page_tables 来获知内核态情况。...我在内核启动参数加rodata=0实际上是让rodata_full为false。如果我把这个kernel启动选项去掉,我得到内核是完全不一样,线性映射区也全部是PTE映射: ?...牧春童鞋在“Linux阅码场”这里还有一些精彩文章: 宋牧春:Linux设备树文件结构与解析深度分析(1) 宋牧春:Linux设备树文件结构与解析深度分析(2) 宋牧春:多图详解Linux内存分配器

3.1K10

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

Linux对于操作主要定义了以下函数或宏。这些操作方法也是与体系架构相关,因此需要按照体系架构硬件定义去实现。...而Linux有一个三层结构,可以很容易地将其包装成适合两层结构—只使用PGD和PTE。但是,Linux还要求每个页面有一个“PTE”,而且至少要有一个“dirty”位。...因此,在这里稍微调整了实现—告诉Linux在第一级有2048个条目,每个都是8字节。二级包含两个连续排列硬件PTE表项,前面的表项是包含Linux需要状态信息Linux PTE。...ARMv7属性定义分为Linux版本和ARMv7硬件Linux版本PTE属性定义加入前缀L_,如下所示: /* * "Linux" PTE definitions....通过对比Linux版本和ARMv7硬件会发现,ARMv7硬件缺少“dirty”位和“young”位。

2.8K10

Linux-3.14.12内存管理笔记【建立内核(3)

前面已经分析了内核准备工作以及内核低端内存建立,接着回到init_mem_mapping()中,低端内存建立后紧随着还有一个函数early_ioremap_page_table_range_init...page_table_kmap_check(),其入参调用one_page_table_init()是用于当入参pmd没有指向时,创建并使其指向被创建。...,如果是,则把其pte内容拷贝到page_table_range_init()申请空间中,并将newpte新页地址设置到pmd中(32bit系统实际上就是全局目录),然后调用__flush_tlb_all...为了避免前期可能对固定映射区已经分配了表项,基于临时内核映射区间要求连续性保证,所以在此重新申请连续空间将原内容拷贝至此。...值得注意是,与低端内存初始化不同是,这里只是被分配,相应PTE项并未初始化,这个工作将会交由以后各个固定映射区部分相关代码调用set_fixmap()来将相关固定映射区与物理内存关联

1.5K11

Linux-3.14.12内存管理笔记【建立内核(1)】

前面已经分析过了Intel内存映射和linux基本使用情况,已知head_32.S仅是建立临时,内核还是要建立内核,做到全面映射。...建立内核前奏,了解两个很关键变量: max_pfn:最大物理内存页面帧号; max_low_pfn:低端内存区(直接映射空间区内存)最大可用帧号; max_pfn 值来自setup_arch...Linux是一个支持多硬件平台操作系统,各种硬件芯片分页并非固定2级(全局目录和),仅仅Intel处理器而言,就存在3级情况(全局目录、中间目录和),而到了64位系统时候就成了4...所以Linux为了保持良好兼容性和移植性,系统设计成了以下4级分页模型,根据平台环境和配置情况,通过将上级目录和中间目录索引位设置为0,从而隐藏了三级目录和中间目录存在。...此外还有一个准备操作,在setup_arch()函数中调用缓冲区申请操作: early_alloc_pgt_buf(): 【file:/arch/x86/mm/init.c】 void __init

1.8K41

Linux从头学15:【目录和】-理论 + 实例 + 图文最完全、最接地气详解

作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++、嵌入式、Linux。...关注下方公众号,回复【书籍】,获取 Linux、嵌入式领域经典书籍;回复【PDF】,获取所有原创文章( PDF 格式)。...这里每一个,就称作,所以一共有1024个。 一个中一共有1024个表项,每一个表项占用4个字节,所以一个就占用4KB物理内存空间,正好是一个物理大小。...表示这个物理数据是否被写过; 目录 现在,每一个物理,都被一个一个表项来指向了,那么这1024个地址,应该怎么来管理呢? 答案是:目录!...目录中,每一个表项格式如下: 其中属性字段,与属性类似,只不过它描述对象是。 还有一点:每一个用户程序都有自己目录和!下文有详细说明。

1.2K30

【进程 进程通常存在PCB中

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

1.2K20

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

目录 前言 Intel四级 实操寻址 获取cr3 获取PGD 获取PUD 获取PMD 获取PTE 获取内容 最后 ---- 前言 Linux四级作用主要就是地址映射, 将逻辑地址映射到物理地址...很多时候, 有些地方想不明白就可以查看实际物理地址进行分析. ---- Intel 四级 其实很多设计根源或者说原因都来自于CPU设计, OS很多时候都是辅助CPU....Linux四级就是依据CPU四级来设计. 这里主要说就是Intel x64面大小为4KB情况, 如图所示: ?...当然了, 按照CPU图示, cr3肯定是指向PML4E. 在Linux当中, 第一级称为PGD, 当然是有历史原因, 可以自行google....所以Linux四级分别是PGD -> PUD -> PMD -> PTE. ? ---- 获取PGD 想要获取PGD中内容需要通过计算. 这里先来处理一下局部变量地址.

6.8K40

Linux 匿名反向映射

我们知道LINUX内存管理系统中有”反向映射“这一说,目的是为了快速去查找出一个特定物理在哪些进程中被映射到了什么地址,这样如果我们想把这一换出(SWAP),或是迁移(Migrate)时候,就能相应该更改所有相关进程来达到这个目的...1、为什么要使用反向映射   物理内存分页机制,一个PTE(Page Table Entry)对应一个物理,但一个物理可以由多个PTE与之相对应,当该页要被回收时,Linux2.4做法是遍历每个进程所有...Linux采用三级: PGD:顶级,由pgd_t项组成数组,其中第一项指向一个二级。...PMD:二级,由pmd_t项组成数组,其中第一项指向一个三级(两级处理器没有物理PMD)。 PTE:是一个对齐数组,第一项称为一个表项,由pte_t类型表示。...,12-21PMD,22-31位PGD,即线性地址右移22位结果为其在全局目录偏移 #define PTRS_PER_PGD 1024 // 因PGD共10位,所以其最多可以有2^

3.6K31

linux中透明巨与巨区别

Linux中,透明巨(Transparent HugePage)和巨(HugePage)是两种不同内存管理技术。 透明巨Linux内核中一项特性,旨在提高内存利用率和性能。...它通过将内存分配为更大(通常为2MB或1GB),减少了对内存访问次数,从而提高了内存访问效率。透明巨是透明,应用程序无需进行任何修改即可受益于这种内存管理技术。...而巨是指一种更大尺寸内存,在Linux中可以使用不同页面大小,常见大小是2MB或1GB。...巨可以提供更高内存访问性能,因为它减少了数量,降低了TLB(Translation Lookaside Buffer)缓存压力,从而减少了内存访问开销。...巨需要应用程序进行适当修改和配置才能使用。 因此,透明巨和巨都是通过增加内存尺寸来提高内存访问性能,但透明巨不需要应用程序修改,而巨需要应用程序支持和配置。

22110

ARM32 映射

我们从ARM linux内核建立具体内存区间映射过程中来看映射是如何实现。...,注意ARM Linux中实现了两份,硬件地址r0+2048。...该函数主要目的是根据Linux版本页面表项内容来填充ARM硬件版本表项; 首先把linux内核版本表项内容写入linux版本中,然后根据mem_type数据结构prot_pte标志位来设置...linux内核最早基于x86体系结构设计,所以linux内核关于许多术语和设计都是针对x86体系,而ARM Linux只能从软件架构上去跟随了,因此设计了两套。...版本中PTE页面表项标记为"dirty",并且发现PTE表项内容改变了,ptep_set_access_flags()函数会把新linux版本表项内容写入硬件,从而实现模拟过程;

2.8K30

Linux 标准大和透明大

Huge pages ( 标准大 ) 和 Transparent Huge pages( 透明大 ) 在 Linux 中大分为两种:Huge pages ( 标准大 ) 和 Transparent...内存是以块即方式进行管理,当前大部分系统默认大小为 4096 bytes 即 4K。1MB 内存等于 256 ;1GB 内存等于 256000 。...CPU 拥有内置内存管理单元,包含这些页面的列表,每个页面通过条目引用。当内存越来越大时候, CPU 需要管理这些内存成本也就越高,这样会对操作系统性能产生影响。...Huge Pages Huge pages 是从 Linux Kernel 2.6 后被引入,目的是通过使用大内存来取代传统 4kb 内存页面, 以适应越来越大系统内存,让操作系统可以支持现代硬件架构大页面容量功能...Transparent Huge Pages Transparent Huge Pages 缩写 THP ,这个是 RHEL 6 开始引入一个功能,在 Linux6 上透明大是默认启用

4.8K50

操作系统多级与快--12

第一种尝试,只存放用到 第二种尝试:多级,即目录(章)+(节) 多级提高了空间效率,但在时间上? TLB得以发挥作用原因 为什么TLB条目数可以在64-1024之间?...就以Linux 0.11 每页4k进行计算,4G/4K=1M ,4G寻址空间,可以定位到1M页数。...并且考虑到大小如果设计越大的话,那么对于内存资源浪费就越严重,那么就要缩小大小,但是大小缩小,就意味着32地址所表示虚拟页号会增多,随之而来中表项记录增加,越来越大,这种情况下...---- 第一种尝试,只存放用到 很自然想法:用到逻辑才有表项 如果只存放用到中,那么每次去中定位某个虚拟页号对应表项就需要顺序遍历一遍,挨个比较才能定位到对应表项,这样话...为了保证表项连续,并且还要减少对内存浪费,就必须采用多级形式,但是多级时间上不足,应该由什么来弥补呢?

1.6K50
领券