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

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

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

1.5K20

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

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

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

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

作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++、嵌入式、Linux。...关注下方公众号,回复【书籍】,获取 Linux、嵌入式领域经典书籍;回复【PDF】,获取所有原创文章( PDF 格式)。...目录 的拆分过程 目录结构 几个相关的寄存器 加载用户程序时: 目录的分配和填充过程 线性地址到物理地址的查找、计算实例 在x86系统中,为了能够更加充分、灵活的使用物理内存,把物理内存按照...表示这个物理中的数据是否被写过; 目录 现在,每一个物理,都被一个中的一个表项来指向了,那么这1024个的地址,应该怎么来管理呢? 答案是:目录!...这个寄存器中,保存了当前正在执行的那个任务的目录地址。 每个任务(程序)都有自己的目录目录的地址被记录在任务的TSS段中。

1.3K30

一文看懂影子和扩展

Physical Address HVA:Host Virtual Address GPA:Guest Physical Address GVA:Guest Virtual Address PDBR:目录物理基地址寄存器...二.影子 (Shadow page table) 影子我用一句话来描述就是:VMM把Guest和Host中的合并成一个,称为影子,来实现GVA->HPA映射。...4, 把GVA -> HPA,这一路的映射关系记录到中,这个就是影子。...具体过程 当Guest中进程访问GVA时,CPU首先就要通过PDBR寄存器去找目录,但是PDBR中存储的地址是GPA,所以要到EPT中进行GPA->HPA的转换,这个转换过程和物理MMU的工作流程相同...找到了目录的HPA基地址,再通过GVA中的Directory offset段,就找到的VGA了,这个VGA再去EPT中进行GPA->HPA的转换,就找到VGA的HPA了。

1.8K20

内核调试

一、配置内核 首先配置内核,使其支持导出内核到debugfs下面: Kernel hacking ---> ---> [*] Export kernel pagetable layout to...start] - [PCI I/O end]同上,专门用于PCI设备使用的地址空间,一般映射大小为16M [vmemmap start] - [vmemmap end]对与ARM64用于page映射区,linux...地址空间port属性说明 第一列 当前的映射范围地址 第二列 代表此映射范围大小 PMD PUD PTE 当标识为PMD PUD表示当前映射为block映射,如当前为4K,则pud的block映射一次性可映射...当标识为PTE表示为映射即PAGE_SIZE大小4K。 USR AP标记,用于标识当前范围是否在用户空间还是内核空间可读可写或者仅读。...x表述当前范围特权级别模式可执行,就是内核的可执行代码段,在内核中这段一般指向内核的text*段 SHD 表示可共享属性,在arm64上表述为多核之间可共享其可见 AF 访问标志,当首次映射时,

16710

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 上透明大是默认启用的。

5.1K50

Thymeleaf目录原理 发布于

简介 为Halo搭建的博客配上如同《新华字典》那样的目录是一个不错的主意,不仅能让分类更加清晰,还能帮助读者更轻松地查找和理解文章的内容。...在这篇文章中,《Thymeleaf目录原理》将深入探讨如何实现这种目录结构的设计,从基本原理开始,逐步深入到实际操作。...问题背景 在给定如下的关于CategoryVo和PostVo的方法和关系中,选择最为合适的算法与方案来实现一个文章分类目录。...category.status.visiblePostCount > 0}" 这里的th:each是由Thymeleaf提供的一种For循环标签(可以对比到Vue中的v-for) 第二层for循环,用来处理目录列分页...postFinder.listByCategory(i + 1, site.post.postPageSize, category.metadata.name)}这个方法获取了category.metadata.name分类中第{i + 1}

28810

多级的好处

,如果只使用了一个,一个表项的大小为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.7K30

Linux中PGD、PUD、PMD等概念介绍

1、PGD: Page Global Directory Linux系统中每个进程对应用户空间的pgd是不一样的,但是linux内核 的pgd是一样的。...当创建一个新的进程时,都要为新进程创建一个新的页面目录PGD,并从内核的页面目录swapper_pg_dir中复制内核区间页面目录项至新建进程页面目录PGD的相应位置,具体过程如下:do_fork()...可以看出Linux系统中每个进程的页面目录的第二部分是相同的,所以从进程的角度来看,每个进程有4G字节的虚拟空间,较低的3G字节是自己的用户空间,最高的1G字节则为与所有进程以及内核共享的系统空间。...每个进程有它自己的PGD( Page Global Directory),它是一个物理,并包含一个pgd_t数组。...每一个表项指向一个框,框就是真正的物理内存

