使用 malloc 函数申请内存原理 : " 堆内存 " 动态分配 的 系统调用 过程 ;
IPC全名为inter-Process Communication,含义为进程间通信,是指两个进程之间进行数据交换的过程。在Android和Linux中都有各自的IPC机制,这里分别来介绍下。
在 Linux 系统中的每个进程都有独立 4GB 内存空间,而 Linux 把这 4GB 内存空间划分为用户内存空间(0 ~ 3GB)和内核内存空间(3GB ~ 4GB),而内核内存空间由划分为直接内存映射区和动态内存映射区(vmalloc区)。
本文旨在深入探讨Linux操作系统的虚拟内存管理机制。我们将从基本概念开始,逐步深入到内核级别的实现细节。为了达到这个目标,本文将结合理论讨论和实际的代码分析。我们希望通过这种方式,使读者对Linux虚拟内存管理有更深入的理解。
几种进程间的通信方式:管道,FIFO,消息队列,他们的共同特点就是通过内核来进行通信(假设POSIX消息队列也是在内核中实现的,因为POSIX标准并没有限定它的实现方式)。向管道,FIFO,消息队列写入数据需要把数据从进程复制到内核,从这些IPC读取数据的时候又需要把数据从内核复制到进程。所以这种IPC方式往往需要2次在进程和内核之间进行数据的复制,即进程间的通信必须借助内核来传递。如下图所示:
作为一个计算机底层小白,在了解一个知识点的时候时常需要恶补很多基础知识。 本文记录在了解LMDB过程中接触的知识点。
分配 虚拟内存页 : 应用进程 调用 mmap 函数后 , 在 Linux 系统中 创建 " 内存映射 “ 时 , 会在 ” 用户虚拟地址空间 “ 中 , 分配一块 ” 虚拟内存区域 " ;
首先 , 创建 " 匿名内存映射 “ , 将 ” 物理内存页 “ 映射到 进程的 ” 用户虚拟地址空间 " 中 ;
https://www.cnblogs.com/poloyy/category/1806772.html
ByteBuffer 是 java.nio 包下提供的一个类,提供了堆内内存分配与堆外内存分配机制,堆内内存分配方式:ByteBuffer.allocate(size)分配大小为size的字节数组;堆外内存分配方式:ByteBuffer.allocateDirect(size), 在堆外内存空间分配大小为size的空间地址。ByteBuffer.allocateDirect 返回的是一个DirectByteBuffer对象。
对于精通 CURD 的业务同学,内存管理好像离我们很远,但这个知识点虽然冷门(估计很多人学完根本就没机会用上)但绝对是基础中的基础。
个参数 , 分别是 unsigned long addr 和 size_t, len , 前者是 内存映射 的 起始地址 , 后者是 内存映射 的 长度 ;
脏牛(Dirty COW,编号:CVE-2016-5195)是2016年10月18日被曝出的存在于Linux内核中的一款0day漏洞。因为此漏洞是在Linux内核的内存子系统在处理写时拷贝(Copy-on-Write)时发生的,而又给Linux内核的使用带来烦恼,所以将其命名为“Dirty COW”。
内存映射mmap是Linux内核的一个重要机制,它和虚拟内存管理以及文件IO都有直接的关系,这篇细说一下mmap的一些要点。
内存映射 概念 : " 内存映射 “ 就是在 进程的 ” 用户虚拟地址空间 " 中 , 创建一个 映射 , " 内存映射 " 有
这本书属于学习Linux内核原理必读推荐书目之一!对Linux内核的设计原理进行了细致的说明,也有具体实现部分的介绍,结合源码能很好的理解Linux内核;
mmap是linux中提高文件读写效率的一种手段,这里简单整理一下mmap的原理和使用。
零拷贝技术指在计算机执行操作时,CPU不需要先将数据从一个内存区域复制到另一个内存区域,从而可以减少上下文切换以及CPU的拷贝时间。它的作用是在数据报从网络设备到用户程序空间传递的过程中,减少数据拷贝次数,减少系统调用,实现CPU的零参与,彻底消除CPU的负载。
主要是驱动设备的初始化(binder_init),打开 (binder_open),映射(binder_mmap),数据操作(binder_ioctl)。
调用 mmap 系统调用 , 先检查 " 偏移 " 是否是 " 内存页大小 " 的 " 整数倍 " , 如果偏移是内存页大小的整数倍 , 则调用 sys_mmap_pgoff 函数 , 继续向下执行 ;
为了快速构建项目,使用高性能框架是我的职责,但若不去深究底层的细节会让我失去对技术的热爱。 探究的过程是痛苦并激动的,痛苦在于完全理解甚至要十天半月甚至没有机会去应用,激动在于技术的相同性,新的框架不再是我焦虑。 每一个底层细节的攻克,就越发觉得自己对计算机一无所知,这可能就是对知识的敬畏。
" 文件映射 " 的 " 虚拟内存区域 " vm_area_struct 结构体 的 数据结构表示形式如下 ;
相信不少的网友,在很多的博客文章里面,已经见到过零拷贝这个词,会不禁的发出一些疑问,什么是零拷贝?
mmap是linux操作系统提供给用户空间调用的内存映射函数,很多人仅仅只是知道可以通过mmap完成进程间的内存共享和减少用户态到内核态的数据拷贝次数,但是并没有深入理解mmap在操作系统内部是如何实现的,原理是什么。
进程调度器是Linux内核中最重要的子系统。其目的是控制对计算机CPU的访问。这不仅包括用户进程的访问,还包括其他内核子系统的访问。
随着计算机技术的飞速发展,Linux操作系统作为开源领域的佼佼者,已经深入到了各个应用场景之中。在Linux系统中,内核与用户空间之间的交互是核心功能之一,而设备驱动则是实现这一交互的关键环节。然而,传统的设备驱动开发往往受限于内核空间的限制,无法充分发挥用户空间程序的灵活性和性能优势。为了解决这个问题,Linux内核引入了UIO(Userspace I/O)驱动模型。
在介绍 HugePages 之前,我们先来回顾一下 Linux 下 虚拟内存 与 物理内存 之间的关系。
上一节内容的学习我们知道了CPU是如何访问内存的,CPU拿到内存后就可以向其它人(kernel的其它模块、内核线程、用户空间进程、等等)提供服务,主要包括: 以虚拟地址(VA)的形式,为应用程序提供远大于物理内存的虚拟地址空间(Virtual Address Space) 每个进程都有独立的虚拟地址空间,不会相互影响,进而可提供非常好的内存保护(memory protection) 提供内存映射(Memory Mapping)机制,以便把物理内存、I/O空间、Kernel Image、文件等对象映射到相应进
上一节内容的学习我们知道了CPU是如何访问内存的,CPU拿到内存后就可以向其它人(kernel的其它模块、内核线程、用户空间进程、等等)提供服务,主要包括:
Linux 内核修复办法:内核页表隔离KPTl(kernel page table isolation)
在博客 【Linux 内核 内存管理】虚拟地址空间布局架构 ⑦ ( vm_area_struct 结构体成员分析 | vm_start | vm_end | vm_next | vm_prev |vm_rb) 中 , 分析了 vm_start vm_end vm_next vm_prev vm_rb 这
在笔者上一篇博客,详解了NIO,并总结NIO相比BIO的效率要高的三个原因,点击查看。
版权声明:本文为博主原创文章,未经博主允许不得转载,更多请继续关注Carson_Ho https://blog.csdn.net/carson_ho/article/details/87685001
前面已经分析过了Intel的内存映射和linux的基本使用情况,已知head_32.S仅是建立临时页表,内核还是要建立内核页表,做到全面映射的。下面就基于RAM大于896MB,而小于4GB ,切CONFIG_HIGHMEM配置了高端内存的环境情况进行分析。
之前一直对 Binder 理解不够透彻,仅仅知道一些皮毛,所以最近抽空深入理解一下,并在这里做个小结。
我们看到,通过 DMA 芯片进行的硬盘读写过程需要进行四次特权级切换和四次拷贝操作。
之前有不少读者给笔者留言,希望笔者写一篇文章介绍下 mmap 内存映射相关的知识体系,之所以迟迟没有动笔,是因为 mmap 这个系统调用看上去简单,实际上并不简单,可以说是非常复杂的一个系统调用。
在接入日志组件xlog的工作中,对mmap内存映射加深了了解,分享一下学习心得。 1.一个Linux进程的虚拟内存 如图展示了一个Linux进程的虚拟内存。 虚拟的意思是进程以为自己有这么一
之前写了两篇详细分析 Linux 内存管理的文章,读者好评如潮。但由于是分开两篇来写,而这两篇内容其实是有很强关联的,有读者反馈没有看到另一篇读起来不够不连贯,为方便阅读这次特意把两篇整合在一起,看这一篇就够了!
前言: KVM的设备虚拟化,除了前文《PIO技术分析》,还有另外一个核心概念---MMIO。原计划这里分析一下KVM的MMIO虚拟化。考虑到MMIO比PIO复杂很多,涉及更多的概念,作者打算先分析几篇基本的Linux的内存管理概念,再来分析MMIO。 作者大概想了一下,主要由这几篇构成: 1,虚拟内存管理和内存映射。 2,物理内存管理。 3,内存回收。 分析: 1,虚拟内存概念 x86的CPU有两种运行模式---real mode和protected mode。在real mode下,CPU访问的是物理
上一篇推文《百万并发「零拷贝」技术系列之初探门径》中的示例告诉我们:传统的I/O操作读取文件并通过Socket发送,需要经过4次上下文切换、2次CPU数据拷贝和2次DMA控制器数据拷贝,如下图
本文是“Linux内核分析”系列文章的第一篇,会以内核的核心功能为出发点,描述Linux内核的整体架构,以及架构之下主要的软件子系统。之后,会介绍Linux内核源文件的目录结构,并和各个软件子系统对应。
原文链接:https://juejin.cn/post/7293175592162836514
过去,CPU的地址总线只有32位, 32的地址总线无论是从逻辑上还是从物理上都只能描述4G的地址空间(232=4Gbit),在物理上理论上最多拥有4G内存(除了IO地址空间,实际内存容量小于4G),逻辑空间也只能描述4G的线性地址空间。
Linux 内存管理模型非常直接明了,因为 Linux 的这种机制使其具有可移植性并且能够在内存管理单元相差不大的机器下实现 Linux,下面我们就来认识一下 Linux 内存管理是如何实现的。
在上一篇博客 【Linux 内核 内存管理】内存管理系统调用 ④ ( 代码示例 | mmap 创建内存映射 | munmap 删除内存映射 ) 中 , 完成了 进程一 的程序 ,
领取专属 10元无门槛券
手把手带您无忧上云