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

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

前面已经分析了内核的准备工作以及内核低端内存的建立,接着回到init_mem_mapping()中,低端内存建立后紧随着还有一个函数early_ioremap_page_table_range_init...,是从缓冲空间中申请还是通过memblock算法申请内存。...,创建并使其指向被创建的。...为了避免前期可能对固定映射区已经分配了表项,基于临时内核映射区间要求连续性的保证,所以在此重新申请连续的空间将原内容拷贝至此。...值得注意的是,与低端内存初始化不同的是,这里的只是被分配,相应的PTE项并未初始化,这个工作将会交由以后各个固定映射区部分的相关代码调用set_fixmap()来将相关的固定映射区与物理内存关联

1.6K11

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,从而隐藏了三级目录和中间目录的存在。...由此管中窥豹,看到了Linux内存分页映射模型的存在和相关设计,暂且也就先了解这么多。 分析宏是一件很乏味的事情,不过以小见大却是一件很有意思的事情。

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

    Linux内存分配策略

    伙伴系统分配算法 在上一节, 我们介绍了Linux内核怎么管理系统中的物理内存....但有时候内核需要分配一些物理内存地址也连续的内存, 所以Linux使用了 伙伴系统分配算法 来管理系统中的物理内存....在Linux内核中, 把两个物理地址相邻的内存当作成伙伴, 因为Linux是以页面号来管理内存的, 所以就是说两个相邻页面号的页面是伙伴关系....那么给定一个 i 号内存, 怎么找到他的伙伴内存呢? 通过观察我们可以发现, 如果页面号是复数的, 那么他的伙伴内存要加1, 如果页面号是单数的, 那么他的伙伴内存要减1....Linux内核使用 free_area[i] 管理 2i 个内存页面大小的内存块列表.

    3.3K10

    系统内存管理:虚拟内存内存分段与分页、缓存TLB以及Linux内存管理

    内存分页内存分页是将整个虚拟和物理内存空间划分为固定大小的连续内存块,称为(Page)。在Linux下,每一的大小通常为4KB。...为了节省内存空间,我们可以将单级进行分页,将一个(一级)分为1024个(二级),每个二级包含1024个表项,形成二级分页结构。...假设只有20%的一级表项被使用,那么占用的内存空间只有0.804MB,相比于单级的4MB,内存节约非常巨大。为什么不分级的无法实现这样的内存节约呢?...这是因为程序执行过程中,访问的表项相对固定。通过利用TLB,可以大大提高地址转换的速度,加快程序的执行效率。Linux内存管理Linux内存管理涉及逻辑地址和线性地址的转换。...逻辑地址是程序使用的地址,而线性地址是通过段式内存管理映射的地址,也称为虚拟地址。Linux的虚拟地址空间分为内核空间和用户空间两部分。

    74980

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

    内核知识第八讲,PDE,PTE,目录,内存管理 一丶查看GDT....比如我们的虚拟地址:   004010123,而的首地址是00401000 后12位都是0. 所以我们把的高20位称为页码. 进程内存的保护. 进程内存的保护就通过的方式进行保护的.  ...首先我们的CR3寄存器保存了的首地址. 这里有一个目录,还有的关键词. 目录: 也称为PDE,而称之为PTE....但是通过两个查询.可以映射4G内存.而上面的设计方法不行. 首先前边20位保存了或者物理地址的基地址. 比如我们的目录. 查到了第5项.那么从中取出千20位来,加上000就等于了. ...有没有发现,我们的Ring3程序.不过是那个内存区域也好.都是可以读的. 而我们Ring3下的修改内存分页保护属性,其实就是将这个的这个RW位进行置位. 而我们的虚拟地址当作下表进行查表.

    1.7K10

    Linux申请大内存(mmap)

    ---- 1.为什么要使用大内存   了解操作系统内存管理的人一般都知道操作系统对内存采用多级和分页进行管理,操作系统每个默认大小为4KB。...如果进程使用的内存过大,比如1GB,这样会在中占用 1GB / 4KB = 262144个表项,而系统TLB可以容纳的表项远小于这个数量。...操作系统默认支持的大是2MB,当使用1GB内存时,在中将占用 1GB / 2MB = 512个表项,可以大大提升TLB命中率,进而提升应用性能。...---- 2.怎样使用大内存 2.1 先预留一定量的大内存 #先查看系统有多少已经预留的大内存 # cat /proc/meminfo |grep -i huge #预留192个大 # sysctl...\n"); getchar(); munmap(m, s); return 0; } ---- 3.最后的话 大内存的好处不仅是减少TLB未命中次数,而且大内存分配的是物理内存,不会被操作系统的内存管理换出到磁盘上

    11.8K110

    内存管理】映射基础知识

    中间的8个bit位叫做L2索引,在Linux内核中叫做PT,。最低的12位叫做索引。 在ARM处理器中,TTBRx寄存器存放着基地址,我们这里的一级有4096个表项。...MMU访问是硬件实现的,但的创建和填充需要Linux内核来填充。通常,一级和二级存放在主存储器中。 ARM32 一级表项 下面这张图来自ARMV7的手册。...Linux内核关于的函数 Linux内核中操作的宏定义 Linux内核中封装了很多宏来处理 #define pgd_offset_k(addr) pgd_offset(&init_mm,addr...Linux内核的内存管理已经适配了X86的表项,我们可以通过软件适配的办法来解决这个问题。因此,ARM公司在移植该方案时提出了两套的方案。...一套是为了迎合ARM硬件的真实,另一套是为了迎合Linux真实的。 对于PTE来说,一下子就多出了一套,一套256表项,每个表项占用4字节。

    22910

    Linux 内核 内存管理】内存管理架构 ③ ( Linux 内核中的内存管理模块 | 分配器 | 不连续分配器 | 内存控制组 | 硬件设备内存管理 | MMU | 缓存 | 高速缓存 )

    文章目录 一、Linux 内核中的内存管理模块 二、硬件设备内存管理 一、Linux 内核中的内存管理模块 ---- Linux 内核还需要处理如下内容 : ① 错误异常处理 ② 管理 ③ 引导内存分配器...: 分配器 , 块分配器 , 不连续分配器 , 连续内存分配器 , 每处理器内存分配器 ; " 分配器 " 负责分配 内存物理 , 使用的是 " 伙伴分配器 " ; " 不连续分配器 " 提供了...vmalloc 函数 用于分配内存 , vfree 函数 用于 释放内存 ; 申请的 " 不连续物理 “ 可以 映射到 ” 连续的虚拟 " ; ④ 内存碎片整理 ⑤ 内存耗尽处理 ⑥ 内存控制组...: 控制管理 被 进程 占用的 内存 ; 碎片整理 : 如果 " 内存碎片化 " 严重 , 没有连续物理 , 需要通过 整理内存碎片 并迁移数据 得到 连续的 物理 ; 内存回收 : 内存不足时 ,..." ( MMU ) 中 , 还有一个 " 缓存 " ; 缓存 中缓存了 最近使用的 " 映射 “ , 该映射的作用是 将 ” 物理地址 " 映射为 " 虚拟地址 " ; CPU 处理器

    1.5K40

    驱动开发:内核解析内存四级

    当今操作系统普遍采用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...则是另一个中的地址。

    19530

    驱动开发:内核解析内存四级

    当今操作系统普遍采用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...则是另一个中的地址。

    58590

    与三级介绍

    在操作系统与计组学习中,我们会学习到这个概念,可以说,如今计算机的函数内存调用有很大一部分都离不开的调用,本文旨在详解的概念应用以及操作系统中的三级,三级对于节省空间起了至关重要的作用...39位,而这39位被划分为了一个个页面,每个页面为12位,即4kb 就是操作系统中存放了各个页面与当前虚拟内存的映射关系,用户程序可以通过将调用的虚拟地址转换到实际物理地址中,实际上的调用内存过程如下...: 程序执行过程中,CPU会通过MMU(内存管理单元,每个CPU都有,负责将虚拟地址转换为物理地址),将当前的VA(虚拟地址)转换为PA(物理地址),之后到相应的内存单元执行 条目 条目构成如下图...虚拟地址的页码有27位,每个条目为8字节,那么占用内存为: 2^27 * 8 bit = 1GB,虽然看似不多,但是如果用户程序只使用了几个条目,但是还是要占用1GB的内存还是很恐怖的,因此科学家们想到了使用三级来代替单级...至此,有关于与三级的介绍就到这里了,的存在对于内核区与用户区加载代码起了至关重要的作用,真正理解的转换机制有助于我们对操作系统的虚拟内存有更深刻的认识

    12210

    Linux 内核 内存管理】物理内存组织结构 ⑥ ( 物理 page 简介 | 物理 page 与 MMU 内存管理单元 | 内存节点 pglist_data 与 物理 page 联系 )

    文章目录 一、物理 page 简介 1、物理 page 引入 2、物理 page 与 MMU 内存管理单元 3、物理 page 结构体 4、Linux 内核源码中的 page 结构体 二、内存节点...pglist_data 与 物理 page 联系 内存管理系统 3 级结构 : ① 内存节点 Node , ② 内存区域 Zone , ③ 物理 Page , Linux 内核中 , 使用 上述..., 就是 " 内存区域 " zone , " 内存区域 " 再向下划分 , 就是 " 物理 " page ; 2、物理 page 与 MMU 内存管理单元 在 Linux 内核中 , MMU 内存管理单元...结构体 " 物理 " page 是 Linux 内核 " 内存管理 " 中的 最小单位 , 物理 中的 " 物理地址 " 是连续的 , 每个 " 物理 " 使用 struct page 结构体...SPARSEMEM */ // 描述数组 struct page *node_mem_map; #endif } 参考 【Linux 内核 内存管理】物理内存组织结构 ③ ( 内存管理系统三级结构

    6.8K10

    Linux 内核 内存管理】物理释放 ( 物理释放 __free_pages 函数 )

    文章目录 一、物理释放 __free_pages 函数 一、物理释放 __free_pages 函数 ---- 分配器 提供了 释放 物理的 函数 __free_pages , 该函数定义在 Linux...内核源码的 linux-4.12\mm\page_alloc.c#4083 位置 ; __free_pages 函数参数分析 : struct page *page 参数 表示 要释放的 物理 page...的 虚拟空间地址 ; unsigned int order 参数 表示 要释放的 物理 的 " 阶数 " , 也就是 要释放的物理大小 ; 阶 ( Order ) : 物理 的 数量单位 ,...n 阶块 指的是 2^n 个 连续的 " 物理 " ; 参考 【Linux 内核 内存管理】伙伴分配器 ① ( 伙伴分配器引入 | 块、阶 | 伙伴 ) __free_pages 函数源码...order == 0) free_hot_cold_page(page, false); else __free_pages_ok(page, order); } } 源码路径 : linux

    12.7K20

    零拷贝内存 or 锁定内存

    这是一个小实验,在于验证GPU上使用零拷贝内存锁定内存的性能差别。使用的是点积计算,数据量在100M左右。...实验步骤很简单,分别在主机上开辟普通内存锁定内存以及进行零拷贝内存的操作,看三者哪个完成的时间比较快,具体的代码在最后,这里是实验结果: ?...但是,锁定内存相比于零拷贝内存到底慢在哪里呢,当然是慢在从主机内存拷贝到显存的时间了,注释掉锁定的拷贝语句之后,可以得到以下结果: ?...ps:但是,奇怪的是,如果只将a,b内存拷贝的语句注释掉,锁定内存仍旧可以得到正确的结果,暂时想不明白是为什么 这时就要问了,看起来零拷贝比锁定要快啊,那还要这个锁定干嘛呢,当然是有用的,因为...,零拷贝的内容不能缓存在显存里,如果内容要被反复使用,零拷贝就要不停地从内存里取值,增加总线压力,这样相比锁定也就处于劣势。

    2.1K50

    一文看懂影子和扩展

    我们知道从intel的80386引入了保护模式后,内存空间分为虚拟地址空间和物理地址空间。后引入机制,把虚拟地址送往MMU,MMU查TLB不中的情况下,依次查就可以找到对应的物理地址。...,X86上叫CR3 EPT:扩展 ptr:这里用来描述指向某个的寄存器 一.内存虚拟化要解决的问题 内存虚拟化实际实现就是MMU虚拟化,要实现GVA -> GPA -> HVA -> HPA...3, HVA->HPA,这一过程就是我们已知的使用物理MMU完成VMM进程的虚拟内存到物理内存的转换。 4, 把GVA -> HPA,这一路的映射关系记录到中,这个就是影子。...这样通过影子就可以实现真正的内存访问。 影子实现非常复杂,需要为每个Guest中的每个进程的Guest PT都维护一个对应的Shadow PT。...并且一个VM只需要一套EPT,减少了内存开销,维护也比较简单。

    2.1K20

    性能优化:Linux环境下合理配置大内存

    再看看目录这2种数据结构占用的空间会有多少。目录固定只有4KB。而呢?由于最多有1024个,每个占用4KB,因此最多占用4MB内存。...同时Linux不会为进程一次性建立那么大的,只有进程在分配和访问内存时,操作系统才会为进程建立相应地址的映射。 这里只描述了最简单情况下的分页映射。实际上页目录连同一共有四级。...因此,决定先使用大内存来调优系统的内存使用。 大内存是一种统称,在低版本的Linux中为Large Page,而当前主流的Linux版本中为Huge Page。...实际上这里可以反映出Linux在分页处理机制上的缺陷。而其他操作系统,比如AIX,对于共享内存段这样的内存,进程共享相同的,避免了Linux的这种问题。...像笔者维护的一套系统,连接数平常都是5000以上,实例的SGA在60GB左右,要是按Linux的分页处理方式,系统中大部分内存都会被给用掉。

    5K50

    高端内存映射之vmalloc分配内存中不连续的--Linux内存管理(十九)

    分配到其中的可能位于物理内存中的任何地方. 通过修改负责该区域的内核, 即可做到这一点. ? ?...因为用于vmalloc的内存总是必须映射在内核地址空间中, 因此使用ZONE_HIGHMEM内存域的要优于其他内存域. 这使得内核可以节省更宝贵的较低端内存域, 而又不会带来额外的坏处....其中依次映射了3个(假想的)物理内存, 在物理内存中的位置分别是1 023、725和7 311....接下来从物理内存分配各个 最后将这些连续地映射到vmalloc区域中, 分配虚拟内存的工作就完成了....unmap_vm_area使用找到的vm_area实例,从删除不再需要的项。与分配内存时类似,该函 数需要操作各级,但这一次需要删除涉及的项。它还会更新CPU高速缓存。

    3K10
    领券