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

Linux 内核 内存管理Linux 内核内存布局 ③ ( Linux 内核 动态分配内存 系统接口函数 | 统计输出 vmalloc 分配内存 )

文章目录 一、Linux 内核 动态分配内存 系统接口函数 二、统计输出 vmalloc 分配内存 一、Linux 内核 动态分配内存 系统接口函数 ---- Linux 内核 " 动态分配内存 "...是通过 " 系统接口 " 实现 , 下面介绍几个重要 接口函数 ; ① 以 " 页 " 为单位分配内存 : alloc_pages , __get_free_page ; ② 以 " 字节 " 为单位分配..." 虚拟地址连续内存块 " : vmalloc ; ③ 以 " 字节 " 为单位分配 " 物理地址连续内存块 " : kmalloc ; 注意 该 " 物理地址连续内存块 " 是以 Slab 为中心...; 二、统计输出 vmalloc 分配内存 ---- 执行 grep vmalloc /proc/vmallocinfo 命令 , 可以统计输出 通过 vmalloc 函数分配 " 虚拟地址连续内存

5.1K30

详解Linux内核内存管理架构

内存管理子系统可能是linux内核中最为复杂一个子系统,其支持功能需求众多,如页面映射、页面分配、页面回收、页面交换、冷热页面、紧急页面、页面碎片管理、页面缓存、页面统计等,而且对性能也有很高要求...本文从内存管理硬件架构、地址空间划分和内存管理软件架构三个方面入手,尝试对内存管理软硬件架构做一些宏观上分析总结。...内存管理硬件架构 因为内存管理内核最为核心一个功能,针对内存管理性能优化,除了软件优化,硬件架构也做了很多优化设计。下图是一个目前主流处理器上存储器层次结构设计方案。 ?...linux内存映射管理是通过页表来实现,但是页表是放在内存,如果每次地址转换过程都需要访问一次内存,其效率是十分低下。这里CPU通过TLB硬件单元来加速地址转换。...内存管理软件架构 内核内存管理核心工作就是内存分配回收管理,其内部分为2个体系:页管理和对象管理

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

Linux 内核 内存管理内存管理架构 ① ( 内存管理架构组成 | 用户空间 | 内核空间 | MMU 硬件 | Linux 内核架构层次 | Linux 系统调用接口 )

文章目录 一、内存管理架构组成 ( 用户空间 | 内核空间 | MMU 硬件 ) 二、Linux 内核架构层次 三、Linux 系统调用接口 一、内存管理架构组成 ( 用户空间 | 内核空间 | MMU..." ; ② 内核空间 : Linux 内核启动后 , 一直 驻留在内存 中 , 应用程序 不能 读写 内核空间数据 , 不能直接调用 内核源码 中函数 ; 只能通过 " 系统调用 " 间接调用 内核函数...; ③ 硬件 : 硬件主要是指 处理器 中 " 内存管理单元 “ , 该 内存管理单元 主要作用是 将 ” 虚拟内存地址 " 转为 " 物理内存地址 " ; " 内存管理单元 " , 英文名称是 "...组成 ; 层次架构如下 : Linux 内核 需要 " 管理硬件 " , 如 : CPU 处理器 , 内存 , I/O 设备 , 网络设备 等 ; Linux 内核 还需要 向上层 " 应用程序...⑤ 网络管理 : 内核 调用 网络接口 , 实现 网络管理 ; " 设备管理 " 对用户是透明 , 用户不直到 Linux 内核是如何管理设备 , 系统调用接口没有关于 " 设备管理 " 调用接口

9.5K40

Linux内核内存管理与漏洞利用

前言 网上已经有很多关于Linux内核内存管理分析和介绍了,但是不影响我再写一篇:一方面是作为其他文章补充,另一方面则是自己学习记录、总结和沉淀。...只有彼此buddy才能够进行合并。 使用Buddy算法应用有很多,其中Linux内核就是一个,此外jemalloc也是使用Buddy技术一个现代内存分配器。...【文章福利】【Linux内核内存管理专题训练营】火热开营!!...最新Linux内核技术详解 独家Linux内核内存管理干货分享 入营地址:inux内核内存管理专题训练营 两天持续技术输出: -------------------- 第一天: 1.物理内存映射及空间划分...其中partial是Linux内核中可插拔式通用双链表结构,使用内核中双链表接口进行操作。nr_partial表示partial双链表中元素个数,即slab个数。

2.3K00

DPDK巨页地址管理Linux内核内存管理内存映射pagemaprdma内存注册

DPDK巨页地址管理/Linux内核内存管理/内存映射/pagemap/rdma内存/注册术语PFN: 物理地址对应页帧号:pfn = pte_pfn(*pte)INFINIBAND_USER_MEM...主机内存缓存 (HMC) 是负责管理存储在主机内存 iWARP 上下文对象组件。...HMC 在每个 PCI 功能基础上管理主机内存,并进一步将每个 PCI 功能 HMC 内存空间分解为用于管理用于给定 PCI 功能每个上下文对象内存。...协议引擎资源将在 11.1 节中进一步讨论Linux内存管理数据结构关系图关键函数rte_mem_virt2phyrte_eal_memory_initpte_to_pagemap_entrysmaps_pte_rangeshow_smappte_pfn...请阅读有关大页 Linux 内核文档,以获取有关如何保留大页更多信息。

18610

Linux内核内存管理与漏洞利用案例分析

本文主要介绍Buddy System、Slab Allocator实现机制以及现实中一些漏洞利用方法,从攻击者角度加深对Linux内核内存管理机制理解。...前言 网上已经有很多关于Linux内核内存管理分析和介绍了,但是不影响我再写一篇:) 一方面是作为其他文章补充,另一方面则自己学习记录、总结和沉淀。...只有彼此buddy才能够进行合并。 使用Buddy算法应用有很多,其中Linux内核就是一个,此外jemalloc也是使用Buddy技术一个现代内存分配器。...维基百科中有一个很直观例子:Buddy memory allocation。Linux内核伙伴系统块大小为一页,通常是4096字节。最大order一般是10,即MAX_ORDER为11。...其中partial是Linux内核中可插拔式通用双链表结构,使用内核中双链表接口进行操作。nr_partial表示partial双链表中元素个数,即slab个数。

