![](https://img-blog.csdnimg.cn/20190927151101105.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
1000个Linux内存子系统知识
文章平均质量分 67
Linux内存管理相关的文章和知识点汇集
北冥有鱼被烹
这个作者很懒,什么都没留下…
展开
-
如何不用vmlinux也能用gdb调试linux内核模块以及调试linux内核?/sys/modules/xxxko/sections add-symbole-file -s .data
ko和vmlinux通过gdb调试的原理与实战方法原创 2023-08-13 23:57:03 · 261 阅读 · 0 评论 -
【1000个Linux内存知识-017】Linux中一些内存技术发明解决的核心问题梳理(不断更新)
很多技术点解决的主要矛盾就一个,并且也是在特定条件下解决某些问题。特此梳理能够相互关联并且备忘。原创 2023-08-13 18:49:27 · 51 阅读 · 0 评论 -
【1000个Linux内存知识-016】为什么内存要按页分配?
linux内核虚拟内存和物理内存都是按照页为单位进行管理的,为什么要这样?需要解决什么问题?原创 2023-08-13 17:40:42 · 82 阅读 · 0 评论 -
【1000个Linux内存知识-014】-内核中kmalloc到底是怎么从slab分配内存的?都是从slab分配的吗?
具体流程:alloc_pages 直接从伙伴系统拿。原创 2023-08-12 15:45:27 · 116 阅读 · 0 评论 -
【1000个Linux内存知识-013】-关于kmalloc分配内存使用的kmalloc cache的全局表kmalloc_caches和kc名字表kmalloc_info
slab分配器提供使用者自己创建cache仓库,然后使用者自己从仓库中分配。通过查看/proc/slabinfo可以看到kmalloc有多个slab cache,或者说slab的零售商。比如kmalloc-32,从slab批发了kmalloc-32的内存,然后自己在kmalloc中去零售。kmalloc-32就是一种kmem_cache,或者叫一个slab节点。后文称为kmalloc零售商。kmalloc提供了13个零售商,用来处理不同大小的内存分配请求。原创 2023-08-12 15:21:13 · 186 阅读 · 0 评论 -
【1000个Linux内存知识-012】slab slub slob是什么关系?是共存的吗?从源码级别看一下
struct kmem_cache是slab系统的主要数据结构,用来管理多个内存小块(object)的。slab系统通过提供不同的kmem_cache来分类不同类型的slab。比如kmalloc就在slab系统中注册了很多cache,比如kmalloc-32 kmalloc-64分别都申请了一类slab下面来看这三个“slab"对kmem_cache定义,来看他们的不同。源文件路径:mm/slab.cmm/slub.cmm/slob.c。原创 2023-08-12 13:23:19 · 373 阅读 · 1 评论 -
【1000个Linux内存知识-011】-如何查看slab在系统中占用多少物理内存?nmon
slab使用cache-slab-object三级方式管理从伙伴系统批发过来的物理内存。slab到底批发了多少内存,有一些方式可以查看:某些场景我们需要获取slab使用的物理内存大小,有哪些方式可以获取是什么:一个系统监控运维神器详细介绍:进入nmon输入m进入m统计可以看到图中Slab的大小用了53.9M的物理内存和前面通过 /proc/meminfo获取相同nmon是系统监控神器,值得以后深入研究slab分配的物理内存可以通过系统提供的proc文件系统,也可以通过nmon工具https://ww原创 2023-08-12 11:45:47 · 252 阅读 · 0 评论 -
【1000个Linux内存知识-001】-MMU中的两个单元分别是什么?(TLB TWU)作用和使用时机?
TLB table lookasid buffer 是存储VA到PA的高速缓存,在CPU和cache中间TWU table walk unit 如果TLB中没有 则由TWU硬件进行页表查询fill:#333;color:#333;color:#333;fill:none;cputlbl1cachel2cachel3cacheDDREMMCtwu多级页表缺页中断kernel。原创 2023-08-09 01:49:35 · 204 阅读 · 0 评论 -
【1000个Linux内存知识-010】-64位地址的Linux进程地址空间内核和用户地址空间分别在哪?中间空洞到底有多大
简单描述就是内核地址空间和用户地址空间都是128T。如果把内核地址空间或者用户地址空间算1份,那么还有约13万个128T是空着的。最低位置是进程的代码段和数据段还有stack heap关系线性映射区在内核空间初期vmalloc空间比较大内核text在高地址。原创 2023-08-09 01:24:23 · 399 阅读 · 0 评论 -
【1000个Linux内存知识-009】-MMU和cache和memory和EMMC什么关系
fill:#333;color:#333;color:#333;fill:none;cpu0mmu0tlbL1Dcache0L2cache0L1Icache0L3cache主存EMMCcpu1mmu1tlbL1Dcache1L1Icache1L2cache1。原创 2023-08-09 00:25:57 · 68 阅读 · 0 评论 -
【1000个Linux内存知识-008】-brk系统调用是干嘛的?全称是什么?
因此,"brk"这个术语实际上是来自于"break point"的缩写,并非来自英语单词"break"(打破)的意思。随着时间的推移,这种术语逐渐被其他更易理解的名称所取代,如现代编程语言中的"malloc"和"free"等函数来管理动态内存分配。在早期的计算机系统中,堆空间的位置由一个特定的内存地址来控制,通常称为"break point"(断点)。通过修改这个"break point"地址,程序可以增加或减少堆空间的大小。"brk"是"break"的缩写,它是一个系统调用,用于改变程序的堆空间大小。原创 2023-08-07 03:04:24 · 923 阅读 · 0 评论 -
【1000个Linux内存知识-007】-ELF文件中的段Segment和节Section的区别是什么?代码段和数据段是段还是节?.bss .data是什么?【readlef -l】
(注意这里加载到内存后,在linux按照页映射到物理内存,页表里面就会指定权限,从而进一步就会影响平时经常出现的Segment Fault,所谓的段错误就是一个地址访问的时候发现不是合法的,怎么判断不是合法的,就是通过虚拟地址访问页表访问到物理页的时候页的属性可能不具有写的属性,就是段错误了。节头对于程序的执行来说不是必需的,没有节头表,程序仍可以正常执行,因为节头表没有对程序的内存布局进行描述,对程序内存布局的描述是程序头表的任务。ELF 程序头是对二进制文件中段的描述,是程序装载必需的一部分。原创 2023-08-07 00:23:58 · 856 阅读 · 0 评论 -
【1000个Linux内存知识-004】-物理页表的PFN到底是什么?PFN与struct page有什么关系?
根据上面的数据可以得到page全局唯一,所以数组下标也是page唯一ID,所以某个PFN就是它对应的某个struct page在mem_map中的数组下标,通过PFN就能找到这个page的描述符,就能操作这个page。因为系统所有内存都在mem_map中,所以每一个页帧就有一个唯一id,就是这个PFN,相当于page在mem_map中的身份证。物理页表的PFN是某个物理页面的全局唯一描述符struct page的序号,也是在mem_map中的下标。1M个64B就是64M的mem_map的数组。原创 2023-08-06 17:26:04 · 780 阅读 · 1 评论 -
【1000个Linux内存知识-003】-Linux内核中物理内存是如何组织起来的?(物理内存三大金刚:node-zone-page)
在linux内核中用pglist_data来描述一个node,每个node分成了多个zone,每个zone分成了11个free_area,每个free_area存储了不同大小的页表分别有11种(2^0个page,2^1个page... 2^10个page),每一种大小的页表链又被分到了6种状态子链表(根据页表是否能够移动MOVEABLE等)- 然后将这些页按照2^n个大小分成11种大小的页,分别是1个页,2个页.. 最大的是1024个页。假设每个大小的链表都挂载x个node。所以x = 2^9=512个。原创 2023-08-06 16:42:46 · 112 阅读 · 0 评论 -
【1000个Linux内存知识-002】-缺页异常的本质是什么?谁缺页?如何根据多级页表和10-10-12分页机制的虚拟地址找到真正物理地址的?
页目录PDE 算是第一级指针,通过从CR3或者TTBR拿到页表基地址(也就是页表的第一个地址),找到一级页表那块内存地址,然后加上VA中的高10b的值(也就是pde的offset),得到存储二级页表地址的内存单元,根据内存单元的值中获取到PT所在。进程地址空间管理要映射到物理地址,就靠这个页表管理,管理的所谓页表,就是物理页的页表。- 类似的拿到PT的所在内存块的基地址之后,根据PTE的偏移,拿到存储PAGE地址的内存单元,根据内存单元的值获取到真正需要访问的页表的地址。原创 2023-08-06 13:39:54 · 474 阅读 · 0 评论 -
【1000个Linux内存知识-001】-为什么linux使用页表管理内存?为什么需要mmu?为什么需要tlb?
再加上不同进程页表数量巨大 为了节约RAM空间就增加了多级页表,类似页表方式,让顶级页表常驻内存,比如2^10=1k,让二级页表存入磁盘,页表项也到磁盘上去。问题本质是不同进程大小不一 那么如何避免碎片 那就是让空间固定大小分配 页式管理就是固定大小 它的本质是固定大小 具体页大小有的4k 有的64k 根据需求确定。需要用的时候先一级页表,根据访存地址一级地址 获取到二级页表存储位置,然后二级页表地址偏移获取到三级页表地址 然后偏移得到物理地址。于是页式内存管理应运而生,核心是解决交换系统的内存碎片问题。原创 2023-07-29 02:49:15 · 130 阅读 · 0 评论