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

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

文章目录 一、堆内存管理 二、内存描述符 mm_struct 结构体 三、mm_struct 结构体中的 start_brk、brk 成员 一、堆内存管理 ---- Linux 操作系统中的 " 堆内存...结构体 ---- mm_struct 结构体 定义在 Linux 内核源码 include\linux\mm_types.h#375 源码中 ; mm_struct 结构体 源码 : struct mm_struct...-5.6.18\include\linux\mm_types.h#375 三、mm_struct 结构体中的 start_brk、brk 成员 ---- mm_struct 结构体中的 start_brk...、brk 成员 , 分别是 " 堆内存 " 在 " 虚拟地址空间 " 的 开始 和 结束 地址 , 其定义在 Linux 内核源码的 linux-5.6.18\include\linux\mm_types.h...#456 源码中 ; unsigned long start_brk, brk, start_stack; 源码路径 : linux-5.6.18\include\linux\mm_types.h

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

Linux 内核 内存管理】虚拟地址空间布局架构 ⑤ ( Linux 内核中对 “ 虚拟地址空间 “ 的描述 | task_struct 结构体源码 )

文章目录 一、Linux 内核中对 " 虚拟地址空间 " 的描述 二、task_struct 结构体源码 一、Linux 内核中对 " 虚拟地址空间 " 的描述 ---- 进程 的 " 虚拟地址空间 "...结构体源码 ---- task_struct 进程描述符 结构体 , 定义在 Linux 内核源码的 linux-4.12\include\linux\sched.h#483 位置 ; task_struct...中的 mm active_mm 是 描述 " 整个虚拟空间 " mm_struct 类型的结构体 ; struct mm_struct *mm; struct mm_struct *active_mm...; mm_struct 进程描述符 参考如下博客 : 【Linux 内核】进程管理 task_struct 结构体 ① ( task_struct 结构体引入 | task_struct 代码示例 )...【Linux 内核】进程管理 task_struct 结构体 ② ( state 字段 | stack 字段 | pid 字段 | tgid 字段 | pid_links 字段 ) 【Linux 内核

3.7K20

进程管理中的active_mm是做什么的?

Linux内核中,进程管理涉及到许多复杂的数据结构和机制,其中active_mm是与内存管理相关的一个关键概念。理解active_mm需要先了解与之相关的一些基本内核结构和概念。...基本概念 mm_struct: 每个进程有一个与之关联的mm_struct结构,它描述了进程的内存映射(包括代码段、数据段、堆、栈等)。...active_mm active_mm字段存在于Linux内核的task_struct结构体中,用于处理内核线程的内存管理问题。...active_mm仍指向最后一个用户进程A的mm_struct。 用户进程B: 切换到进程B时,进程B的mm指向它自己的mm_struct。...总结 在Linux内核中,active_mm是一个重要的机制,确保内核线程能够正常运行和管理内存,即使它们没有自己的mm_struct

10710

Linux 内核 内存管理】内存映射相关数据结构 ① ( vm_area_struct 结构体 | task_struct、mm_struct、vm_area_struct 3 个结构体之间的关系)

文章目录 一、vm_area_struct 结构体 二、task_struct 进程描述符、mm_struct 内存描述符、vm_area_struct 虚拟内存区间 之间的关系 一、vm_area_struct...Linux 内核源码 linux-4.12\include\linux\mm_types.h#284 位置 ; 在之前的博客 【Linux 内核 内存管理】虚拟地址空间布局架构 ⑥ ( mm_struct...| vm_next | vm_prev |vm_rb) 中 , 分析了 vm_area_struct 结构体 的 源码 及 成员含义 ; 二、task_struct 进程描述符、mm_struct 内存描述符...\sched.h#483 位置 ; task_struct 中的 mm 是 描述 " 整个虚拟空间 " mm_struct 类型的结构体 ; struct mm_struct *mm; mm_struct...结构体 是 " 内存描述符 " , 定义在 Linux 内核源码的 linux-4.12\include\linux\mm_types.h#359 位置 ; mm_struct 结构体中的 mmap

