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

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

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

9.6K40

linux用户空间和内核空间

linux驱动程序一般工作在内核空间,但也可以工作在用户空间。下面我们将详细解析,什么是内核空间,什么是用户空间,以及如何判断他们。...Linux简化了分段机制,使得虚拟地址与线性地址总是一致,因此,Linux的虚拟地址空间也为0~4G。Linux内核将这4G字节的空间分为两部分。...于是,从具体进程的角度来看,每个进程可以拥有4G字节的虚拟空间Linux使用两级保护机制:0级供内核使用,3级供用户程序使用。...虽然内核空间占据了每个虚拟空间中的最高1GB字节,但映射到物理内存却总是从最低地址(0x00000000)开始。...对内核空间来说,其地址映射是很简单的线性映射,0xC0000000就是物理地址与线性地址之间的位移量,在Linux代码中就叫做PAGE_OFFSET。 内核空间用户空间之间如何进行通讯?

4K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Linux 内核空间用户空间实现与分析

    操作系统的核心是内核(kernel),它独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证内核的安全,现在的操作系统一般都强制用户进程不能直接操作内核。...为什么需要区分内核空间用户空间 在 CPU 的所有指令中,有些指令是非常危险的,如果错用,将导致系统崩溃,比如清内存、设置时钟等。...对于 Linux 来说,通过区分内核空间用户空间的设计,隔离了操作系统代码(操作系统的代码要比应用程序的代码健壮很多)与应用程序代码。...如何从用户空间进入内核空间 其实所有的系统资源管理都是在内核空间中完成的。比如读写磁盘文件,分配回收内存,从网络接口读写数据等等。我们的应用程序是无法直接进行这样的操作的。...运行在用户空间时进程使用的是用户空间中的堆栈,而运行在内核空间时,进程使用的是内核空间中的堆栈。所以说,Linux 中每个进程有两个栈,分别用于用户态和内核态。

    3.1K30

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

    文章目录 一、用户空间内存管理 ( malloc / free / ptmalloc / jemalloc / tcmalloc ) 二、内核空间内存管理 1、内核内存管理系统调用 ( sys_brk...| sys_mmap | sys_munmap ) 2、sys_brk、sys_mmap 系统调用 一、用户空间内存管理 ( malloc / free / ptmalloc / jemalloc /...; 上述函数 都是 " 用户空间 " 操作内存的函数 ; malloc / free 函数 是 glibc 函数库 ( GNU 发布的 libc 库 ) 的 " 内存分配器 " , 由 ptmalloc..., 然后将申请的内存 分成 ” 内存块 “ 分配给 用户空间 的 ” 应用程序 " 二、内核空间内存管理 ---- 1、内核内存管理系统调用 ( sys_brk | sys_mmap | sys_munmap..., 虚拟内存管理 从 ” 进程虚拟地址空间 “ 分配 / 释放 ” 虚拟内存页 " ; 2、sys_brk、sys_mmap 系统调用 可参考 【Linux 内核 内存管理】Linux 内核堆内存管理

    98010

    Linux为什么区分内核空间用户空间 ???

    一个操作系统它也是一堆程序组成的,可以想象CPU的指令是很多的,但是这么多的指令中,有些指令涉及到系统底层的东西,如果有些指令错用或者使用不当是非常危险的,比如清内存、设置时钟、修改用户访问权限、分配系统资源等等...为了保护内核的安全,操作系统一般都限制用户进程不能直接操作内核,在32位操作系统总的地址空间4G(2^32 = 4GB),实现这个限制的方式就是操作系统将总的地址空间分为两个部分,对于Linux操作系统...另外3G空间(0x0000 0000 - 0xBFFF FFFF)分配给用户使用,称为用户空间用户程序运行在用户空间,对应的进程处于用户态(目态)。...引用之前写的一篇文章(你该知道你写的程序的内存布局)的图 总之,有1G的内核空间是每个进程共享的,剩下的3G是进程自己使用的。...Linux操作系统通过区分内核空间用户空间的这种设计,将操作系统代码和用户程序代码分开,这样即使在某一个应用程序出错,也不会影响到操作系统,再说,Linux操作系统是多任务系统,其它应用程序不也还能运行

    1.7K10

    根据crash学习用户空间程序内存布局

    在64位机器上,目前还不完全支持64位地址宽度,常见的地址长度有39(512GB)和48位(256TB),目前我使用的模拟器采用的是39位的地址宽度,这样的话用户空间和内核空间各占512GB的地址空间。...我们将ARM64的用户空间放大,就可以清晰的看见各个段在整个用户空间的位置。...Heap段就是对应的malloc申请的区域,从实验结果上来看heap段正好位于用户空间中间部分,而且是从下往上增长的。 Mmap区域,就是我们使用mmap映射那段区域。...VMA(Virtual Memory Area) 上述说的各个段最终还需要映射到具体的物理内存的,而在内核中使用VMA来描述各个段的。...这里我们只需要掌握用户空间的各个段的布局,心中知道代码段,数据段,stack,heap段各个的位置。以及各个段在内核中通过vma去描述,而各个vma是通过链表或者红黑树链接一起的。

    49520

    Linux用户空间与内核空间通信(Netlink通信机制)

    一,什么是Netlink通信机制 Netlink是linux提供的用于内核和用户态进程之间的通信方式。但是注意虽然Netlink主要用于用户空间和内核空间的通信,但是也能用于用户空间的两个进程通信。...一般来说用户空间和内核空间的通信方式有三种:/proc、ioctl、Netlink。而前两种都是单向的,但是Netlink可以实现双工通信。...) ② 用户空间可使用标准的BSD socket接口(但netlink并没有屏蔽掉协议包的构造与解析过程,推荐使用libnl等第三方库) ③ 在内核空间使用专用的内核API接口 ④ 支持多播(因此支持“...前面我们也说过,Netlink不仅可以实现用户-内核空间的通信还可使现实用户空间两个进程之间,或内核空间两个进程之间的通信。该属性为0时一般指内核。...六:内核态程序 范例一 #include #include #include #include <linux

    4.7K10

    alloc_page分配内存空间--Linux内存管理(十七)

    Linux内核使用二进制伙伴算法来管理和分配物理内存页面, 该算法由Knowlton设计, 后来Knuth又进行了更深刻的描述..../linux/gfp.h?...这种惯例与设计得很好的用户层应用程序没什么不同, 但在内核中忽略检查会导致严重得多的故障 内核除了伙伴系统函数之外, 还提供了其他内存管理函数. 它们以伙伴系统为基础, 但并不属于伙伴分配器自身....这些函数包括vmalloc和vmalloc_32, 使用页表将不连续的内存映射到内核地址空间中, 使之看上去是连续的. 还有一组kmalloc类型的函数, 用于分配小于一整页的内存区....在预期内存域没有空闲空间的情况下, 该列表确定了扫描系统其他内存域(和结点)的顺序.

    3.1K11

    Linux 内核 内存管理】虚拟地址空间布局架构 ① ( 虚拟地址空间布局架构 | 用户虚拟地址空间划分 )

    文章目录 一、虚拟地址空间布局架构 二、用户虚拟地址空间划分 一、虚拟地址空间布局架构 ---- 在 64 位的 Linux 操作系统中 , " ARM64 架构 " 并 不支持 64 位的虚拟地址..., 最大只支持 48 位的虚拟地址 , 64 位地址太大 , 并不需要那么大的内存空间 ; " ARM64 架构 " 中 , Linux 系统的 " 内核虚拟地址 “ 与 ” 用户虚拟地址 "...是等同的 ; 用户虚拟地址 : 0x 0000 0000 0000 0000 ~ 0x 0000 FFFF FFFF FFFF , 48 位有效地址 ; 内核虚拟地址 : 0x FFFF 0000...0000 0000 ~ 0x FFFF FFFF FFFF FFFF , 48 位有效地址 ; 二、用户虚拟地址空间划分 ---- Linux 操作系统 进程 的 " 用户虚拟空间 " 起始地址...为 0 ; " 用户虚拟空间 " 的大小为 TASK_SIZE , 该值与 处理器 架构 有关 , 不同的处理器 , 定义的 TASK_SIZE 宏不同 ; 32 位处理器 定义的 TASK_SIZE

    7.2K20

    Linux用户态进程的内存管理

    上一篇我们了解了内存在内核态是如何管理的,本篇文章我们一起来看下内存用户态的使用情况,如果上一篇文章说是内核驱动工程师经常面对的内存管理问题,那本篇就是应用工程师常面对的问题。...下面闲话少说,开始本篇的内容——进程的内存消耗和泄漏 进程的虚拟地址空间VMA(Virtual Memory Area) 在linux操作系统中,每个进程都通过一个task_struct的结构体描叙,每个进程的地址空间都通过一个...,在缺页中断的处理程序中读出虚拟地址和原因,去VMA中查,发现是用户程序在写malloc的合法区域且有写权限,Linux内核就真正的申请内存,页表中对应一页的权限也修改为R+W。...) malloc大于128k的内存,使用mmap分配内存,在堆和栈之间找一块空闲内存分配(对应独立内存,而且初始化为0) 内存的消耗VSS RSS PSS USS 首先,我们评估一个进程的内存消耗都是指用户空间内存...,不包括内核空间内存消耗 。

    2.9K30

    Linux用户态进程的内存管理

    上一篇我们了解了内存在内核态是如何管理的,本篇文章我们一起来看下内存用户态的使用情况,如果上一篇文章说是内核驱动工程师经常面对的内存管理问题,那本篇就是应用工程师常面对的问题。...下面闲话少说,开始本篇的内容——进程的内存消耗和泄漏 进程的虚拟地址空间VMA(Virtual Memory Area) 在linux操作系统中,每个进程都通过一个task_struct的结构体描叙,每个进程的地址空间都通过一个...,在缺页中断的处理程序中读出虚拟地址和原因,去VMA中查,发现是用户程序在写malloc的合法区域且有写权限,Linux内核就真正的申请内存,页表中对应一页的权限也修改为R+W。...) malloc大于128k的内存,使用mmap分配内存,在堆和栈之间找一块空闲内存分配(对应独立内存,而且初始化为0) 内存的消耗VSS RSS PSS USS 首先,我们评估一个进程的内存消耗都是指用户空间内存...,不包括内核空间内存消耗 。

    2.8K41

    JVM和Linux内存的关系--进程与JVM内存空间

    下面从用户内存和内核内存两个方面讲解JVM进程的内存特点。 1.用户内存 上图特别强调了JVM进程模型的代码区和数据区指的是JVM自身的,而非Java程序的。普通进程栈区,在JVM一般仅仅用做线程栈。...2.内核内存 应用程序通常不直接和内核内存打交道,内核内存由操作系统进行管理和使用;不过随着Linux对性能的关注及改进,一些新的特性使得应用程序可以使 用内核内存,或者是映射到内核空间。...Linux和Java NIO在内核内存上开辟空间给程序使用,主要是减少不要的复制,以减少IO操作系统调用的开销。...例如,将磁盘文件的数据发送网卡,使用普通方法和NIO时,数据流动比较下图所示: 将数据在内核内存用户内存之间拷贝是比较消耗资源和时间的事情,而从上图我们可以看到,通过NIO的方式减少了2次内核内存用户内存之间的数据拷贝...前三项加起来已经560m,因此可以断定Linux物理内存不够使用。

    3K21

    完全剖析 - Linux虚拟内存空间管理

    所以,Linux 根据功能上的差异,来对虚拟内存空间进行管理。 今天,我们来介绍一下 Linux 对虚拟内存空间管理的细节。...段 之前我们说过,在 32 位的操作系统中,每个进程都拥有 4GB 的虚拟内存空间Linux 根据功能上的差异,把整个虚拟内存空间划分为多个不同区间,称为 段。...我们先来看看 Linux 进程虚拟内存空间的布局图,如图 1 所示: ? 上图展示了 Linux 进程的虚拟内存空间布局情况,我们只关注 用户空间 的布局。...从上图可以看出,进程的用户空间大小为 3GB。Linux 按照功能上的差异,把一个进程的用户空间划分为多个段,下面介绍一下各个段的作用: 代码段:用于存放程序中可执行代码的段。...虚拟内存区 从上面的介绍可知,Linux 按照功能上的差异,把虚拟内存空间划分为多个 段。那么在内核中,是通过什么结构来管理这些段的呢? 答案就是:vm_area_struct。

    3.2K12

    用户空间和内核空间

    学习 Linux 时,经常可以看到两个词:User space(用户空间)和Kernel space(内核空间)。...简单说,Kernel space 是 Linux 内核的运行空间,User space 是用户程序的运行空间。为了安全,它们是隔离的,即使用户的程序崩溃了,内核也不受影响。...str="my string"// 用户空间 x=x+2 file.write(str)// 切换到内核空间 y=x+4// 切换回用户空间 上面代码中,第一行和第二行都是简单的赋值运算,在User space...第三行需要写入文件,就要切换到Kernel space,因为用户不能直接写文件,必须通过内核安排。第四行又是赋值运算,就切换回User space。...参考链接:https://drawings.jvns.ca/userspace/ https://www.lifewire.com/linux-top-command-2201163

    3.2K80

    Linux服务器如何释放内存空间

    Linux服务器运行一段时间后,由于其内存管理机制,会将暂时不用的内存转为buff/cache,这样在程序使用到这一部分数据时,能够很快的取出,从而提高系统的运行效率,所以这也正是Linux内存管理中非常出色的一点...,所以乍一看内存剩余的非常少,但是在程序真正需要内存空间时,Linux会将缓存让出给程序使用,这样达到对内存的最充分利用,所以真正剩余的内存是free+buff/cache 但是有些时候大量的缓存占据空间...,这时候应用程序回去使用swap交换空间,从而使系统变慢,这时候需要手动去释放内存,释放内存的时候,首先执行命令 sync 将所有正在内存中的缓冲区写到磁盘中,其中包括已经修改的文件inode、已延迟的块...echo 3 > /proc/sys/vm/drop_caches 执行完之后,再次查看内存剩余: 会发现内存被释放了,可用内存变为653M左右。...到这里内存就释放完了,现在drop_caches中的值为3,另外需要注意的是,在生产环境中的服务器我们不要频繁的去释放内存,只在必要时候清理内存即可,更重要的是我们应该从应用程序层面去优化内存的利用和释放

    23.3K10

    Linux 内核 内存管理】虚拟地址空间布局架构 ② ( 用户虚拟地址空间组成 | 内存描述符 mm_struct 结构体源码 )

    文章目录 一、用户虚拟地址空间组成 二、内存描述符 mm_struct 结构体源码 一、用户虚拟地址空间组成 ---- " 用户虚拟地址空间 " 包括以下区域 : ① 代码段 ② 数据段 ③ 未初始化数据段...④ 动态库 代码段 , 数据段 , 未初始化数据段 ; ⑤ 堆内存 : 通过 malloc brk vmalloc 等函数 申请的 动态分配 的内存 ; ⑥ 栈内存 : 存放 局部变量 和 函数调用栈...; ⑦ 内存映射区 : 将 文件 通过 mmap 函数 映射到 " 虚拟地址空间 " 的 " 内存映射区 " ; ⑧ 环境变量与参数 : 在 栈底 存放着程序运行的 环境变量 与 参数配置 信息 ;...二、内存描述符 mm_struct 结构体源码 ---- 在 Linux 内核中 , 使用 " 内存描述符 " mm_struct 结构体 代表 " 用户虚拟地址内存空间 " , mm_struct 结构体...在 Linux 源码 linux-4.12\include\linux\mm_types.h#359 位置 ; mm_struct 结构体源码如下 : struct mm_struct { struct

    64210

    【Binder 机制】进程通信 | 用户空间与内核空间 | MMU 与虚拟内存地址

    文章目录 一、进程通信 二、用户空间与内核空间 三、MMU 与虚拟内存地址 一、进程通信 ---- 进程隔离概念 : 系统中的进程存在 " 进程隔离 " , 出于对进程运行的保护 , 两个进程的内存是隔离的...是通过 " Binder " 机制 完成的 ; Binder 机制不是内核自带的机制 , 而是 Android 可以动态进行 Binder 注册 , 然后进程间通过 Binder 进行通信 ; 二、用户空间与内核空间...---- 系统中的内存分为 2 部分 , 用户空间 和 内核空间 , 内核空间一般是运行操作系统 , 用户空间一般运行应用 ; 操作 内核空间 时的状态称为 " 内核态 " ; 操作 用户空间 时的状态称为..." 用户态 " ; 三、MMU 与虚拟内存地址 ---- 每个 应用进程 的 内存空间 使用的地址都是 独立的 , 连续的 , 虚拟地址 ; 内存管理单元 ( MMU - Memory Management...1 个 4 GB 大小的空间 , Linux 系统内核空间占 1 GB , 用户空间 3 GB ; 0 ~ 3 GB 是用户空间地址 , 3 ~ 4 是内核空间地址 ;

    1.8K10

    Linux下自动化监控内存、存储空间

    今天主要内容包含,Linux的基础Shell编程的流程控制语句、cut的使用、grep的使用、以及awk的使用就可以实现我们所说的事情了!...这样我们就看到了第一行内存使用的状况了:那我们想要的是free这列值来进行监控,那么我们就一步一步去获取这行的值 1)先展示出来所有的,然后我们通过管道以此交给下一条命令去处理 ?...3)通过awk命令我们获取到第四列然后并打印出来,$后面跟的是我们要打印的那列,print是和awk配合使用的,linux下print是不能单独使用的 ?...那监控内存的功能大家看明白了后面监控硬盘空间的功能也是一样的,我直接给大家上脚本了 ?...以上就是我们通过Shell脚本来实现自动化监控内存和使用硬盘空间的操作,然后我们通过定时任务去执行相应的脚本就可以了 脚本很粗糙,还有一些需要改进的地方,希望小伙伴们研究明白之后可以去优化一下然后去监控你们的服务器吧

    1.2K60

    Linux下oracle创建表空间用户「建议收藏」

    1,登录sys用户 sqlplus / as sysdba 2,查询用户空间文件的路径,然后在此目录下创建新的表空间 select name from v$datafile; NAME ------...' SIZE 100M AUTOEXTEND ON NEXT 32M MAXSIZE 500M EXTENT MANAGEMENT LOCAL; 4,查询用户临时表空间文件的路径,然后在此目录下创建新的临时表空间...grant create session to username; 9,给表空间配额 ALTER USER username QUOTA 100M ON xxxx; 表空间配额(三选一即可) 您可以给用户...,例如username在 xxxx表空间中的无限配额 ALTER USER username QUOTA UNLIMITED ON xxxx; 您还可以定义允许用户在表空间上分配的空间最大值 ALTER...USER username QUOTA 100M ON xxxx; 您还可以授予用户 UNLIMITED TABLESPACE 系统权限,这意味着他对数据库中的任何表空间都有无限的配额 GRANT UNLIMITED

    2.7K10
    领券