内存管理
内存管理总结区域
sydyh43
这个作者很懒,什么都没留下…
展开
-
【无标题】
1、将虚拟地址传入到内核态,借助内核态中mm_struct结构体的pgd页表基地址成员,经过查页表的方式最终获取到物理地址。查看到其中有一项/pro/[pid]/pagemap,可以看出54~0就是对应着物理地址的页帧号,再加上虚拟地址的低12位,就是虚拟地址对应的物理地址。但是有一点可以明确的,转换出来,获取到的是页帧号(即页对齐),最后加上虚拟地址的低N位(32bit的系统是低12位)得到最终的物理地址。3、 在用户态,读取/proc/[pid]/pagemap这个节点的数据,获取物理内存的页帧号。原创 2022-09-03 14:25:17 · 485 阅读 · 0 评论 -
内核态和用户态相关的内存泄漏
应用程序通过系统调用进入内核态代码。假如内核态代码存在内存泄漏,此内存泄漏属于内核态还是用户态?查看内核态和用户态的统计信息。原创 2022-06-03 10:04:39 · 299 阅读 · 1 评论 -
虚拟地址找到物理地址
/proc/self/pagemap原创 2022-06-03 09:58:25 · 241 阅读 · 0 评论 -
memcpy在不同cpu使用率情况下耗时不一样
待补充原创 2022-03-17 21:02:45 · 1349 阅读 · 0 评论 -
fork写时复制分析
待补充原创 2022-03-11 11:03:15 · 194 阅读 · 0 评论 -
mm_struct结构体的认知
1、先看看mm_struct结构体的定义struct mm_struct { struct { struct vm_area_struct *mmap; /* list of VMAs */ struct rb_root mm_rb; ...... unsigned long mmap_base; /* base of mmap area */ unsigned long mmap_legacy_base; /* base of mmap area in botto原创 2022-02-12 14:26:17 · 617 阅读 · 0 评论 -
虚拟地址如何访问到物理地址
环境:32bit CPU一、通过二级页表映射的方式访问物理地址1、取一级页表的基地址Abase12、取虚拟地址的前12bit[31:20]地址O13、计算得到新地址Apgd=(Abase1&0xFFFFF000)+O1,此地址是PGD页表上的地址,取此地址中的数据Abase24、取虚拟地址的中间8bit[19:12]地址O25、计算得到新地址Apte=(Abase2&0xFFFFFF00)+O2,此地址是PTE页表上的地址,取此地址中的数据Abase36、取虚拟地址的后1原创 2022-02-08 17:43:04 · 938 阅读 · 0 评论 -
同一应用程序同时运行两次,代码段是同一份嘛
1、先看看下面代码,代码中额外增加了获取进程代码段和数据段的。#define _GNU_SOURCE#include <unistd.h>#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <stdlib.h>#include <string.h>int a = 0;int原创 2022-01-29 20:27:11 · 576 阅读 · 0 评论 -
栈区数据被飞踩问题定位手段
1、栈溢出或者栈数据被踩时,继续运行就会出现segmentation fault。可以尝试着接管SIGSEGV信号,在信号处理函数中保存一些出现异常时候的信息。2、基于栈溢出场景,栈空间被破坏,也就没法使用栈区,当然就没法执行SIGSEGV信号的处理函数。因此需要开辟额外的空间用于栈空间使用,系统提供了sigaltstack接口。2.1、开辟第二栈区的代码void create_alt_stack(void){ stack_t sigstack; memset(&sigsta原创 2022-01-25 20:07:09 · 3118 阅读 · 0 评论 -
vmalloc最大申请的空间大小
1、vmalloc和vfree是内核下面申请和释放内存的函数。申请到的内存虚拟地址连续,但是物理地址可能不连续,且按照4K方式对齐。2、vmalloc最大分配的空间大小(cat /proc/meminfo | grep Vmalloc)查看。最大不可能操作改值3、假如vmalloc申请一个特别大的空间,即超过了上面的阈值,设备无法申请成功4、根据上面的错误信息可以确认报错的地方static struct vmap_area *alloc_vmap_area(unsigned lon原创 2022-01-15 16:20:15 · 1175 阅读 · 0 评论 -
drop_caches释放哪些内存
1、命令echo 1 > /proc/sys/vm/drop_caches释放文件的page cache内存,对应着top下的cached值2、cached具体被哪些模块使用着(cat /proc/meminfo)【Active(file) + Inactive(file) + Shmem + mlock_file】== 【Cached + Buffers】Active(file)和Inactive(file)对应着文件映射Shmem对应着内存文件系统,如/tmp;或原创 2022-01-14 21:10:44 · 3251 阅读 · 0 评论 -
内存飞踩问题的几点思考
1、程序编译,链接后生成二进制可执行程序。二进制可执行文件以elf格式实现排列。可以通过readelf -S xxxx查看具体section的划分,粗略划分如下图所示。在这些section中,代码段是只读的,自然也就不存在代码(指令)被改写的情况。数据段,堆,栈区具有读写的属性,但是数据段和堆一般存放的是数据,不涉及到指令的问题。剩下的栈区,存放的既有数据,又有代码(指令),可能存在代码(指令)被改写,即内存被飞踩现象。2、栈空间数据被修改情况2.1、先做个实验(ARM 32环境)原创 2021-09-15 20:32:15 · 2262 阅读 · 2 评论 -
统计进程的实际物理内存使用情况
转载 2021-05-10 20:28:56 · 557 阅读 · 0 评论