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

Linux内核编程--内存映射共享内存

一,内存映射 对于磁盘文件进程: 将一个文件或其它对象映射到进程地址空间,实现文件在磁盘存储地址进程地址空间中一段虚拟地址映射关系。...文件内存映射示意图: 对于用户进程内核进程: 将用户进程一段内存区域映射到内核进程,映射成功后,用户进程对这段内存区域修改直接反映到内核空间,同样,内核进程对这段内存区域修改也直接反映到用户空间...没有内存映射I/O操作示意图: 磁盘->内核空间->用户空间 有内存映射I/O操作示意图:少了一个copy操作 内存映射优点: 减少了拷贝次数,节省I/O操作开支 用户空间内核空间可以直接高效交互...对于Client-Server架构,如果服务器进程客户端进程共享同一块存储区,服务器进程正在将数据写入共享存储区时,在写入操作完成之前,客户端进程不应去取出这些数据。...一般用信号量来同步共享内存访问。 共享内存区在系统存储中位置: 为什么要用共享内存: 对于涉及到内核操作内核进程之间,经历了四次复制操作,开销很大。

5.8K10

【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内核27-优化内存屏障

比如说,对于Linux内核barrier()宏,展开后就是asm volatile("":::"memory"),就是一个优化屏障。...sti指令,可以改变eflags寄存器IF标志); lfence、sfencemfence汇编指令,分别用来实现读内存屏障、写内存屏障读/写内存屏障; 特殊汇编指令,比如iret指令,可以终止中断或异常处理程序...ARM系统中,使用ldrexstrex汇编指令实现内存屏障。 3. Linux内核使用内存屏障原语 Linux内核中使用内存屏障原语如下,如表5-6所示。...smp_xxx()之类内存屏障只对发生在多核系统里竞态条件有效,单核系统中,什么也没有做。其它内存屏障对多核系统单核系统都有效。...表5-6 Linux内存屏障 macro 描述 mb() MPUP内存屏障 rmb() MPUP内存屏障 wmb() MPUP内存屏障 smp_mb() MP内存屏障 smp_rmb()

1.3K10

Windows内核内存管理

内存管理要点 内核内存是在虚拟地址空间高2GB位置,且由所有进程所共享,进程进行切换时改变只是进程用户分区内存 驱动程序就像一个特殊DLL,这个DLL被加载到内核地址空间中,DriverEntry...,只在debug版本中生效,用于判断当前中断请求级别,当级别高于DISPATCH_LEVEL(包含这个级别)时会产生一个断言 内核堆申请函数 PVOID ExAllocatePool(...,如果为PagedPool表示分配是分页内存,如果是NonPagedPool表示分配是非分页内存 NumberOfBytes:分配内存大小,为了效率最好分配4倍数 上面这些函数主要分为带有标记不带标记两种..., IN SIZE_T Length ); 需要注意是这个函数没有考虑到内存重叠情况,假如内存发生重叠例如这样: 这个时候AC内存BD内存块有部分重叠,如果将AC拷贝到...在内核中,对于内存读写要相当谨慎,稍不注意就可能产生一个新漏洞或者造成系统蓝屏崩溃,有时在读写内存前需要判断该内存是否合法可供读写,DDK提供了两个函数来判断内存是否可读可写 VOID ProbeForRead

1.3K20

Linux内核高端内存

显然不能将内核地址空间0xc0000000 ~ 0xfffffff全部用来简单地址映射。因此x86架构中将内核地址空间划分三部分:ZONE_DMA、ZONE_NORMALZONE_HIGHMEM。...0x800FFFFF Linux内核高端内存划分 内核将高端内存划分为3部分:VMALLOC_START~VMALLOC_END、KMAP_BASE~FIXADDR_STARTFIXADDR_START...这个空间起叫”内核永久映射空间”或者”永久内核映射空间”。这个空间其它空间使用同样页目录表,对于内核来说,就是 swapper_pg_dir,对普通进程来说,通过 CR3 寄存器指向。...64位系统用户进程最大可以访问超过512GB,内核代码可以访问所有物理内存。 4、高端内存物理地址、逻辑地址、线性地址关系? 高端内存物理地址有关系,线性地址、逻辑地址没有直接关系。...5、为什么不把所有的地址空间都分配给内核? 若把所有地址空间都给内存,那么用户进程怎么使用内存?怎么保证内核使用内存用户进程不起冲突?

4.3K31

Linux内核内存管理算法BuddySlab

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

3.4K73

Linux内核内存管理算法BuddySlab

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

2K30

聊聊Linux内核内存回收上篇

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

1.7K30

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

