借用这段逻辑地址空间,建立映射到想访问的那段物理内存(即填充内核PTE页面表),临时用一会,用完后归还。这样别人也可以借用这段地址空间访问其他物理内存,实现了使用有限的地址空间,访问所有所有物理内存。...这个空间起叫”内核永久映射空间”或者”永久内核映射空间”。这个空间和其它空间使用同样的页目录表,对于内核来说,就是 swapper_pg_dir,对普通进程来说,通过 CR3 寄存器指向。...因此,对于不使用的的 page,及应该时从这个空间释放掉(也就是解除映射关系),通过 kunmap() ,可以把一个 page 对应的线性地址从这个空间释放出来。...2、64位内核中有高端内存吗? 目前现实中,64位Linux内核不存在高端内存,因为64位内核可以支持超过512GB内存。若机器安装的物理内存超过内核地址空间范围,就会存在高端内存。...5、为什么不把所有的地址空间都分配给内核? 若把所有地址空间都给内存,那么用户进程怎么使用内存?怎么保证内核使用内存和用户进程不起冲突?
文章目录 一、Linux 内核 动态分配内存 系统接口函数 二、统计输出 vmalloc 分配的内存 一、Linux 内核 动态分配内存 系统接口函数 ---- Linux 内核 " 动态分配内存 "...是通过 " 系统接口 " 实现的 , 下面介绍几个重要的 接口函数 ; ① 以 " 页 " 为单位分配内存 : alloc_pages , __get_free_page ; ② 以 " 字节 " 为单位分配..." 虚拟地址连续的内存块 " : vmalloc ; ③ 以 " 字节 " 为单位分配 " 物理地址连续的内存块 " : kmalloc ; 注意 该 " 物理地址连续的内存块 " 是以 Slab 为中心的...; 二、统计输出 vmalloc 分配的内存 ---- 执行 grep vmalloc /proc/vmallocinfo 命令 , 可以统计输出 通过 vmalloc 函数分配的 " 虚拟地址连续的内存块
文件的内存映射示意图: 对于用户进程和内核进程: 将用户进程的一段内存区域映射到内核进程,映射成功后,用户进程对这段内存区域的修改直接反映到内核空间,同样,内核进程对这段内存区域的修改也直接反映到用户空间...没有内存映射的I/O操作示意图: 磁盘->内核空间->用户空间 有内存映射的I/O操作示意图:少了一个copy操作 内存映射的优点: 减少了拷贝次数,节省I/O操作的开支 用户空间和内核空间可以直接高效交互...进程可以直接操作磁盘文件,用内存读写代替 I/O读写 应用场景: 1.进程间通信 使用内存映射实现进程间通信的两个场景: 场景1.有亲缘关系的进程间通信(父子进程) step1: 父进程创建内存映射区...*使用mmap时需要注意,不是所有文件都可以进行内存映射,一个访问终端或者套接字的描述符只能用read/write这类的函数去访问,用mmap做内存映射会报错。...一般用信号量来同步共享内存的访问。 共享内存区在系统存储中的位置: 为什么要用共享内存: 对于涉及到内核操作的,内核和进程之间,经历了四次复制操作,开销很大。
关于Dumpscan Dumpscan是一款功能强大的命令行工具,该工具可以帮助广大研究人员从内核以及Windows Minidump格式提取和导出敏感数据。 ...install dumpscan pipx inject dumpscan git+https://github.com/volatilityfoundation/volatility3#39e812a 工具使用...│ │ kernel 使用...───────────────────────────────────────────────────────────────────────────────╯ 针对那些能够提取证书的子命令,我们可以使用...内核模式 该工具实现的内核分析功能是通过Volatility3实现的,“cmdline”、“envar”和“pslist”命令都将直接调用Volatility3插件,而“symcrypt”和“x509”
内存管理的要点 内核内存是在虚拟地址空间的高2GB位置,且由所有进程所共享,进程进行切换时改变的只是进程的用户分区的内存 驱动程序就像一个特殊的DLL,这个DLL被加载到内核的地址空间中,DriverEntry...,否则会造成系统蓝屏,在编译WDK相关例程时,可以使用如下的宏指定某个例程或者某个全局变量是位于分页内存还是运行于非分页内存 #define PAGEDCODE code_seg("PAGE") //分页内存...//函数体 } 其中PAGED_CODE是一个WDK中提供的一个宏,只在debug版本中生效,用于判断当前的中断请求级别,当级别高于DISPATCH_LEVEL(包含这个级别)时会产生一个断言 内核中的堆申请函数...,如果申请的内存过多,lookaside结构中的内存不够时,他会自动向操作系统申请更多的内存,如果lookaside内部有大量未使用的内存时,他会自动释放一部分,总之它是一个智能的自动调整内存大小的一个容器...在内核中,对于内存的读写要相当的谨慎,稍不注意就可能产生一个新漏洞或者造成系统的蓝屏崩溃,有时在读写内存前需要判断该内存是否合法可供读写,DDK提供了两个函数来判断内存是否可读可写 VOID ProbeForRead
因此仅仅依靠此功能还不够,所以内核又引入了内存规整等功能。...内存规整 在内存规整引入之前,内核还使用过 lumpy reclaim 来进行反碎片化,但在我们当前最常用的 3.10 版本内核上已经不存在了,所以不做介绍,感兴趣的朋友请从文章开头整理的列表中自取,我们来看内存规整...对于 3.10 版本内核,内存规整的时机如下: 在分配高阶内存失败后 kswapd 线程平衡 zone; 直接内存回收来满足高阶内存需求,包括 THP 缺页异常处理路径; khugepaged 内核线程尝试...,率先使用低水位线尝试分配,若失败,则说明内存稍有不足,页分配器会唤醒 kswapd 线程异步回收页,然后再尝试使用最低水位线分配页。...页面迁移也是一个大话题,除了内存规整外,还有其他场景也会使用内存迁移,因此我们不在此展开。
由于早期的云服务器,大量存量3.10内核作为cvm的操作系统内核。3.10内核存在着很多已知问题,其中的常客之一便是内存不足场景下,内存回收引发的问题。...内存回收和OOM一直是Linux中一个饱受诟病的问题,其路径内核一直在优化,所以从理论上新版本内核一定是优于老版本。...本文通过构造用例测试,来针对3.10和5.4内核在内存不足场景下的表现进行分析对比,以说明5.4会在内存不足的场景下有更好的表现。...【测试数据】使用两台IT5 64C 256G 100M的cvm,一台3.10 内部内核,一台TencentOS 5.4.119-19-0009,内存相关内核参数相同。...图片后话5.4相较3.10内核在内存不足的场景下,更加稳定且性能更好已经可以从本文中的case分析得到一定程度上的证明,但本文中的场景也仅是抛砖引玉,3.10并非就这一个内存不足的场景有问题,总体相较5.4
文章目录 一、内存管理架构组成 ( 用户空间 | 内核空间 | MMU 硬件 ) 二、Linux 内核架构层次 三、Linux 系统调用接口 一、内存管理架构组成 ( 用户空间 | 内核空间 | MMU...硬件 ) ---- 内存管理架构 由 3 部分组成 : ① 用户空间 : 在 " 用户空间 " 中 , 使用 malloc 函数 申请 " 堆内存 " , 使用 free 函数 释放 " 堆内存..." ; ② 内核空间 : Linux 内核启动后 , 一直 驻留在内存 中 , 应用程序 不能 读写 内核空间数据 , 不能直接调用 内核源码 中的函数 ; 只能通过 " 系统调用 " 间接调用 内核函数...组成 ; 层次架构如下 : Linux 内核 需要 " 管理硬件 " , 如 : CPU 处理器 , 内存 , I/O 设备 , 网络设备 等 ; Linux 内核 还需要 向上层的 " 应用程序...中的如下功能 : ① 进程调度 : 内核 调用 CPU 处理器 实现 进程调度 ; ② 内存管理 : 内核 调用 物理内存 实现 内存管理 ; ③ IPC 跨进程通信 ④ VFS 虚拟文件系统
LiteOS内核的内存管理 1.1....Huawei LiteOS 的内存管理模块通过对内存的申请/释放操作,来管理用户和OS对内存的使用,使内存的利用率和使用效率达到最优,同时最大限度地解决系统的内存碎片问题。 1.2....当用户需要分配内存时,可以通过操作系统的动态内存申请函数索取指定大小内存块,一旦使用完毕,通过动态内存释放函数归还所占用内存,使之可以重复使用。 2....无论选择使用哪种动态内存管理算法,都使用该API。...实验代码 首先打开上一篇使用的 HelloWorld 工程,基于此工程进行实验。 在Demo文件夹右击,新建文件夹osal_kernel_demo用于存放内核的实验文件(如果已有请忽略这一步)。
由于 Linux 内核支持虚拟内存管理,物理内存碎片通常不是问题,因为在页表的帮助下,物理上分散的内存在虚拟地址空间仍然是连续的 (除非使用大页),但对于需要从内核线性映射区分配连续物理内存的需求来说就会变的非常困难...本文将重点描述当前常用的 3.10 版本内核在伙伴分配器的预防内存碎片的扩展,内存规整原理,如何查看碎片指数,以及如何量化内存规整带来的延迟开销等。...Linux 在经典算法的基础上做了一些个扩展: 分区的伙伴分配器; Per-CPU pageset; 根据迁移类型进行分组; 我们以前介绍过 Linux 内核使用 node, zone, page 来描述物理内存...比如对于用户空间的内存需求使用 GFP_MOVABLE,对于文件页使用 GFP_RECLAIMABLE。当某种迁移类型的页用完时,可以从其他迁移类型盗用物理页。...因此仅仅依靠此功能是不够的,内核需要一些手段来整治内存碎片。 未完待续...
内存映射空间划分 根据不同的内存使用方式和使用场景需要,内核把内存映射地址空间划分成多个部分,每个划分空间都有自己的起止地址、分配接口和使用场景。下图是一个常见的32位地址空间划分结构。 ?...直接内存动态分配地址空间:因为访问效率等原因,内核对内存采用简单的线性映射,但是因为32位CPU的寻址能力(4G大小)和内核地址空间起始的设置(3G开始),会导致内核的地址空间资源不足,当内存大于1GB...高端内存动态分配地址空间:高端内存分配的内存是虚拟地址连续而物理地址不连续的内存,一般用于内核动态加载的模块和驱动,因为内核可能运行了很久,内存页面碎片情况严重,如果要申请大的连续地址的内存页会比较困难...持久映射地址空间:内核上下文切换会伴随着TLB刷新,这会导致性能下降。但一些使用高端内存的模块对性能也有很高要求。...kmap_atomic的使用场景与kmap较为相似,主要用于mm、fs、net等对高端内存访问有较高性能要求而且不能休眠的模块中。
Linux内核在启动时会打印出内核内存空间的布局图,下面是ARM Vexpress平台打印出来的内存空间布局图: ? 这部分信息打印是在mem_init()函数中实现的。...内核编译完成后,会生成一个System.map文件,查询这个文件可以找到这些地址的具体数值。 ? 内核使用虚拟地址从MODULES_VADDR到MODULES_END这段14MB大小的内存区域。...内核许多驱动使用vmalloc来分配连续的虚拟地址的内存,因为有的驱动不需要连续的物理地址的内存;除此之外,vmalloc还可以用于高端内存的临时映射。...一个32bit系统中实际支持的内存数量会超过内核线性映射的长度,但是内核具有对所有内存的寻找能力。...如果物理内存高于4GB,那么在ARMv7-A架构中就要使用LPE机制来扩展物理内存访问了。用于映射高端内存的虚拟地址空间有限,所以又可以划分为两部分,一部分是临时映射区,另一部分为固定映射区。
文章目录 一、ARM64 架构体系内存分布 二、Linux 内核启动源码 start_kernel 三、内存初始化源码 mm_init 四、内存初始化源码 mem_init 一、ARM64 架构体系内存分布...将 " 地址空间 " 划分为 : 内核空间 和 用户空间 ; ① 内核空间 ( Kernel Space ) : 寻址范围 0x FFFF 0000 0000 0000 ~ 0x FFFF FFFF...User Space ) : 寻址范围 0x 0000 0000 0000 0000 ~ 0x 0000 FFFF FFFF FFFF ; 如下图所示 : 上图中的 " 不规范地址空间 " 是不允许使用的...内存空间 ; 二、Linux 内核启动源码 start_kernel ---- 在 Linux 内核初始化完成后 , 会在 " 初始化内存 " 时 , 输出 内存布局 ; Linux 内核启动源码是定义在...\mm\init_32.c#766 位置 ; 在内存初始化时 , 会打印如下格式的 " 内核空间 内存分布 " 日志 : printk(KERN_INFO "virtual kernel memory
,其实使用共享内存通道的时候,性能已经足够不错了,但是对于使用tcp的时候,特别是小数据包其实QPS不是很高。...) 8KB 36%/70% 280MB 1.27GB/s 163K/s Linux+共享内存 3(仅一个连接压力测试) 4KB 40%/73% 280MB 1.30MB/s 333K/s Linux+共享内存.../s Linux+共享内存 3(仅一个连接压力测试) 512字节 44%/100% 280MB 610MB/s 1250K/s Linux+共享内存 3(仅一个连接压力测试) 256字节 42%/100%...算上CPU的消耗比例,atbus的读性能和tbus对比的话,主要是 使用共享内存通道的时候,读性能是差不多的,写性能atbus要高过tbus大约不到一倍。...当然如果真要搞到2M的连接数,连内核底层的tcp窗口的缓冲区也得改。这个缓冲区默认情况都远大于4K。 最后加的一个东西就是:write队列什么时候合包?
让我们继续在《内核读写内存浮点数》的基础之上做一个简单的延申,如何实现多级偏移读写,其实很简单,读写函数无需改变,只是在读写之前提前做好计算工作,以此来得到一个内存偏移值,并通过调用内存写入原函数实现写出数据的目的...接下来,函数使用PsLookupProcessByProcessId函数查找目标进程并返回其PEPROCESS结构体。...的动态地址中的数据,如下图所示; 至于如何将数据写出四级偏移的基址上面,则只需要取出pbase里面的基址,并通过原函数WIN10_WriteProcessMemory直接写出数据即可,此出的原函数在《内核...KeReadProcessMemory(Process, pbase, rbuffer, 4); } __except (EXCEPTION_EXECUTE_HANDLER) { return 0; } // 使用原函数写入...ref = WIN10_WriteProcessMemory(Pid, (void *)pbase, 4, &SetValue); if (ref == TRUE) { DbgPrint("[内核写成功
Linux内核在大多数体系结构中都把两个地址空间划分为用户空间和内核空间。...64位的Linux内核已经没有高端内存的概念了,因为48位的寻址空间已经足够大了 在QEMU实验平台上,ARM64架构的LInux内核的内存分布图如下: ?...如图所示,ARM64架构处理器的Linux内核内存布局图。ARM64架构处理器的Linux内核内存布局如下: ?...(2)非规范区域 (3)内核空间:0xffff_0000_0000_0000到0xffff_ffff_ffff_ffff。一共有256TB。...内核空间又做了如下细分: vmalloc区域:0xffff_0000_0000_0000到0xffff_7bff_bfff_0000,大小为126974GB。
让我们继续在《内核读写内存浮点数》的基础之上做一个简单的延申,如何实现多级偏移读写,其实很简单,读写函数无需改变,只是在读写之前提前做好计算工作,以此来得到一个内存偏移值,并通过调用内存写入原函数实现写出数据的目的...接下来,函数使用PsLookupProcessByProcessId函数查找目标进程并返回其PEPROCESS结构体。...的动态地址中的数据,如下图所示;图片至于如何将数据写出四级偏移的基址上面,则只需要取出pbase里面的基址,并通过原函数WIN10_WriteProcessMemory直接写出数据即可,此出的原函数在《内核...{KeReadProcessMemory(Process, pbase, rbuffer, 4);}__except (EXCEPTION_EXECUTE_HANDLER){return 0;}// 使用原函数写入...BOOLEAN ref = WIN10_WriteProcessMemory(Pid, (void *)pbase, 4, &SetValue);if (ref == TRUE){DbgPrint("[内核写成功
前言 网上已经有很多关于Linux内核内存管理的分析和介绍了,但是不影响我再写一篇:一方面是作为其他文章的补充,另一方面则是自己学习的记录、总结和沉淀。...使用Buddy算法的的应用有很多,其中Linux内核就是一个,此外jemalloc也是使用Buddy技术的一个现代内存分配器。 Linux内核中的伙伴系统块大小为一页,通常是4096字节。...【文章福利】【Linux内核内存管理专题训练营】火热开营!!...最新Linux内核技术详解 独家Linux内核内存管理干货分享 入营地址:inux内核内存管理专题训练营 两天持续技术输出: -------------------- 第一天: 1.物理内存映射及空间划分...其中partial是Linux内核中可插拔式通用双链表结构,使用内核中双链表的接口进行操作。nr_partial表示partial双链表中的元素个数,即slab的个数。
Linux 5.12引入一个新的内存错误检测工具:KFENCE(Kernel Electric-Fence,内核电子栅栏)。KFENCE是一个低开销的、基于采样的内存错误检测工具。...KASAN依靠编译器插桩,对每个内存访问都检查地址的合法性,更精确,但是导致内核的性能下降,所以KASAN只适合测试环境。...KFENCE使用采样的方法,牺牲了精度,但是性能开销几乎为零,它被设计为在产品内核中使用,发现在测试环境中测试用例没有执行的代码路径中的缺陷。...可以使用内核启动参数“kfence.sample_interval”在启动时指定采样间隔,单位是毫秒,设置为0表示禁止KFENCE。 KFENCE通过debugfs文件系统提供了一些调试信息,如下。...技术原理 KFENCE使用一个固定长度的内存池,如图2.1所示。配置宏CONFIG_KFENCE_NUM_OBJECTS指定对象的数量。
KASAN 是 Kernel Address Sanitizer 的缩写,它是一个动态检测内存错误的工具,主要功能是检查内存越界访问和使用已释放的内存等问题。...KASAN 集成在 Linux 内核中,随 Linux 内核代码一起发布,并由内核社区维护和发展。本文简要介绍 KASAN 的原理及使用方法。 一、KASAN的原理和使用方法 1....使用特殊的magic num填充shadow memory,在每一次load/store内存的时候检测对应的shadow memory确定操作是否valid。...连续8 bytes内存(8 bytes align)使用1 byte shadow memory标记。...二、总结 KASAN通过建立影子内存来管理内存访问的合法性,可以有效检测内存越界等问题,但无法发现因逻辑问题导致的合法内存的内容改写问题。
领取专属 10元无门槛券
手把手带您无忧上云