1.1K20

Linux内核设备驱动之内存管理笔记整理

/********************** * linux内存管理 **********************/ 到目前为止,内存管理是unix内核中最复杂活动。...我们简单介绍一下内存管理,并通过实例说明如何在内核态获得内存。 (1)各种地址 对于x86处理器,需要区分以下三种地址: *逻辑地址(logical address) 只有x86支持。...(1)内核内存管理 内核把物理页作为内存管理基本单位。这主要是因为内存管理单元(MMU)是以页为单位进行虚拟地址和物理地址转换,从虚拟内存角度来看,页就是最小单位。...这些特性包括: *一些硬件只能用某些特定内存地址来执行DMA *一些体系结构其内存物理寻址范围远大于虚拟寻址范围,这样,就有一些内存不能永久地映射到内核空间 针对这些限制,linux采用了三种区(<...系统中只有3个这样区结构。 (2)页分配 内核是使用页进行内存管理,因此,我们在内核中也可以要求系统以页为单位给我们分配内存

1.6K20

Linux 内核Linux 内核体系架构 ( 进程调度 | 内存管理 | 中断管理 | 设备管理 | 文件系统 )

包括 进程创建 , 销毁 , 线程组管理 , 内核线程管理 , 队列等待 ; 进程调度 位于 下图 Linux 内核整体架构图 中 内核空间 ; 二、内存管理 ---- 内存管理 涉及到 物理内存管理...和 虚拟内存管理 , 是 Linux 内核中 最复杂模块 ; 虚拟内存管理 包括 : 反向映射 , KSM , MMAP 映射 , 缺页中断 , 共享内存 , 进程虚拟地址空间管理 , 页面回收 ;...物理内存管理 包括 : 页面分配器 等 ; 内存管理 位于 下图 Linux 内核整体架构图 中 内核空间 ; 三、中断管理 ---- 中断管理 包括 : 处理器异常处理 , 中断处理 ; 异常指的是...处理器执行时 , 检测 异常条件 , 处理器需要停止当前执行栈 , 处理异常 ; 中断管理 位于 下图 Linux 内核整体架构图 中 内核空间 ; 四、设备管理 ---- Linux 内核 支持外设类型...内核可以很方便集成各种文件系统 ; 文件系统 位于 下图 Linux 内核整体架构图 中 内核空间 ;

1.8K30

Linux内核内存管理算法Buddy和Slab

有了前两节学习相信读者已经知道CPU所有的操作都是建立在虚拟地址上处理(这里虚拟地址分为内核态虚拟地址和用户态虚拟地址),CPU看到内存管理都是对page管理,接下来我们看一下用来管理page经典算法...为了避免出现这种情况,Linux内核中引入了伙伴系统算法(Buddy system)。...当然这对应用程序是不影响(前面我们讲过用页表可以把不连续物理地址在虚拟地址上连续起来),但是内核态就没有办法获取大块连续内存(比如DMA, Camera, GPU都需要大块物理地址连续内存)。...而当驱动需要使用时,就将进程占用内存通过回收或者迁移方式将之前占用预留内存腾出来,供驱动使用。 Slab 在Linux中,伙伴系统(buddy system)是以页为单位管理和分配内存。...总结 从内存DDR分为不同ZONE,到CPU访问Page通过页表来映射ZONE,再到通过Buddy算法和Slab算法对这些Page进行管理,我们应该可以从感官角度理解了下图: ?

3.4K73

Windows内核内存管理

内存管理要点 内核内存是在虚拟地址空间高2GB位置,且由所有进程所共享,进程进行切换时改变只是进程用户分区内存 驱动程序就像一个特殊DLL,这个DLL被加载到内核地址空间中,DriverEntry...,只在debug版本中生效,用于判断当前中断请求级别,当级别高于DISPATCH_LEVEL(包含这个级别)时会产生一个断言 内核堆申请函数 PVOID ExAllocatePool(...,这个时候即使内存仍有剩余,但是我们也申请不了内存,一般在操作系统空闲时候会进行内存整理,将空洞内存进行合并,如果驱动需要频繁内存中申请释放相同大小内存块,DDK提供了Lookaside内存容器...结构中内存不够时,他会自动向操作系统申请更多内存,如果lookaside内部有大量未使用内存时,他会自动释放一部分,总之它是一个智能自动调整内存大小一个容器。...在内核中,对于内存读写要相当谨慎,稍不注意就可能产生一个新漏洞或者造成系统蓝屏崩溃,有时在读写内存前需要判断该内存是否合法可供读写,DDK提供了两个函数来判断内存是否可读可写 VOID ProbeForRead

1.3K20

Linux 内核 内存管理内存管理架构 ② ( 用户空间内存管理 | malloc | ptmalloc | 内核空间内存管理 | sys_brk | sys_mmap | sys_munmap)

文章目录 一、用户空间内存管理 ( malloc / free / ptmalloc / jemalloc / tcmalloc ) 二、内核空间内存管理 1、内核内存管理系统调用 ( sys_brk...原理是 , 调用 Linux 内核 提供 brk / mmap 系统调用接口 , 以 " 内存页 “ 为单位 , 申请内存 , 然后将申请内存 分成 ” 内存块 “ 分配给 用户空间 ” 应用程序..." 二、内核空间内存管理 ---- 1、内核内存管理系统调用 ( sys_brk | sys_mmap | sys_munmap ) 在 " 内核空间 " 中 , 调用 Linux 内核 sys_brk..." ; 2、sys_brk、sys_mmap 系统调用 可参考 【Linux 内核 内存管理Linux 内核内存管理 ② ( 动态分配堆内存方式 | brk 系统调用 | mmap 系统调用 |...mmap 系统调用 : 向 Linux 操作系统 申请 " 虚拟地址空间 " 内存 , 并且将某个文件 " 映射 “ 到该申请内存中 ; 如果 不需要映射文件 到该空间中 , 则该空间就是 ” 匿名空间

91010

Linux内核内存管理算法Buddy和Slab

有了前两节学习相信读者已经知道CPU所有的操作都是建立在虚拟地址上处理(这里虚拟地址分为内核态虚拟地址和用户态虚拟地址),CPU看到内存管理都是对page管理,接下来我们看一下用来管理page经典算法...为了避免出现这种情况,Linux内核中引入了伙伴系统算法(Buddy system)。...当然这对应用程序是不影响(前面我们讲过用页表可以把不连续物理地址在虚拟地址上连续起来),但是内核态就没有办法获取大块连续内存(比如DMA, Camera, GPU都需要大块物理地址连续内存)。...而当驱动需要使用时,就将进程占用内存通过回收或者迁移方式将之前占用预留内存腾出来,供驱动使用。 Slab 在Linux中,伙伴系统(buddy system)是以页为单位管理和分配内存。...总结 从内存DDR分为不同ZONE,到CPU访问Page通过页表来映射ZONE,再到通过Buddy算法和Slab算法对这些Page进行管理,我们应该可以从感官角度理解了下图: ?

2K30

Linux内核高端内存

Linux内核地址映射模型 x86 CPU采用了段页式地址映射模型。进程代码中地址为逻辑地址,经过段页式地址映射后,才真正访问物理内存。 段页式机制如下图。 ?...Linux内核地址空间划分 通常32位Linux内核地址空间划分0~3G为用户空间,3~4G为内核空间。注意这里是32位内核地址空间划分,64位内核地址空间划分是不同。 ?...Linux内核高端内存由来 当内核模块代码或线程访问内存时,代码中内存地址都为逻辑地址,而对应到真正物理内存地址,需要地址一对一映射,如逻辑地址0xc0000003对应物理地址为0x3,0xc0000004...Linux内核高端内存理解 前面我们解释了高端内存由来。...2、64位内核中有高端内存吗? 目前现实中,64位Linux内核不存在高端内存,因为64位内核可以支持超过512GB内存。若机器安装物理内存超过内核地址空间范围,就会存在高端内存

4.3K31

通过fork来剖析Linux内核内存管理和进程管理(下)

上一篇文章我们讲到fork时候内存管理相关内容,时间大概隔了快一周了,发布下篇文章,写文章确实费时费力,需要仔细推敲,原创不易,希望大家多多支持吧。...本文讲解fork时候进程管理相关内容,主要讲解fork时候进程如何组装调用相关基础设施组件,以及如何加入运行队列,调度执行时候究竟会发生什么。...首先需要说明一点是,进程task_struct是资源封装和管理结构,如管理进程虚拟内存mm_struct,进程打开文件files_struct等,而进程参与调度使用是调度实体去管理调度(对于普通进程是...ret_from_fork) ret_from_fork首先跳转到schedule_tail(会raw_spin_unlock_irq打开中断和自旋锁以及一些对前一个进程做回收等操作)中执行,然后对于内核线程直接调用之前设置内核执行函数...总结 写到这里,Linux内核进程创建也就讲完了,当然fork实现涉及到很多内容,这里只是从内存管理和进程调度两个维度来看进程创建过程,阅读完这两篇文章希望能帮助大家理解fork时候背后隐藏一些技术细节

1.5K21

通过fork来剖析Linux内核内存管理和进程管理(上)

1.开场白 本文主要从内存管理和进程管理两个维度来窥探一下fork背后隐藏技术细节,希望能够通过本文让大家站在一个高度去看进程创建。...全文分为两部分讲解:fork内存管理部分和进程管理部分,内存管理主要讲解子进程如何构建自己内存管理相关基础设施,父子进程如何共享地址空间,写时复制如何发生,页表层面为我们做了哪些事情等等。...总结来说:fork中构建了内存管理相关基础设施如mm_struct ,vma,pgd页等,以及拷贝父进程vma和拷贝父进程页表来达到和父进程共享地址空间目的,可以看处理这种共享并不是像共享内存那种纯粹意义上共享...2.3 内存基础设施使用之--各级页表创建 我们知道,对于用户进程来说,内核并不是马上满足进程对于物理页请求,而仅仅是为他分配虚拟页,内核采用一种惰性内存分配方式,知道访问最后一刻才为进程分配物理页...讲到这里,我们fork时第一个维度内存管理部分讲解完了,下面给出大致总结:fork时候会创建内核管理一些基础设施:如mm_struct, vma等用于描述进程自己地址空间,然后会创建出进程私有的

1.7K21

Linux 内核 内存管理内存管理系统调用 ④ ( 代码示例 | mmap 创建内存映射 | munmap 删除内存映射 )

sizeof(student) * 1 : 文件映射区长度 PROT_READ | PROT_WRITE : 内存保护标志位 , 该内存内容可以 读取 写入 MAP_SHARED : 指定映射关系..., 指的是该映射是进程共享内存空间 fd : 文件描述符 , 被映射文件 0 : 被映射文件偏移量 , 从文件哪个字节位置开始映射 如果返回 -1 指针 , 则说明 内存映射 创建失败 ;...: 内存保护标志位 , 该内存内容可以 读取 写入 // MAP_SHARED : 指定映射关系 , 指的是该映射是进程共享内存空间 // fd : 文件描述符 , 被映射文件...// sizeof(student) * 1 : 文件映射区长度 // PROT_READ | PROT_WRITE : 内存保护标志位 , 该内存内容可以 读取 写入...name[1] = '\0'; // 拷贝 字符串 到 p_student 指向内存中 , 该内存是文件映射内存 // 拷贝内存同时 , 也会修改文件内容

1.4K10

Linux 内核 内存管理Linux 内核内存管理 ③ ( CPU 计数器瓶颈 | per-CPU 计数器 | Linux 内核 percpu_counter 结构体源码 )

CPU 需要等待计数器释放 , 才能访问 CPU 计数器 , 这里 CPU 计数器会出现瓶颈 , 影响系统性能 ; 二、per-CPU 计数器及 percpu_counter 结构体源码 ---- Linux...内核中 , 引入了 " per-CPU 计数器 “ , 用于加速 ” SMP 系统 " 计数器操作 ; " per-CPU 计数器 " 在 Linux 内核中被定义为 percpu_counter...结构体 , 该 结构体 定义在 Linux 内核源码 linux-5.6.18\include\linux\percpu_counter.h#20 中 ; raw_spinlock_t lock 字段是一个...自旋锁 ; s64 count 字段是 计数器值 ; struct percpu_counter { raw_spinlock_t lock; s64 count; #ifdef CONFIG_HOTPLUG_CPU...-5.6.18\include\linux\percpu_counter.h#20

1K10

高端内存映射之kmap持久内核映射--Linux内存管理(二十)

1 高端内存内核映射 尽管vmalloc函数族可用于从高端内存域向内核映射页帧(这些在内核空间中通常是无法直接看到), 但这并不是这些函数实际用途....内核通常会成功,因为大部分大内存块都在启动时分配给内核,那时内存碎片尚不严重。但在已经运行了很长时间系统上, 在内核需要物理内存时, 就可能出现可用空间不连续情况....说明 注意用户空间当然可以使用高端内存,而且是正常使用,内核在分配那些不经常使用内存时,都用高端内存空间(如果有),所谓不经常使用是相对来说,比如内核一些数据结构就属于经常使用,而用户一些数据就属于不经常使用...总之,内核高端线性地址是为了访问内核固定映射以外内存资源。进程在使用内存时,触发缺页异常,具体将哪些物理页映射给用户进程是内核考虑事情. 在用户空间中没有高端内存这个概念....即内核对于低端内存, 不需要特殊映射机制, 使用直接映射即可以访问普通内存区域, 而对于高端内存区域, 内核可以采用三种不同机制将页框映射到高端内存 : 分别叫做永久内核映射、临时内核映射以及非连续内存分配

3.3K10

Linux 内核 内存管理Linux 内核内存管理 ① ( 堆内存管理 | 内存描述符 mm_struct 结构体 | mm_struct 结构体中 start_brk、brk 成员 )

文章目录 一、堆内存管理 二、内存描述符 mm_struct 结构体 三、mm_struct 结构体中 start_brk、brk 成员 一、堆内存管理 ---- Linux 操作系统中 " 堆内存...“ 是通过 malloc 等函数 ” 动态分配 " 内存区域 ; " 堆内存 “ 是 ” 连续内存区域 , 其 " 生长方向 " 是 ” 自下而上 " 生长 ; " 堆内存 " 管理 由...Linux 内核实现 , 开发者 不知道 堆管理细节 , 只通过 " 系统调用 " 调用相关函数 ; " brk 系统调用 " 负责 扩展 和 收缩 堆内存 ; 在 " 内存描述符结构体 " mm_struct...结构体 ---- mm_struct 结构体 定义在 Linux 内核源码 include\linux\mm_types.h#375 源码中 ; mm_struct 结构体 源码 : struct mm_struct...、brk 成员 , 分别是 " 堆内存 " 在 " 虚拟地址空间 " 开始 和 结束 地址 , 其定义在 Linux 内核源码 linux-5.6.18\include\linux\mm_types.h

83220

Linux 内核 内存管理内存管理系统调用 ⑤ ( 代码示例 | 多进程共享 mmap 内存映射示例 )

文章目录 一、进程一描述 二、进程二描述 三、mmap 进程共享内存展示 一、进程一描述 ---- 在上一篇博客 【Linux 内核 内存管理内存管理系统调用 ④ ( 代码示例 | mmap 创建内存映射...| munmap 删除内存映射 ) 中 , 完成了 进程一 程序 , 在该进程中 , 创建并打开文件 , 为该文件设置大小 , 使用 mmap 创建 " 文件映射 " , 并通过直接访问内存方式...; 二、进程二描述 ---- 进程二 源码 , 与上一篇博客 【Linux 内核 内存管理内存管理系统调用 ④ ( 代码示例 | mmap 创建内存映射 | munmap 删除内存映射 ) 中 进程一...// sizeof(student) * 1 : 文件映射区长度 // PROT_READ | PROT_WRITE : 内存保护标志位 , 该内存内容可以 读取 写入...// MAP_SHARED : 指定映射关系 , 指的是该映射是进程共享内存空间 // fd : 文件描述符 , 被映射文件 // 0 : 被映射文件偏移量 , 从文件哪个字节位置开始映射

3.5K30
领券