全文分为两部分讲解:fork内存管理部分进程管理部分,内存管理主要讲解子进程如何构建自己内存管理相关基础设施,父子进程如何共享地址空间,写时复制如何发生,页表层面为我们做了哪些事情等等。...实际上,除了0号进程,其他所有进程无论是内核线程还是普通用户进程线程都是fork出来,而创建进程是内核所做事情,要么在内核空间直接创建出所谓内核线程,要么是通过fork,clone这样系统调用陷入内核空间来创建...copy_page_range(这是fork主要内存开销)。...总结来说:fork中构建了内存管理相关基础设施如mm_struct ,vma,pgd页等,以及拷贝父进程vma拷贝父进程页表来达到父进程共享地址空间目的,可以看处理这种共享并不是像共享内存那种纯粹意义上共享...2.3 内存基础设施使用之--各级页表创建 我们知道,对于用户进程来说,内核并不是马上满足进程对于物理页请求,而仅仅是为他分配虚拟页,内核采用一种惰性内存分配方式,知道访问最后一刻才为进程分配物理页

1.7K21

Kasan - Linux 内核内存检测工具

,它是一个动态检测内存错误工具,主要功能是检查内存越界访问使用已释放内存等问题。...Kasan 集成在 Linux 内核中,随 Linux 内核代码一起发布,并由内核社区维护发展。...所以 Kasan 也可以看成是用于内核空间 Address Sanitizer。 原理 Kasan 原理是利用“额外”内存来标记那些可以被使用内存状态。...Kasan 内存布局原理 ? 使用 Kasan 是内核一部分,使用时需要重新配置、编译并安装内核。...此外,内核还包含了一些配置选项可以打开其它内存检测功能,如 SLAB_DEBUG DEBUG_SLAB 选项可以激活 redzones poisoning 功能,用来检测申请和释放内存错误。

5.3K11

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

