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

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

文章目录 一、内存管理架构组成 ( 用户空间 | 内核空间 | MMU 硬件 ) 二、Linux 内核架构层次 三、Linux 系统调用接口 一、内存管理架构组成 ( 用户空间 | 内核空间 | MMU...硬件 ) ---- 内存管理架构 由 3 部分组成 : ① 用户空间 : 在 " 用户空间 " 中 , 使用 malloc 函数 申请 " 堆内存 " , 使用 free 函数 释放 " 堆内存..." ; ② 内核空间 : Linux 内核启动后 , 一直 驻留在内存 中 , 应用程序 不能 读写 内核空间数据 , 不能直接调用 内核源码 中的函数 ; 只能通过 " 系统调用 " 间接调用 内核函数...组成 ; 层次架构如下 : Linux 内核 需要 " 管理硬件 " , 如 : CPU 处理器 , 内存 , I/O 设备 , 网络设备 等 ; Linux 内核 还需要 向上层的 " 应用程序...⑤ 网络管理 : 内核 调用 网络接口 , 实现 网络管理 ; " 设备管理 " 对用户是透明的 , 用户不直到 Linux 内核是如何管理设备的 , 系统调用接口没有关于 " 设备管理 " 的调用接口

9.5K40

Linux内核高端内存

Linux内核地址空间划分 通常32位Linux内核地址空间划分0~3G为用户空间,3~4G为内核空间。注意这里是32位内核地址空间划分,64位内核地址空间划分是不同的。 ?...Linux内核高端内存的理解 前面我们解释了高端内存的由来。...常见问题: 1、用户空间(进程)是否有高端内存概念? 用户进程没有高端内存概念。只有在内核空间才存在高端内存用户进程最多只可以访问3G物理内存,而内核进程可以访问所有物理内存。...3、用户进程能访问多少物理内存内核代码能访问多少物理内存? 32位系统用户进程最大可以访问3GB,内核代码可以访问所有物理内存。...5、为什么不把所有的地址空间都分配给内核? 若把所有地址空间都给内存,那么用户进程怎么使用内存?怎么保证内核使用内存用户进程不起冲突?

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

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内核编程--内存映射和共享内存

文件的内存映射示意图: 对于用户进程和内核进程: 将用户进程的一段内存区域映射到内核进程,映射成功后,用户进程对这段内存区域的修改直接反映到内核空间,同样,内核进程对这段内存区域的修改也直接反映到用户空间...没有内存映射的I/O操作示意图: 磁盘->内核空间->用户空间 有内存映射的I/O操作示意图:少了一个copy操作 内存映射的优点: 减少了拷贝次数,节省I/O操作的开支 用户空间和内核空间可以直接高效交互...offset); start:用户进程中要映射的某段内存区域的起始地址,通常为NULL(由内核来指定) length:要映射的内存区域的大小 prot:期望的内存保护标志 flags:指定映射对象的类型...fd:要映射的文件描述符 offset:要映射的用户空间的内存区域在内核空间中已经分配好了的内存区域中的偏移 --prot参数取值: PROT_READ:映射区可读 PROT_WRITE:映射区可写...一般用信号量来同步共享内存的访问。 共享内存区在系统存储中的位置: 为什么要用共享内存: 对于涉及到内核操作的,内核和进程之间,经历了四次复制操作,开销很大。

5.9K10

Linux 内核 VS 内存碎片 (下)

Linux 内核 VS 内存碎片 (上) 我们可以看到根据迁移类型进行分组只是延缓了内存碎片,而并不是从根本解决,所以随着时间的推移,当内存碎片过多,无法满足连续物理内存需求时,将会引起性能问题。...因此仅仅依靠此功能还不够,所以内核又引入了内存规整等功能。...内存规整 在内存规整引入之前,内核还使用过 lumpy reclaim 来进行反碎片化,但在我们当前最常用的 3.10 版本内核上已经不存在了,所以不做介绍,感兴趣的朋友请从文章开头整理的列表中自取,我们来看内存规整...对于 3.10 版本内核内存规整的时机如下: 在分配高阶内存失败后 kswapd 线程平衡 zone; 直接内存回收来满足高阶内存需求,包括 THP 缺页异常处理路径; khugepaged 内核线程尝试...,但需要对内核相关子系统的工作原理要有一定理解,对客户的内核版本也有一定要求。

3.6K30

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

