分配Linux 内存管理: Kmalloc

linux内存管理  时间:2021-01-15  阅读:()

Linux 内存管理 Kmal loc

Linux内存管理: Kmal loc

这里只说物理内存管理l inux内核的看了很多讲解的内存的东西但是自己总结的时候总感觉无从下手这里就从实际物理内存分配接口开始吧。

Kmal loc它分配连续的物理内存空间它不负责把分配的内存空间清

零它能分配多大的呢并且它只能分配ZONE_NORMAL的不能分配dma 和high里的也就是只分配低端内存.一般情况下内存被分为三个zoneNORMAL、 DMA、 HIGH.

这个函数是建立在slab分配器的基础上的,通过cache而cache有通过slab分配obj 。在开始分析kmal loc函数之前我们需要说明一下l inux内核物理内存的分配函数API  __get_free_pages它会调用al loc_pages它的特点是不能从HIGHMEM分配内存分配2的幂个连续物理页面。它有简化模式只分配一page __get_free_page,而get_zeroed_page接口分配的页面内容对应填充为0.从dma分配可以调用__get_dma_pages(它本质也是调用__get_free_pages

那么终极接口al loc_pages它可以从任何zone里申请内存 当然前提设置对应的flags.参考内核 l inux3.18.13参考书籍:《l inux内核设计与实现》

《l inux设备驱动程序》 《深入理解l inux设备驱动内核机制》

下面我们就说说kmal loc 关于分配时候的flags这里不讨论具体可以参考资料我们先看头文件#include而关于它的具体实现我们看slab.h

一般系统默认#include

这里可以补充下代码关于kmal loc_sizes.h

我们看到函数开头需要说明一下 __bui ltin_constant_p是编译器gcc 内置函数用于判断一个值是否为编译时常量如果是常数函数返回1 否则返回0。此内置函数的典型用法是在宏中用于手动编译时优化显然如果size为常数则用__kmal loc(size, flags);申请内存.

它查询需要分配的内存在哪个系统cache然后调用

我们看具体代码

它实际的分配是slab_al loc

它调用objp=__do_cache_al loc(cachep, flags);除了检查一些标志等继续调用

____cache_al loc(cachep, flags);

它是一个统一的接口 有检测numa和uma  l inux默认是uma除非指定了numa

这里我们假定是第一次使用分配内存那么根据在kmem_cache_init 中的mal loc_sizes[]的初始化在kmal loc的时候返回的kmal loc_cache指针指向的cache中用到这样个函数我们知道不论array被赋了什么值最后都要初始化avai l等值.

所以如果array不可用那么就会调用当然如果array可用那么直接返回申请的obj的内存指针.

由于第一次使用nodel ist上slab链表都为空所以must_grow

它调用cache_grow这个函数首先计算了slab着色处理。然后调用kmem_getpages申请page大小根据cache->gfporder它返回申请pages 的虚拟地址.

而关于slab着色跟硬件缓冲有关为了尽量避免缓存冲突不命中问题提高效率cache_l ine问题。可以参考《深入理解计算机系统》。

具体操作见

我们看看另外一个很重要的操作

npidc:9元/月,cn2线路(不限流量)云服务器,金盾+天机+傲盾防御CC攻击,美国/香港/韩国

npidc全称No Problem Network Co.,Limited(冇問題(香港)科技有限公司,今年4月注册的)正在搞云服务器和独立服务器促销,数据中心有香港、美国、韩国,走CN2+BGP线路无视高峰堵塞,而且不限制流量,支持自定义内存、CPU、硬盘、带宽等,采用金盾+天机+傲盾防御系统拦截CC攻击,非常适合建站等用途。活动链接:https://www.npidc.com/act.html...

腾讯云爆款秒杀:1C2G5M服务器38元/年,CDN流量包6元起

农历春节将至,腾讯云开启了热门爆款云产品首单特惠秒杀活动,上海/北京/广州1核2G云服务器首年仅38元起,上架了新的首单优惠活动,每天三场秒杀,长期有效,其中轻量应用服务器2G内存5M带宽仅需年费38元起,其他产品比如CDN流量包、短信包、MySQL、直播流量包、标准存储等等产品也参与活动,腾讯云官网已注册且完成实名认证的国内站用户均可参与。活动页面:https://cloud.tencent.c...

HostHatch(15美元)大硬盘VPS,香港NVMe,美国、英国、荷兰、印度、挪威、澳大利亚

HostHatch在当地时间7月30日发布了一系列的促销套餐,涉及亚洲和欧美的多个地区机房,最低年付15美元起,一次买2年还能免费升级双倍资源。商家成立于2011年,提供基于KVM架构的VPS主机,数据中心包括中国香港、美国、英国、荷兰、印度、挪威、澳大利亚等国家的十几个地区机房。官方网站:https://hosthatch.com/NVMe VPS(香港/悉尼)1 CPU core (12.5%...

linux内存管理为你推荐
企业虚拟主机企业虚拟主机现在具体是多少价位?英文域名中文域名与英文域名区别免费虚拟主机申请永久免费虚拟主机域名服务商比较专业的域名服务商有哪些?好的域名和域名服务商没关系吧?域名购买在网上购买域名 会受骗吗免费网站空间申请哪里有永久免费的域名空间可以申请香港虚拟主机推荐一下香港的虚拟主机公司!什么是虚拟主机虚拟主机是什么100m虚拟主机100M的虚拟主机都能做些什么虚拟主机控制面板我想问下虚拟主机的控制面板有哪些还不错的品牌呢?价格不能太高最好是性价比比较高一点就行了
100m虚拟主机 最新代理服务器地址 域名备案只选云聚达 中文域名交易中心 免备案空间 gitcafe godaddy域名优惠码 网站监控 512au tk域名 网站实时监控 标准机柜尺寸 国内加速器 java虚拟主机 hostker asp免费空间申请 绍兴电信 流媒体加速 免费的asp空间 国外的代理服务器 更多