关于内存管理的一点想法

本文探讨了32位和64位系统中虚拟内存与物理内存的区别,详细阐述了内存分配机制,包括页的单位、外部和内部碎片的管理,以及slab算法和kmalloc/vmalloc在内存分配中的作用。还提到了内核空间和用户空间的内存布局以及DMA区和normal区的划分。
摘要由CSDN通过智能技术生成

 

框架:

首先,无论设备存储多大,我们平时说的几个T的硬盘,但是内存不大,比如4G/8G/16/,我以前的笔记本电脑是2G的,32位。

对于32位系统,满打满算就4G的空间,0x00000000-0xffffffff,无论32位还是64位,对于运行在上面的很多进程,都是有自己的虚拟内存的,说是虚拟内存,也就是说并不是真的给你这么多,用多少给多少。

代码段/数据段/BSS段/堆/栈是 对于进程上面的用户空间3G而言,进程上面当然还有内核空间1G,只不过是所有进程公用的。

内核空间的1G要映射真正的4G物理内存,这里面896M是直接映射,剩下的128M映射大部分物理内存,靠的是动态映射。vmalloc只是其一,还有两种,vmalloc线性内存是连续的,但是映射的物理内存就不一定了。(64位的就肯定不是这种寻址机制,靠的是家底丰厚)

这4G物理内存也有说道,DMA区16M,normal区880M ,这就是直接映射的896M的来源。

物理内存分配:

基本单位是页,一个4kb,外部碎片(连续分配/释放,但是分配是尽量连续的,这是原因),解决是伙伴分配法:相同大小的页组成链表,有大有小,丰简由人

内部碎片(一个页没有用完,浪费),slab算法,不按一页分。缓存池概念,搞个池子存除已经初始化的对象,释放是回到池子中来,而不是给到伙伴系统。

分为高速缓存(kmalloc和kfree)和专用高速缓存(kmem_cache_alloc和kmem_cache_free)。

kmalloc在驱动程序中用的最多,多用于分配小内存,连续,由slab分配器分配。vmalloc用于分配大内存,目标是物理内存,按页分,不一定连续。kmalloc可以通过配置flags配置为可睡眠或者不可睡眠,GFP_KERNEL可以睡眠 。GFP_ATOMIC不可以睡眠,适合用在中断处理函数里面。与GFP_ATOMIC相比,使用GFP_KERNEL的分配失败的情况要少得多

虚拟内存分配:

包含用户空间虚拟内存和内核空间虚拟内存。

malloc分配一大块内存池,然后在内存池中分割很多不同大小的内存块,谁要给谁,减小CPU开销

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

beibei_xiansen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值