上一篇文章我们讲到fork时候内存管理相关内容,时间大概隔了快一周了,发布下篇文章,写文章确实费时费力,需要仔细推敲,原创不易,希望大家多多支持吧。...首先需要说明一点是,进程task_struct是资源封装管理结构,如管理进程虚拟内存mm_struct,进程打开文件files_struct等,而进程参与调度使用是调度实体去管理调度(对于普通进程是...ok,下面就可以在fork中做一些手脚:首先先将p->thread.cpu_context清零,然后对于用户进程内核线程有不同处理: if (likely(!...)中执行,然后对于内核线程直接调用之前设置内核执行函数,对于用户任务通过 ret_to_user 返回用户空间。...总结 写到这里,Linux内核进程创建也就讲完了,当然fork实现涉及到很多内容,这里只是从内存管理进程调度两个维度来看进程创建过程,阅读完这两篇文章希望能帮助大家理解fork时候背后隐藏一些技术细节

1.5K21

Linux 内核 VS 内存碎片 (下)

为方便大家定量分析直接内存回收内存规整为每个参与线程带来延迟,我在 BCC 项目中提交了两个工具:drsnoop compactsnoop,这两个工具文档写得很详细了,但在分析时需要注意一点...,为了降低 BPF 引入开销,这里抓取每一次对应事件延迟,因此申请内存事件相比,可能存在多对一关系,对于 3.10 这样内核,在一次慢速内存分配过程中会重试多少次是不确定, 导致 oom...我们按这个最大次数 16 来看,假设平均一次直接内存回收延迟是 10ms (对于现在百G内存服务器来说,shrink active/inactive lru 链表是很耗时,如果需要等待回写脏页还会有额外延迟...本文同时也介绍了基于 /proc 文件系统监控接口基于内核事件工具,二者相辅相成,基于 /proc 监控接口用起来简单,但存在无法定量分析采样周期过大等问题,基于内核事件工具可以解决这些问题...虽然调大 vm.min_free_kbytes 确实会导致一些内存浪费,不过对于 256G 内存服务器来说,我们设置成 4G,也只占了 1.5%。

3.5K30

3.10内核 vs 5.4内核——内存不足场景pk

由于早期服务器,大量存量3.10内核作为cvm操作系统内核。3.10内核存在着很多已知问题,其中常客之一便是内存不足场景下,内存回收引发问题。...内存回收OOM一直是Linux中一个饱受诟病问题,其路径内核一直在优化,所以从理论上新版本内核一定是优于老版本。...本文通过构造用例测试,来针对3.105.4内核内存不足场景下表现进行分析对比,以说明5.4会在内存不足场景下有更好表现。...【测试数据】使用两台IT5 64C 256G 100Mcvm,一台3.10 内部内核,一台TencentOS 5.4.119-19-0009,内存相关内核参数相同。...图片后话5.4相较3.10内核内存不足场景下,更加稳定且性能更好已经可以从本文中case分析得到一定程度上证明,但本文中场景也仅是抛砖引玉,3.10并非就这一个内存不足场景有问题,总体相较5.4

2.2K20

详解Linux内核内存管理架构

内存映射空间划分 根据不同内存使用方式使用场景需要,内核内存映射地址空间划分成多个部分,每个划分空间都有自己起止地址、分配接口使用场景。下图是一个常见32位地址空间划分结构。 ?...直接内存动态分配地址空间:因为访问效率等原因,内核内存采用简单线性映射,但是因为32位CPU寻址能力(4G大小)内核地址空间起始设置(3G开始),会导致内核地址空间资源不足,当内存大于1GB...无法直接映射地址空间部分,即highmem zone。在DMA zonehighmem zone中间区域即normal zone,主要用于内核动态内存分配。...高端内存动态分配地址空间:高端内存分配内存是虚拟地址连续而物理地址不连续内存,一般用于内核动态加载模块驱动,因为内核可能运行了很久,内存页面碎片情况严重,如果要申请大连续地址内存页会比较困难...内存管理软件架构 内核内存管理核心工作就是内存分配回收管理,其内部分为2个体系:页管理对象管理。

3K42

Linux 内核 VS 内存碎片 (上)

(外部)内存碎片是一个历史悠久 Linux 内核编程问题,随着系统运行,页面被分配给各种任务,随着时间推移内存会逐步碎片化,最终正常运行时间较长繁忙系统可能只有很少物理页面是连续。...由于 Linux 内核支持虚拟内存管理,物理内存碎片通常不是问题,因为在页表帮助下,物理上分散内存在虚拟地址空间仍然是连续 (除非使用大页),但对于需要从内核线性映射区分配连续物理内存需求来说就会变非常困难...本文将重点描述当前常用 3.10 版本内核在伙伴分配器预防内存碎片扩展,内存规整原理,如何查看碎片指数,以及如何量化内存规整带来延迟开销等。...,将找到页帧号页内偏移组合起来就是物理地址。...所以当通过页表访问物理页面通过线性映射页面混合在一起管理时,就很容易出现内存碎片,因此内核根据页面的可移动性定义了几种迁移类型,并根据迁移类型对页面进行分组实现反碎片化。

3.4K40

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

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

9.5K40

LiteOS内核教程06 | 内存管理

LiteOS内核内存管理 1.1....Huawei LiteOS 内存管理模块通过对内存申请/释放操作,来管理用户OS对内存使用,使内存利用率使用效率达到最优,同时最大限度地解决系统内存碎片问题。 1.2....动态内存管理 动态内存管理,即在内存资源充足情况下,从系统配置一块比较大连续内存内存池),根据用户需求,分配任意大小内存块。...LiteOS动态内存支持 DLINK BEST LITTLE 两种标准算法。 1.2.1. DLINK 动态内存管理算法 DLINK动态内存管理结构如下图所示: ?...实验代码 首先打开上一篇使用 HelloWorld 工程,基于此工程进行实验。 在Demo文件夹右击,新建文件夹osal_kernel_demo用于存放内核实验文件(如果已有请忽略这一步)。

1.1K20

ARM32 内核内存布局

Linux内核在启动时会打印出内核内存空间布局图,下面是ARM Vexpress平台打印出来内存空间布局图: ? 这部分信息打印是在mem_init()函数中实现。...内核image本身占据内存空间从_text段到 _end段,并且分为如下几个段: 代码段:_text _etext为代码段起始结束地址,包含了编译后内核代码。...数据段:_sdata_edata为数据段起始结束地址,包含了大部分内核变量; BSS段:__bss_start__bss_stop为BSS段开始结束地址,包含初始化为0所有静态全局变量。...内核许多驱动使用vmalloc来分配连续虚拟地址内存,因为有的驱动不需要连续物理地址内存;除此之外,vmalloc还可以用于高端内存临时映射。...一个32bit系统中实际支持内存数量会超过内核线性映射长度,但是内核具有对所有内存寻找能力。

1.5K20

内核内核

内核 所有的内核代码都编译成一个二进制文件,所有的内核代码都运行在一个大内核地址空间里,内核代码可以直接调用访问,效率高且性能好。...微内核 把操作系统分成多个独立功能模块,每个功能模块之间访问需要通过消息来完成,因此效率没那么高。 宏内核内核架构图如下: ?...宏内核内核架构图 现代操作系统中 windows 采用就是微内核方式,内核保留操作系统最基本功能,进程调度,内存管理,通信等模块,其他功能放到用户态来实现。...Linux内核中很多核心实现或者设备驱动实现都可以编译成一个个单独模块。模块是被编译成一个目标文件,并且可以在运行时内核上动态加载卸载。...内核实现模块化不一样,它和静态编译内核函数一样,运行在内核中。

1.9K20

Linux下查看内核、CPU、内存及各组件版本命令方法

date   七:查看硬盘分区   df -h   fdisk -l   也可以查看分区   du -sh   可以看到全部占用空间   du /etc -sh   可以看到这个目录大小...  rpm -qa   rpm -qa | wc -l   yum list installed | wc -l   不过很奇怪,我通过rpm,yum这两种方式查询安装软件包,数量并不一样。...network   查看dns   cat /etc/nf   十二:查看默认语言   echo LANG LANGUAGE   cat /etc/sysconfig/i18n   十三:查看所属时区是否使用...内核版本:popen("uname -sr", "r"); 2.内存容量:/proc/meminfo ‘MemTotal:’字段 3.操作系统版本:/etc/issue 或者 /etc/*ease...4.当前用户名:a.getuid()获取当前用户uid;b.getpwuid(uid)或者用户名 5.cpu名称:/proc/cpuinfo ’model name‘字段 6.cpu内核数:/proc

3.3K20
领券