65220

Linux 内核 内存管理】虚拟地址空间布局架构 ④ ( 内存描述符 mm_struct 结构体成员分析 | hiwater_rss | start_code | start_brk )

文章目录 一、mm_struct 结构体成员分析 1、hiwater_rss 成员 2、hiwater_vm 成员 3、total_vm 成员 4、locked_vm 成员 5、start_code、...end_data 成员 6、start_brk、 brk、 start_stack 成员 7、arg_start、 arg_end、env_start、 env_end 成员 8、context 成员 一、mm_struct...结构体成员分析 ---- mm_struct 结构体 在 Linux 源码 linux-4.12\include\linux\mm_types.h#359 位置 ; 参考 【Linux 内核 内存管理...】虚拟地址空间布局架构 ② ( 用户虚拟地址空间组成 | 内存描述符 mm_struct 结构体源码 ) 博客 ; 下面开始分析 mm_struct 结构体 的重要 成员 ; 1、hiwater_rss

37410

Linux 内核 内存管理】虚拟地址空间布局架构 ③ ( 内存描述符 mm_struct 结构体成员分析 | mmap | mm_rb | task_size | pgd | mm_users )

文章目录 一、mm_struct 结构体成员分析 1、mmap 成员 2、mm_rb 成员 3、get_unmapped_area 函数指针 4、task_size 成员 5、pgd 成员 6、mm_users...成员 7、mm_count 成员 一、mm_struct 结构体成员分析 ---- mm_struct 结构体 在 Linux 源码 linux-4.12\include\linux\mm_types.h...#359 位置 ; 参考 【Linux 内核 内存管理】虚拟地址空间布局架构 ② ( 用户虚拟地址空间组成 | 内存描述符 mm_struct 结构体源码 ) 博客 ; 下面开始分析 mm_struct...* reference holders), we also release a reference on @mm_count * (which may then free the &struct mm_struct...When this drops to 0, the * &struct mm_struct is freed. */ atomic_t mm_count;

40910

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

文章目录 一、用户虚拟地址空间组成 二、内存描述符 mm_struct 结构体源码 一、用户虚拟地址空间组成 ---- " 用户虚拟地址空间 " 包括以下区域 : ① 代码段 ② 数据段 ③ 未初始化数据段...内存映射区 : 将 文件 通过 mmap 函数 映射到 " 虚拟地址空间 " 的 " 内存映射区 " ; ⑧ 环境变量与参数 : 在 栈底 存放着程序运行的 环境变量 与 参数配置 信息 ; 二、内存描述符 mm_struct...结构体源码 ---- 在 Linux 内核中 , 使用 " 内存描述符 " mm_struct 结构体 代表 " 用户虚拟地址内存空间 " , mm_struct 结构体 在 Linux 源码 linux...-4.12\include\linux\mm_types.h#359 位置 ; mm_struct 结构体源码如下 : struct mm_struct { struct vm_area_struct...page_table_lock, in other configurations by being atomic. */ struct mm_rss_stat rss_stat; struct linux_binfmt

59110

Linux 内核】进程管理 ( 内核线程概念 | 内核线程、普通进程、用户线程 | 内核线程与普通进程区别 | 内核线程主要用途 | 内核线程创建函数 kernel_thread 源码 )