文章目录 一、用户空间内存管理 ( malloc / free / ptmalloc / jemalloc / tcmalloc ) 二、内核空间内存管理 1、内核内存管理系统调用 ( sys_brk...函数提供 内存操作接口 ; glibc 库提供的 ptmalloc 函数 的原理是 , 调用 Linux 内核 提供的 brk / mmap 系统调用接口 , 以 " 内存页 “ 为单位 , 申请内存..., 然后将申请的内存 分成 ” 内存块 “ 分配给 用户空间 的 ” 应用程序 " 二、内核空间内存管理 ---- 1、内核内存管理系统调用 ( sys_brk | sys_mmap | sys_munmap...) 在 " 内核空间 " 中 , 调用 Linux 内核中的 sys_brk / sys_mmap / sys_munmap 函数 , 管理 " 堆内存 " ; sys_brk 通过修改 堆内存 的..., 虚拟内存管理 从 ” 进程虚拟地址空间 “ 分配 / 释放 ” 虚拟内存页 " ; 2、sys_brk、sys_mmap 系统调用 可参考 【Linux 内核 内存管理】Linux 内核内存管理

93810

详解Linux内核内存管理架构

内存管理子系统可能是linux内核中最为复杂的一个子系统,其支持的功能需求众多,如页面映射、页面分配、页面回收、页面交换、冷热页面、紧急页面、页面碎片管理、页面缓存、页面统计等,而且对性能也有很高的要求...linux内存映射管理是通过页表来实现的,但是页表是放在内存中的,如果每次地址转换过程都需要访问一次内存,其效率是十分低下的。这里CPU通过TLB硬件单元来加速地址转换。...直接内存动态分配地址空间:因为访问效率等原因,内核内存采用简单的线性映射,但是因为32位CPU的寻址能力(4G大小)和内核地址空间起始的设置(3G开始),会导致内核的地址空间资源不足,当内存大于1GB...高端内存动态分配地址空间:高端内存分配的内存是虚拟地址连续而物理地址不连续的内存,一般用于内核动态加载的模块和驱动,因为内核可能运行了很久,内存页面碎片情况严重,如果要申请大的连续地址的内存页会比较困难...内存管理软件架构 内核内存管理的核心工作就是内存的分配回收管理,其内部分为2个体系:页管理和对象管理。

3K42

Linux 内核 VS 内存碎片 (上)

(外部)内存碎片是一个历史悠久的 Linux 内核编程问题,随着系统的运行,页面被分配给各种任务,随着时间的推移内存会逐步碎片化,最终正常运行时间较长的繁忙系统可能只有很少的物理页面是连续的。...由于 Linux 内核支持虚拟内存管理,物理内存碎片通常不是问题,因为在页表的帮助下,物理上分散的内存在虚拟地址空间仍然是连续的 (除非使用大页),但对于需要从内核线性映射区分配连续物理内存的需求来说就会变的非常困难...如果内核编程不再依赖线性地址空间的高阶物理内存分配,那么内存碎片问题就从根本上解决了,但对于 Linux kernel 这样庞大的工程来说,这样的修改显然是不可能的,所以从 Linux 2.x 版本至今...Linux 在经典算法的基础上做了一些个扩展: 分区的伙伴分配器; Per-CPU pageset; 根据迁移类型进行分组; 我们以前介绍过 Linux 内核使用 node, zone, page 来描述物理内存...对于通过页表访问虚拟地址空间的情况 (比如用户空间的堆内存需求)并不需要连续物理内存,为什么呢?

3.4K40

Linux 内核 内存管理】内存管理架构 ④ ( 内存分配系统调用过程 | 用户层 malloc free | 系统调用层 brk mmap | 内核层 kmalloc | 内存管理流程 )

文章目录 一、内存分配系统调用过程 ( 用户层 | 系统调用 | 内核层 ) 二、内存管理流程 一、内存分配系统调用过程 ( 用户层 | 系统调用 | 内核层 ) ---- " 堆内存 " 动态分配 的...调用 " 内核用户层接口 “ 中的 brk sbrk mmap munmap 等函数 , 这些函数就是 ” 系统调用 " 函数 ; 系统调用接口 是 用户层的 malloc 函数 与 内核层的 vmalloc...函数之间的 桥梁 ; ③ 内核层调用 : 内核用户层接口 的 内存管理函数 调用 " Linux 内核 " 中的 kmalloc vmalloc 函数 ; C 语言中使用 malloc free 等函数分配堆内存...函数用于分配内存 , munmap 函数用于回收内存 ; 可参考 【Linux 内核 内存管理】Linux 内核内存管理 ② ( 动态分配堆内存方式 | brk 系统调用 | mmap 系统调用 |...则该空间就是 ” 匿名空间 " , 可作为 " 堆内存 " 使用 ; ③ 内核层 ( 内核空间 ) 内存管理 : 在 Linux 内核中 , 通过 kmalloc vmalloc __get_free_pages

66910

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

DPDK巨页地址管理/Linux内核内存管理/内存映射/pagemap/rdma内存/注册术语PFN: 物理地址对应的页帧号:pfn = pte_pfn(*pte)INFINIBAND_USER_MEM...您可以使用内核命令行参数hugepages 或在运行时使用procfs 或sysfs 接口来保留大页。 请阅读有关大页的 Linux 内核文档,以获取有关如何保留大页的更多信息。...mmap(不同于用户空间函数),实现文件物理地址和进程虚拟地址的一一映射关系5、为映射分配了新的虚拟地址区域后,通过待映射的文件指针,在文件描述符表中找到对应的文件描述符,通过文件描述符,链接到内核“已打开文件集...pagemap 是内核中的一组新接口(自 2.6.25 起),允许用户空间程序通过读取“/proc”中的文件来检查页表和相关信息检查进程页表/内存页映射: https://www.kernel.org...内核抢占和低延迟/cond_resched: https://blog.csdn.net/su_linux/article/details/15500053pin内存: https://www.kernel.org

36810

聊聊Linux内核内存回收上篇

概述 内存回收是把已经使用过的的物理页帧重新放回到内核中的buddy系统(buddy系统用于申请空闲物理页帧的子系统)管理中,解决内存紧张的问题;内存回收的页帧包括未修改的文件页帧、修改且完成同步的文件页帧...内核对所有用户态进程消耗的RAW内存总量不做严格的约束,当系统负载相对较低的时候,内存大部分被磁盘高速缓存使用,随着系统负载增大,系统进程使用的内存越来越多,磁盘的高速缓存占用的内存就会被缩小,内存页帧的回收必须在消耗所有空闲页帧之前进行...如果内核尝试回收后仍然无法获得物理页帧,内核会执行find_bad_process找到一个进程并且执行OOM Kill释放这个进程占用的物理页帧。...内核中同时存在slab allocation,它用于内核数据结构的申请。slab分配器在频繁申请和释放的情况下效率比较高 基于LRU页帧链表 内存页帧是有映射的,映射到一个或者多个进程的虚拟空间。...内核一般用内存页帧的引用次数来表示页帧的活跃程度。一个内存区zone将空闲页帧和已经在使用的页帧分别用buddy系统和 zone的LRU链表管理。

1.7K30

Linux内核内存检测工具KASAN

KASAN 是 Kernel Address Sanitizer 的缩写,它是一个动态检测内存错误的工具,主要功能是检查内存越界访问和使用已释放的内存等问题。...KASAN 集成在 Linux 内核中,随 Linux 内核代码一起发布,并由内核社区维护和发展。本文简要介绍 KASAN 的原理及使用方法。 一、KASAN的原理和使用方法 1....由于1/8的内存用于shadow memory,可用内存会减少1/8,例如8GB的内存,打开KASAN后,MemTotal约为6.72GB。...KASAN原理概述 KASAN利用额外的内存标记可用内存的状态,这部分额外的内存被称作shadow memory(影子区),KASAN将1/8的内存用作shadow memory。...二、总结 KASAN通过建立影子内存来管理内存访问的合法性,可以有效检测内存越界等问题,但无法发现因逻辑问题导致的合法内存的内容改写问题。

7.5K21

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

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

2.3K00

Linux内核理解 Memory barrier(内存屏障)

本文例子均在 Linux(g++)下验证通过,CPU 为 X86-64 处理器架构。所有罗列的 Linux 内核代码也均在(或只在)X86-64 下有效。...腾讯T6-9首发“Linux内核源码嵌入式开发进阶笔记”,差距不止一点点哦Memory barrier 简介程序在运行时内存实际的访问顺序和程序代码编写的访问顺序不一定一致,这就是内存乱序访问。...【文章福利】小编推荐自己的Linux内核技术交流群:【865977150】整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!!!...避免编译时内存乱序访问的办法就是使用编译器 barrier(又叫优化 barrier)。Linux 内核提供函数 barrier() 用于让编译器保证其之前的内存访问先于其之后的完成。...在 Linux 内核中,提供了一个宏 ACCESS_ONCE 来避免编译器对于连续的 ACCESS_ONCE 实例进行指令重排。

1.9K00

Linux 内核 内存管理】Linux 内核内存布局 ④ ( ARM64 架构体系内存分布 | 内核启动源码 start_kernel | 内存初始化 mm_init | mem_init )

文章目录 一、ARM64 架构体系内存分布 二、Linux 内核启动源码 start_kernel 三、内存初始化源码 mm_init 四、内存初始化源码 mem_init 一、ARM64 架构体系内存分布...内核 将 " 地址空间 " 划分为 : 内核空间 和 用户空间 ; ① 内核空间 ( Kernel Space ) : 寻址范围 0x FFFF 0000 0000 0000 ~ 0x FFFF FFFF...上图中的 " 不规范地址空间 " 是不允许使用的 内存空间 ; 二、Linux 内核启动源码 start_kernel ---- 在 Linux 内核初始化完成后 , 会在 " 初始化内存 " 时..., 输出 内存布局 ; Linux 内核启动源码是定义在 linux-5.6.18\init\main.c 源码中的 asmlinkage __visible void __init start_kernel...mem_init 方法初始化内存 , 该方法定义在 arch\x86\mm\init_32.c#766 位置 ; 在内存初始化时 , 会打印如下格式的 " 内核空间 内存分布 " 日志 : printk

6.9K20

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

文章目录 一、mmap 创建内存映射代码示例 1、fopen 打开或创建文件 2、lseek 设置文件大小 3、mmap 函数使用 4、munmap 删除内存映射 二、完整代码示例 一、mmap 创建内存映射代码示例..., 该内存页的内容可以 读取 写入 MAP_SHARED : 指定映射关系 , 指的是该映射是进程的共享内存空间 fd : 文件描述符 , 被映射的文件 0 : 被映射文件的偏移量 , 从文件的哪个字节位置开始映射...// PROT_READ | PROT_WRITE : 内存保护的标志位 , 该内存页的内容可以 读取 写入 // MAP_SHARED : 指定映射关系 , 指的是该映射是进程的共享内存空间..., 该内存页的内容可以 读取 写入 // MAP_SHARED : 指定映射关系 , 指的是该映射是进程的共享内存空间 // fd : 文件描述符 , 被映射的文件 //..., 该内存是文件映射内存 // 拷贝内存的同时 , 也会修改文件内容 memcpy((*(p_student + i)).name, &name_char, 1);

1.4K10

Linux 内核 内存管理】Linux 内核内存布局 ② ( x86_64 架构体系内存分布 | 查看 procmeminfo 文件 | procmeminfo 重要字段解析 )

可以查看 " x86_64 架构体系内存分布 " ; 执行结果参考 : root@ubuntu:~/kernel/linux-5.6.14# cat /proc/meminfo MemTotal:...DirectMap4k: 159552 kB DirectMap2M: 2985984 kB DirectMap1G: 3145728 kB root@ubuntu:~/kernel/linux...: 2312852 kB 空余内存 , 这些内存还没有使用 MemAvailable: 3009516 kB 真正可用的内存 , 比 MemFree 大一些 , 这是因为一些内存虽然已经使用了 , 但是可以回收...不活跃文件使用的内存 Unevictable: 48 kB 不可释放的内存页 Mlocked: 48 kB 允许程序在 " 物理内存 " 上 锁住 " 地址空间 " SwapTotal: 0 kB 交换空间总内存大小..." 未映射页 " 的内存 映射到 " 用户空间 " 后的 页表大小 Mapped: 191348 kB " 映射文件 " 内存大小 Shmem: 18780 kB 已分配完毕的 " 共享内存 " KReclaimable

1.5K30

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

虚拟内存中连续、但物理内存中不连续的内存区,可以在vmalloc区域分配. 该机制通常用于用户过程, 内核自身会试图尽力避免非连续的物理地址。...说明 注意用户空间当然可以使用高端内存,而且是正常的使用,内核在分配那些不经常使用的内存时,都用高端内存空间(如果有),所谓不经常使用是相对来说的,比如内核的一些数据结构就属于经常使用的,而用户的一些数据就属于不经常使用的...用户在启动一个应用程序时,是需要内存的,而每个应用程序都有3G的线性地址,给这些地址映射页表时就可以直接使用高端内存。...总之,内核的高端线性地址是为了访问内核固定映射以外的内存资源。进程在使用内存时,触发缺页异常,具体将哪些物理页映射给用户进程是内核考虑的事情. 在用户空间中没有高端内存这个概念....即内核对于低端内存, 不需要特殊的映射机制, 使用直接映射即可以访问普通内存区域, 而对于高端内存区域, 内核可以采用三种不同的机制将页框映射到高端内存 : 分别叫做永久内核映射、临时内核映射以及非连续内存分配

3.3K10

Linux内核27-优化和内存屏障

比如说,对于Linux内核的barrier()宏,展开后就是asm volatile("":::"memory"),就是一个优化屏障。...ARM系统中,使用ldrex和strex汇编指令实现内存屏障。 3. Linux内核使用的内存屏障原语 Linux内核中使用的内存屏障原语如下,如表5-6所示。...读内存屏障只对内存的读操作指令有效;写内存屏障只对内存的写操作指令有效。smp_xxx()之类的内存屏障只对发生在多核系统里的竞态条件有效,单核系统中,什么也没有做。...表5-6 Linux内存屏障 macro 描述 mb() MP和UP的内存屏障 rmb() MP和UP的读内存屏障 wmb() MP和UP的写内存屏障 smp_mb() MP内存屏障 smp_rmb()...MP读内存屏障 smp_wmb() MP写内存屏障 内存屏障的实现跟系统架构息息相关。

1.3K10
领券