3.3K30

Linux 透明大 THP 和标准大 HP

CPU 拥有内置的内存管理单元,包含这些页面的列表,每个页面通过条目引用。当内存越来越大的时候,CPU 需要管理这些内存的成本也就越高,这样会对操作系统的性能产生影响。...透明大存在的问题: Oracle Linux team 在测试的过程中发现,如果 linux 开启透明大 THP,则 I/O 读写性能降低 30%;如果关闭透明大 THP,I/O 读写性能则恢复正常...3、由于数量的减少,使得 CPU 中的 TLB(可理解为CPU对的CACHE)的命中率大大提高。...4、针对 HugePages 的,在各进程之间可以共享,也降低了 PageTables 的大小。实际上这里可以反映出 Linux 在分页处理机制上的缺陷。...而其他操作系统,比如 AIX,对于共享内存段这样的内存,进程共享相同的,避免了 Linux 的这种问题。 5、提高 Oracle 性能,减少 SGA 的交换。

2.5K20

ARM32 映射

在32bit中的Linux内核中一般采用3层映射模型,第1层是页面目录(PGD),第2层是页面中间目录(PMD),第3层才是页面映射表(PTE)。...我们从ARM linux内核建立具体内存区间的映射过程中来看映射是如何实现的。...,注意ARM Linux中实现了两份,硬件的地址r0+2048。...该函数的主要目的是根据Linux版本的页面表项内容来填充ARM硬件版本的表项; 首先把linux内核版本的表项内容写入linux版本的中,然后根据mem_type数据结构prot_pte的标志位来设置...linux内核最早基于x86体系结构设计的,所以linux内核关于的许多术语和设计都是针对x86体系的,而ARM Linux只能从软件架构上去跟随了,因此设计了两套

2.8K30

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

,而管理是在虚拟内存管理中尤为重要,本文主要以回答几个管理中关键性问题来解析Linux内核管理,看一看管理中那些鲜为人知的秘密。...Linux内核为何使用多级?...2)Linux内核 填写,将基地址告诉mmu 内核初始化建立内核,实现缺页异常等机制为用户任务按需分配并映射。 当然,内核也可以遍历,如缺页异常时遍历进程。 10....12.遍历过程 下面以arm64处理器架构多级遍历作为结束(使用4级大小为4K): Linux内核中 可以将扩展到5级,分别是全局目录(Page Global Directory,...PGD), 4级目录(Page 4th Directory, P4D), 上级目录(Page Upper Directory, PUD),中间目录(Page Middle Directory

1.8K21

linux中透明巨与巨的区别

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

29510

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

五级分页每级命名分别为全局目录(PGD)、4级目录(P4D)、上级目录(PUD)、中间目录(PMD)、(PTE)。...进程地址空间切换实质就是将TTBR0寄存器中Translation Table Base 0 Address修改为当前进程的PGD(全局目录)。一级数量为4096,二级数量为256。...而Linux有一个三层的结构,可以很容易地将其包装成适合两层的结构—只使用PGD和PTE。但是,Linux还要求每个页面有一个“PTE”,而且至少要有一个“dirty”位。...ARMv7属性的定义分为Linux版本的和ARMv7硬件的Linux版本的PTE属性定义加入前缀L_,如下所示: /* * "Linux" PTE definitions....通过对比Linux版本的和ARMv7硬件的会发现,ARMv7硬件的缺少“dirty”位和“young”位。

3.1K10

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

,是从缓冲空间中申请还是通过memblock算法申请内存。...回到page_table_range_init(),其中one_md_table_init()是用于当pgd入参为空时,申请新物理作为中间目录的,但是此次仅分析x86非PAE环境的情况,不存在中间目录...,创建并使其指向被创建的。...,如果是,则把其pte的内容拷贝到page_table_range_init()申请的空间中,并将newpte新页的地址设置到pmd中(32bit系统实际上就是全局目录),然后调用__flush_tlb_all...为了避免前期可能对固定映射区已经分配了表项,基于临时内核映射区间要求连续性的保证,所以在此重新申请连续的空间将原内容拷贝至此。

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