文章目录 一、内核线程概念 二、内核线程、普通进程、用户线程 三、内核线程、普通进程区别 四、内核线程主要用途 五、内核线程创建函数 kernel_thread 源码 一、内核线程概念 ---- 直接 由 Linux...内核】进程管理 ( 进程特殊形式 | 内核线程 | 用户线程 | C 标准库与 Linux 内核中进程相关概念 | Linux 查看进程命令及输出字段解析 ) 一、进程特殊形式 ( 内核线程 | 用户线程..." 进程描述符 " 结构体在 linux-5.6.18\include\linux\sched.h 头文件中 第 629 ~ 1300 行定义 ; mm 字段是一个指针 , 指针指向 mm_struct...mm 字段 指向同一个 " 内存描述符 " ; 但对于 " 内核线程 " 来说 , mm 字段 指向 空指针 , active_mm 字段 指向 从进程借用的 " 内存描述符 " ; struct mm_struct...*mm; struct mm_struct *active_mm; 源码地址 : linux-5.6.18\include\linux\sched.h 四、内核线程主要用途 ---- 内核线程主要用途

3.8K20

Linux 内核】进程管理 task_struct 结构体 ④ ( comm 字段 | 进程优先级字段 | cpus_ptr 字段 | mm、active_mm 字段 | fs 字段 )

文章目录 一、task_struct 结构体字段分析 1、comm 字段 2、进程优先级字段 3、cpus_ptr 字段 4、mm、active_mm 字段 5、 fs 字段 在 Linux 内核 中..." 进程描述符 " 结构体在 linux-5.6.18\include\linux\sched.h 头文件中 第 629 ~ 1300 行定义 ; 一、task_struct 结构体字段分析...指向 CPU 资源 , 表示 该进程 被允许在哪个 CPU 上运行 ; const cpumask_t *cpus_ptr; 4、mm、active_mm 字段 mm 字段是一个指针 , 指针指向 mm_struct...mm 字段 指向同一个 " 内存描述符 " ; 但对于 " 内核线程 " 来说 , mm 字段 指向 空指针 , active_mm 字段 指向 从进程借用的 " 内存描述符 " ; struct mm_struct...*mm; struct mm_struct *active_mm; 5、 fs 字段 fs 字段 , 指向 " 虚拟文件系统 ( VFS ) " , 主要是指向 " 根目录 " 和 " 当前工作目录

1.1K40

Linux 内核 内存管理】内存映射相关数据结构 ② ( vm_area_struct 结构体成员分析 | vm_mm 成员 | vm_page_prot 成员 | vm_flags 成员 )

vm_area_struct 结构体成员分析 1、vm_mm 成员 2、vm_page_prot 成员 3、vm_flags 成员 二、vm_area_struct 结构体完整源码 在之前的博客 【Linux...*vm_mm 成员的作用是 指向 " 内存描述符 " mm_struct 结构体 , 这是该 " 虚拟内存区域 " vm_area_struct 所属的 " 进程的用户虚拟地址空间 " mm_struct...mm_struct *vm_mm; /* The address space we belong to. */ 2、vm_page_prot 成员 pgprot_t vm_page_prot 成员是...unsigned long vm_flags 表示 虚拟内存 的 标志 ; unsigned long vm_flags; /* Flags, see mm.h. */ 虚拟内存 相关的标志位定义在 linux...-4.12\include\linux\mm.h#159 位置 上述 unsigned long vm_flags 可设置的标志位有 VM_READ VM_WRITE VM_EXEC VM_SHARED

4K10

一文读懂 Linux 内存分配全过程

所以,本文主要分析在 Linux 内核中对堆内存分配的实现过程。...本文使用 Linux 2.6.32 版本代码 内存分区对象 在《你真的理解内存分配》一文中介绍过,Linux 会把进程虚拟内存空间划分为多个分区,在 Linux 内核中使用 vm_area_struct...在 图1 中,我们可以看到有个 mm_struct 的对象,此对象每个进程都持有一个,是进程虚拟内存空间和物理内存空间的管理对象。...总结 本文主要介绍了 Linux 内存分配的整个过程,当然只是介绍从堆空间分配的内存的过程。...Linux 分配内存的方式还有很多,比如 mmap、HugePages 等,有兴趣的可以查阅相关的资料和书籍。 如果有问题,可以加我微信一起探讨:JaydenSongLie。

1.5K41

聊聊Linux中线程和进程的联系与区别!

但事实在 Linux 上,进程和线程的相同点要远远大于不同点。在 Linux 下的线程甚至都被称为了轻量级进程。 我今天就给大家从 Linux 内核实现的角度,给大家深度对比下进程和线程。...我们来看 task_struct 具体的定义,它位于 include/linux/sched.h //file:include/linux/sched.h struct task_struct { /...需要注意的是,这次拷贝只会拷贝 task_struct 结构体本身,它内部包含的 mm_struct 等成员不会被复制。 我们来简单看下具体的代码。...接下来在 copy_mm 函数 中会根据是否有这个标志来决定是该和当前线程共享一份地址空间 mm_struct,还是创建一份新的。...而对于多进程程序来说,每一个进程都有独立的 mm_struct(地址空间)。

1.6K30

Linux进程的内存管理

几个关键的数据结构 一个进程的虚拟地址空间主要由两个数据结来描述,一个是 mm_struct,一个是 vm_area_structs。...mm_struct结构描述了一个进程的整个虚拟地址空间,vm_area_truct描述了虚拟地址空间的一个区间(简称虚拟区)。...下图就是我们所说的由task_struct到mm_struct,进程的地址空间的分布。 ? 每一个进程都会有自己独立的mm_struct,这样每一个进程都会有自己独立的地址空间,这样才能互不干扰。...struct mm_struct { struct vm_area_struct *mmap; //指向虚拟区间(VMA)链表 struct rb_root mm_rb;...arg_start,结束arg_end,环境段的开始env_start,结束env_end unsigned long saved_auxv[AT_VECTOR_SIZE]; struct linux_binfmt

3.2K20

Linux进程学习【进程地址】

实现的 同 task_struct 一样,mm_struct 中也包含了很多成员,比如不同区域的边界值 //简单展示其中的成员信息 mm_struct { //代码区域划分 unsigned long...能在其对物理地址造成影响前进行拦截 因为每个进程都有属于自己的空间,OS 在管理进程时,能够以统一的视角进行管理,效率很高 光有 虚拟地址空间 是不够的,还需要一套完整的 ‘‘翻译’’ 机制进行程序寻址,如 Linux...后续对这块进行写入操作时,会直接拒绝 对于这种机制感兴趣的同学可以点击下面这几篇文章查看详细内容: Linux的虚拟内存详解(MMU、页表结构) ARM体系架构——MMU 逻辑地址、页表、MMU等...️写时拷贝 Linux 中存在一个很有意思的机制:写时拷贝 这是一种 赌bo 行为,OS 此时就赌你不会对数据进行修改,这样就可以 使多个 进程 在访问同一个数据时,指向同一块空间,当发生改写行为时...防止地址随意访问,保护物理内存与其他进程(权限设置) 将 进程管理 和 内存管理 进行 解耦,方便 OS 进行更高效的管理 可以让进程以统一的视角看待自己的代码和数据 ---- 总结 以上就是本篇关于 Linux

16720

Linux】进程地址空间

在学习了 【Linux】计算机的软硬件体系结构 后,对于这个问题,相信大家已经能够轻松拿捏了 – 管理的本质是对数据进行管理,管理的方法是先描述,再组织。...所以和管理进程一样,操作系统会使用一种内核数据结构来对地址空间进行管理,Linux中用于 管理地址空间的内核数据结构叫做 mm_struct,操作系统会为每个进程创建一个 mm_struct 对象,然后通过管理结构体对象来间接管理进程地址空间...Linuxmm_struct 源码如下: 可以看到,进程地址空间其实也是进程属性的一种,我们可以通过进程的 task_struct 来找到/管理进程对应的地址空间。...mm_struct 中关于区域划分的部分源码如下: 在了解了区域划分的原理之后,地址空间的区域调整就变得很简单了 – 要调整一个区域的大小,调整 mm_struct 中维护此区域 start 和 end...注:严格来说,磁盘中程序内部的地址叫做逻辑地址,但是在上面我们就说过,对于Linux来说,虚拟地址、线性地址、逻辑地址是一样的,都是虚拟地址。

3.8K00
领券