Linux内存
文章平均质量分 88
内存
TrustZone_
一个搞技术的读书人,妄图分享最干货的技术知识与世界运转的底层逻辑。公ZH:TrustZone
展开
-
内存 | 顺序IO
SSD在设计上对寻道和旋转延迟上做了优化,随机读写效率有了很大提升,但是我们需要知道顺序读写始终有它的优势,可以想象我们再一张布满格子的纸上面写字,连续写的速度比随便挑格子写的速度要快得多,省去找格子和移动笔的时间。我们知道内存也可以用于存储数据,而且读写速度非常快,通常比磁盘要快几个数量级,但是内存资源是珍贵而且有限的,通常我们的服务器内存也就是16G,32G。而需要存储的数据动不动就是几百G以上,很明显不能把数据都存储到内存,而且内存的数据是暂时的,当计算机重启就会丢失,不适合存储需要持久化的数据。原创 2025-02-04 09:47:42 · 1352 阅读 · 0 评论 -
底软驱动 | Linux内核中ioremap映射的透彻理解
而必须将它们映射到核心虚地址空间内(通过页表),然后才能根据映射所得到的核心虚地址范围,通过访内指令访问这些I/O内存资源。原创 2024-07-26 12:55:23 · 2644 阅读 · 0 评论 -
半导体存储器总结
半导体存储器在任何一个包含处理器的系统中都是必不可少的一部分,一般将其分为RAM与ROM两大类;根据系统掉电后存储内容是否可以保持又可分为易失(Volatile)与非易失(Non-volatile)两大类。下面是常见的半导体存储器分类图more。原创 2024-07-24 22:11:22 · 500 阅读 · 0 评论 -
底软驱动 | 一文搞定Linux虚拟内存
在概念上来讲,虚拟内存被组织为由存放在磁盘上的N个连续的字节大小的单元组成的数组。每个字节都有唯一的虚拟地址,作为到数组的索引(现在我们知道了虚拟内存虽然叫做内存,但其实它并不在内存中,而是磁盘中的一块空间)。虚拟内存与物理内存之间构成了一个缓存系统。虚拟内存位于较低层,物理内存位于较高层。虚拟内存上的数据可以被缓存到主存中。VM系统将虚拟内存分割为称为虚拟页(Virtual Page)的大小固定的块,每个虚拟页的大小为P=pow(2,p)字节。原创 2024-07-14 21:45:26 · 1087 阅读 · 0 评论 -
底软驱动 | Linux虚拟内存管理,MMU机制,原来如此
现代操作系统普遍采用虚拟内存管理(Virtual Memory Management)机制,这需要处理器中的MMU(Memory Management Unit,内存管理单元)提供支持。首先引入 PA 和 VA 两个概念。原创 2024-07-14 21:38:08 · 1324 阅读 · 0 评论 -
深入理解Linux内核页表映射分页机制原理
这些操作方法也是与体系架构相关的,因此需要按照体系架构的硬件定义去实现。原创 2024-03-18 19:02:59 · 1658 阅读 · 0 评论 -
Linux内存管理笔记----TLB
TLB是Translation Lookaside Buffer的简称,可翻译为“地址转换后援缓冲器”,也可简称为“快表”。简单地说,,其中存储了当前最可能被访问到的页表项,其内容是部分页表项的一个副本。处理器在取指或者执行访问memory指令的时候都需要进行地址翻译,即把虚拟地址翻译成物理地址。而地址翻译是一个漫长的过程,需要遍历几个level的Translation table,从而产生严重的开销。原创 2024-03-18 19:02:30 · 2405 阅读 · 0 评论 -
从软件和硬件角度去看内存
前面我们一起花了八篇文章,站在硬件的角度对内存有了一定的认识。但是其实当我们实际对内存进行操作的时候,是使用软件的方式。于是乎,是时候站在软件的角度来学习内存了。在本系列的开篇之际,请允许我首先用两幅精美的图片【图片来自-摩斯电码】,来展示内存的概要,同时在本系列的开始,我会和大家一起先简要花一篇来回顾一下内存的硬件。学而时习之,不亦说乎!期待我们一起学习完这个系列后,能对这两个图片,展开长篇阔论。原创 2023-10-26 09:14:12 · 353 阅读 · 0 评论 -
内核地址清理器(KASAN)
Kernel Address Sanitizer (KASAN)是一种动态内存安全错误检测器,旨在发现越界和使用已释放内存的错误。通用KASAN是一种调试模式,类似于用户空间ASan,启用CONFIG_KASAN_GENERIC。该模式支持许多CPU架构,但具有显着的性能和内存开销。基于软件标签的KASAN或SW_TAGS KASAN,启用CONFIG_KASAN_SW_TAGS,可用于调试和狗粮测试,类似于用户空间HWASan。原创 2023-10-13 17:03:49 · 925 阅读 · 0 评论 -
内存标记扩展:通过架构增强内存安全性
几十年来,内存安全一直是安全漏洞的主要来源。如今,软件供应商报告说,由于违反内存安全而导致的漏洞占其产品中的大部分安全问题。这得到了研究的支持。根据 2019 年 BlueHat 的演示,Microsoft产品中解决的所有安全问题中有 70% 是由违反内存安全引起的。谷歌也报告了类似的数据,其中超过75%的漏洞违反了内存安全。。但是,这些在性能和电池寿命方面可能都很昂贵,因此不适合广泛部署。原创 2023-10-13 16:16:55 · 204 阅读 · 0 评论 -
【译文】Armv8.5-A内存标记扩展(MTE)
内存安全的破坏分为两大类:空间安全和时间安全。可利用的违规行为是攻击的第一阶段,旨在传送恶意负载或与其他类型的漏洞链接,以获得系统控制权或泄漏特权信息。当访问对象超出其真实边界时,空间安全就会受到侵犯。例如,当栈上的缓冲区溢出时。这可能会被利用来覆盖函数的返回地址,这可能会成为几种类型攻击的基础。当对对象的引用超出范围使用时,通常是在对象的内存被重新分配之后,就违反了时间安全性。例如,当包含某种类型的函数指针的类型被恶意数据覆盖时,恶意数据也可以构成多种攻击的基础。翻译 2023-10-13 16:13:35 · 536 阅读 · 0 评论 -
功能安全基础:内存保护(MPU)浅析
MPU属于芯片内部硬件单元,用于设置内存保护分区。通过MPU,将内存区(Memory)划分为若干各保护范围,根据区域类型,可以设置数据(Data)读/写权限,以及代码(Code)执行权限。在TC1.6.2P的芯片架构中,每个Core有6个内存保护寄存器集。每个Core又可以设置18个数据保护范围,10个代码保护范围。当内存保护使能以后,如果代码执行到非法区域或者数据读/写非法区域,将触发Trap。每个Core的内存保护区与保护范围,示意如下:对于Data保护范围,转载 2023-10-09 22:50:55 · 1689 阅读 · 0 评论 -
DDR4 - Initialization, Training and Calibration
在 DRAM 投入使用之前,有 4 个步骤的工作需要完成上电与初始化 ,Power-up and InitializationZQ 校准,ZQ CalibrationVerf DQ 校准,Verf DQ Calibration读写训练,即存储介质训练/初始校准,Read/Write Training在这些步骤完成后,系统正式进入 IDLE 状态,并为后续的读写操作做好准备。根据设备的运行环境,你可能需要使能定期校准。转载 2023-10-05 10:13:48 · 1639 阅读 · 0 评论 -
内存系列学习(八):终章-结束又是开始
现代计算机都是基于Von Neumann体系结构的,不管是嵌入式系统、PC还是服务器。这种体系结构的主要特点是:CPU(Central Processing Unit,中央处理器,或简称处理器Processor)和内存(Memory)是计算机的两个主要组成部分,内存中保存着数据和指令,CPU从内存中取指令(Fetch)执行,其中有些指令让CPU做运算,有些指令让CPU读写内存中的数据。本章简要介绍组成计算机的CPU、内存和设备以及它们之间的关系,为后续章节的学习打下基础。我们都见过如图16.1所示挂在墙上的原创 2023-08-23 14:27:32 · 171 阅读 · 0 评论 -
内存系列学习(七):ARM处理器的快速上下文切换技术
FCSE(Fast Context Switch Extension,快速上下文切换)位于CPU和MMU之间,如果两个进程使用了同样的虚拟地址空间,则对CPU而言,两个进程使用了同样的虚拟地址空间。**快速上下文切换机构对各进程的虚拟地址进行变换,**这样系统中除了CPU之外的部分看到的是经过快速上下文切换机构变换的虚拟地址。快速上下文切换机构将各进程的虚拟空间变换成不同的虚拟空间,这样在进行进程间切换时就不需要进行虚拟地址到物理地址的重映射。原创 2023-08-22 19:28:57 · 622 阅读 · 0 评论 -
内存系列学习(六):ARM处理器存储访问一致性问题
当存储系统中引入了cache和写缓冲区(Write Buffer)时,同一地址单元的数据可能在系统中有多个副本,分别保存在cache、Write Buffer及主存中,如果系统采用了独立的数据cache和指令cache,同一地址单元的数据还可能在数据cache和指令cache中。,使得数据读操作可能得到的不是系统中“最新的数值”,这样就带来了存储系统中数据的一致性问题。(1)cache(介于CPU和DDR)原创 2023-08-22 18:34:53 · 1512 阅读 · 0 评论 -
内存系列学习(五):ARM处理器中的Cache和Write Buffer
在cache存储系统中,把cache和主存储器都划分成相同大小的块。主存地址由块号B和块内地址W两部分组成,cache地址由块号b和块内地址w组成。当CPU访问cache时,CPU送来主存地址,放到主存地址寄存器中,通过地址变换部件把主存地址中的块号B变换成cache的块号b,并放到cache地址寄存器中,同时将主存地址中的块内地址W直接作为cache的块内地址w装入cache地址寄存器中,如果变换成功(又叫cache命中),就用得到的cache地址去访问cache,从cache中取出数据送到CPU中。原创 2023-08-19 16:18:49 · 2223 阅读 · 0 评论 -
内存系列学习(四):Cache和Write Buffer一般性介绍
具有Cache的计算机,当CPU需要进行存储器存取时,首先检查所需数据是否在Cache中。如果存在,则可以直接存取其中的数据而不必插入任何等待状态,这是最佳情况,称为高速命中;当CPU所需信息不在Cache中时,则需切换存取主储器,由于速度较慢,需要插入等待,这种情况称高速未命中;在CPU存取主存储器的时候,按照最优化原则将存储信息同时写入到Cache中以保证下次可能的高速缓存命中。因此**,同一数据可能同时存储在主存储器和Cache中**。同样,按照优化算法,可以淘汰Cache中一些不常使用的数据。原创 2023-08-18 07:53:37 · 1361 阅读 · 0 评论 -
认识SMMU以及理理SMMU与TrustZone的联系?
SMMU(system mmu),是I/O device与总线之间的地址转换桥。它在系统的位置如下图:它与mmu的功能类似,可以实现地址转换,内存属性转换,权限检查等功能。在实际的项目中有些Master也是要访问Secure Memory的,例如DPU,DMA等。英伟达首席执行官黄仁勋曾在演讲中表示:“ DPU 将成为未来计算的三大支柱之一,未来的数据中心标配是‘ CPU + DPU + GPU ’。CPU 用于通用计算, GPU 用于加速计算, DPU 则进行数据处理。原创 2023-08-13 16:36:03 · 2456 阅读 · 0 评论 -
【转】:嵌入式Linux系统工程师系列之ARM920T的MMU与Cache
地址有虚拟地址和物理地址之分,如果CPU没有MMU(Memory Management Unit,内存管理单元),或者有MMU但没有启用,,直接被内存芯片(以下称为物理内存,以便与虚拟内存区分)接收,这称为物理地址(Physical Address,以下简称PA)。如果CPU启用了MMU,CPU核发出的地址将被MMU截获,从CPU到MMU的地址称为虚拟地址(Virtual Address,以下简称VA),而MMU将这个地址翻译成另一个地址发到CPU芯片的外部地址引脚上,也就是将虚拟地址映射成物理地址。转载 2023-08-12 23:18:15 · 376 阅读 · 0 评论 -
内存系列学习(三):ARM处理器地址变换过程
前面我们这个系列对MMU的结构本身有了一定的了解,也学习了CP15协处理器。这里我们来一起学习MMU在实际场景中的应用。原创 2023-08-12 17:59:48 · 1147 阅读 · 0 评论 -
内存系列学习(二):ARM处理器中CP15协处理器
之前我们在学习MMU的时候,知道这个内存的分配和CP15协处理器。这里先介绍一下CP15寄存器以及访问CP15寄存器的汇编指令。CP15的寄存器列表:FCSE(Fast Context Switch Extension,快速上下文切换)位于 CPU 和 MMU 之间,如果两个进程使用了同样的虚拟地址空间,则对 CPU而言,两个进程使用了同样的虚拟地址空间。快速上下文切换机构对各进程的虚拟地址进行变换,这样系统中除了 CPU 之外的部分看到的是经过快速上下文切换机构变换的虚拟地址。原创 2023-08-12 15:25:59 · 1246 阅读 · 0 评论 -
内存系列学习(一):万字长文带你搞定MMU&TLB&TWU
一直在学习内存管理,也知道MMU是管理内存的映射的逻辑IP,还知道里面有个TLB。今天刚刚好看到了几篇前辈的文章,很是不错,于是这里来一起学习一下吧。原创 2023-08-12 12:58:17 · 1570 阅读 · 0 评论 -
【转】Linux sysfs设备驱动管理简介
sysfs是非持久性虚拟文件系统,它提供系统的全局视图,并通过它们的kobiect显示内核对象的层次结构(拓扑)。每个kobiect显示为录和目录中的文件,目录代表相关kobject导出的内核变量。这些文件称为属性,可以读取或写入。如果任何已注册的kobiect在sysfs中创建目录,则目录的创建位置取决于kobiec的父项(它也是kobiect)。这些目录自然创建为kobject父项的子目录。这向用户空间出显示了内部对象的层次结构。sysfs 中的顶级目录表示对象层次结构的共同祖先,即对象所属的子系统。转载 2023-05-16 22:07:56 · 434 阅读 · 0 评论 -
跟着老狼看内存
在80286时代,内存颗粒(Chip)是直接插在主板上的,叫做DIP(Dual In-line Package)。到了80386时代,换成1片焊有内存颗粒的电路板,叫做SIMM(Single-Inline Memory Module)。由阵脚形态变化成电路板带来了很多好处:模块化,安装便利等等,由此DIY市场才有可能产生。转载 2023-05-07 12:34:53 · 1767 阅读 · 0 评论 -
DDR中的Training?
最近不是在看启动吗?里面总是有个DDR Training,就很纳闷这是个啥。但是一百度实在是没找到。不小心今天找到了一篇前辈的文章,这我不得马上去整来学习一下。有人说BIOS程序就是按照硬件手册和根据用户选择填寄存器,几张表就能解决的事为什么要这许多程序呢?虽然数千个选择形成的组合爆炸让穷举表成为不可能,但它也道出了BIOS大部分程序的实质:填写寄存器。有一个声音发出了不同意见,在BIOS程序里面,长期居住了一个另类,他的名字叫做MRC:内存参考代码。他的任务就是初始化内存。转载 2023-05-07 11:30:32 · 7190 阅读 · 0 评论 -
【转】从内核文件系统看文件读写过程
操作系统的主要功能是为管理硬件资源和为应用程序开发人员提供良好的环境,但是计算机系统的各种硬件资源是有限的,因此为了保证每一个进程都能安全的执行。处理器设有两种模式:“用户模式”与“内核模式”。一些容易发生安全问题的操作都被限制在只有内核模式下才可以执行,例如I/O操作,修改基址寄存器内容等。应用程序代码运行在用户模式下,当应用程序需要实现内核模式下的指令时,先向操作系统发送调用请求。操作系统收到请求后,执行系统调用接口,使处理器进入内核模式。转载 2023-04-23 21:49:20 · 326 阅读 · 0 评论 -
什么是内存颗粒?内存条的构成!
*内存条颗粒即内存芯片(又称晶片),内存条颗粒是内存条重要的组成部分,**内存颗粒将直接关系到内存容量的大小和内存体制的好坏。不同厂商生产的内存颗粒体制、性能都存在一定的差异,一般常见的内存颗粒厂商有镁光、英飞凌、三星、现代、南亚等。1、根据内存颗粒厂商来看:目前消费市场90%的内存颗粒都是由镁光、海力士、三星这三大家来自美韩的巨头生产,除此以外还有南亚、华邦和力晶等厂商也会生产,不过后面这几家厂商现在主要生产服务器内存的颗粒,消费市场就相对少一点。原创 2023-04-13 22:16:51 · 10546 阅读 · 0 评论 -
知道LPDDR和DDR什么关系吗?
话不多说,先上大白话,一个网友总结的很好:简单地说DRR4是标准电压版的PC和服务器内存,LPDDR4属于手机等嵌入式移动设备使用的低电压低功耗内存,LPDDR4X则是LPDDR4的升级版,下面详细看看老哥的博客。LPDDR4是与DDR4内存等效的移动设备。。LPDDR4具有两个16位通道,从而使每个DIMM的总线总长度为32位。相比之下,DDR4每个DIMM具有64位通道。原创 2023-04-13 22:02:14 · 2296 阅读 · 0 评论 -
内存学习(八):块分配器1
前面我们知道了页分配器,但是有一定的使用场景不让人满意,因此这里又引伸出了块分配器,这个内存的分配方式有更小的粒度。SLAB分配器的作用不仅仅是分配小块内存,,每个内存缓存由多个大块(slab,原意是大块的混凝土)组成,一个大块是一个或多个连续的物理页,每个大块包含多个对象。SLAB采用了面向对象的思想,基于对象类型管理内存,,例如进程描述符(task_struct)是一个类,每个进程描述符实例是一个对象。内存缓存的组成如图3.21所示。原创 2023-03-13 20:09:39 · 166 阅读 · 0 评论 -
内存学习(七):伙伴分配器(正式版)4
页分配器提供了以下释放页的接口。(1)void __free_pages(struct page *page, unsigned int order),第一个参数是第一个物理页的page实例的地址,第二个参数是阶数。(2)void free_pages(unsigned long addr, unsigned int order),第一个参数是第一个物理页的起始内核虚拟地址,第二个参数是阶数。原创 2023-03-03 21:59:48 · 170 阅读 · 0 评论 -
内存学习(七):伙伴分配器(正式版)3
内核针对分配单页做了性能优化,为了减少处理器之间的锁竞争,在。内存区域在每个处理器上有一个页集合,页集合中每种迁移类型有一个页链表。页集合有高水线和批量值,页集合中的页数量不能超过高水线。申请单页加入页链表,或者从页链表返还给伙伴分配器,都是采用批量操作,一次操作的页数量是批量值。默认的批量值batch的计算方法如下。(1)batch = zone->managed_pages / 1024,其中zone->managed_pages是内存区域中由伙伴分配器管理的页数量。原创 2023-03-03 21:54:34 · 1008 阅读 · 0 评论 -
内存学习(七):伙伴分配器(正式版)2
在系统长时间运行后,物理内存可能出现很多碎片,可用物理页很多,但是最大的连续物理内存可能只有一页。内存碎片对用户程序不是问题,因为用户程序可以通过页表把连续的虚拟页映射到不连续的物理页。**但是内存碎片对内核是一个问题,因为内核使用直接映射的虚拟地址空间,连续的虚拟页必须映射到连续的物理页。**内存碎片是伙伴分配器的一个弱点。为了预防内存碎片,内核根据可移动性把物理页分为3种类型。(1)不可移动页:位置必须固定,不能移动,直接映射到内核虚拟地址空间的页属于这一类。(2)可移动页:使用页表映射的页属于这一类,原创 2023-03-03 21:28:26 · 333 阅读 · 0 评论 -
内存学习(六):引导内存分配器(初始化)
在内核初始化的过程中需要分配内存,内核提供了临时的引导内存分配器,在页分配器和块分配器初始化完毕后,把空闲的物理页交给页分配器管理,丢弃引导内存分配器。早期使用的引导内存分配器是bootmem,目前正在使用memblock取代bootmem。**如果开启配置宏CONFIG_NO_BOOTMEM, memblock就会取代bootmem**。为了保证兼容性,bootmem和memblock提供了相同的接口。(之前也提到过这个,因为在内核的初始化阶段内存分配器还没初始化好,因此内存的分配需要临时的内存分配器原创 2023-03-02 23:59:31 · 838 阅读 · 0 评论 -
内存学习(七):伙伴分配器(正式版)1
当前使用的页分配器是伙伴分配器,伙伴分配器的特点是算法简单且效率高。(接力棒由之前memblock交给了伙伴分配器)原创 2023-03-02 23:58:28 · 421 阅读 · 0 评论 -
内存学习(五):物理内存组织
目前多处理器系统有两种体系结构。**(1)非一致内存访问(Non-Uniform Memory Access, NUMA):**指内存被划分成多个内存节点的多处理器系统,访问一个内存节点花费的时间取决于处理器和内存节点的距离。每个处理器有一个本地内存节点,处理器访问本地内存节点的速度比访问其他内存节点的速度快。NUMA是中高端服务器的主流体系结构。原创 2023-03-02 23:57:32 · 535 阅读 · 0 评论 -
内存学习(二):物理地址空间虚拟地址空间布局
因为目前应用程序没有那么大的内存需求,所以ARM64处理器不支持完全的64位虚拟地址,实际支持情况如下。(1)虚拟地址的最大宽度是48位,如图所示。内核虚拟地址在64位地址空间的顶部,高16位是全1,范围是[0xFFFF 0000 0000 0000,0xFFFF FFFF FFFF FFFF];用户虚拟地址在64位地址空间的底部,高16位是全0,范围是[0x00000000 0000 0000,0x0000 FFFF FFFF FFFF];高16位是全1或全0的地址称为规范的地址,两者之间是不规范的地址,原创 2023-03-02 23:56:51 · 1815 阅读 · 0 评论 -
内存学习(一):物理地址空间内存概述
不连续页分配器提供了分配内存的接口vmalloc和释放内存的接口vfree,在内存碎片化的时候,申请连续物理页的成功率很低,可以申请不连续的物理页,映射到连续的虚拟页,即虚拟地址连续而物理地址不连续。当内存碎片化的时候,找不到连续的物理页,内存碎片整理(“memory compaction”的意译,直译为“内存紧缩”)通过迁移的方式得到连续的物理页。在这个一层,如果你曾经写过关于嵌入式或者c语言的代码你就会认识malloc,即使是高级语言的内存申请,本质上也是对malloc的封装以及优化。原创 2023-03-02 23:55:44 · 699 阅读 · 1 评论 -
内存学习(四):内存映射5
系统调用munmap用来删除内存映射,它有两个参数:起始地址和长度。系统调用munmap的执行流程如图所示,它把主要工作委托给源文件“mm/mmap.c”中的函数do_munmap。原创 2023-03-02 00:07:11 · 192 阅读 · 0 评论 -
内存学习(四):内存映射4
虚拟内存过量提交,是指所有进程提交的虚拟内存的总和超过物理内存的容量,内存管理子系统支持3种虚拟内存过量提交策略。默认策略是猜测,用户可以通过文件“/proc/sys/vm/overcommit_memory”修改策略。原创 2023-03-02 00:05:02 · 131 阅读 · 0 评论
分享