地址Linux内存管理:Vmalloc

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

Linux内存管理 Vmal loc

在前面我们讲解了kmal loc申请连续物理内存的操作 以及原理和基础cache.在内核中还有另外一个接口函数那就是vmal loc 申请一片连续的虚拟地址空间但不保证物理空间连续实际上我们会想到用户空间的mal loc mal loc它是标准的gl ibc封装的一个函数最终实现是通过系统调用brk和mmap来实现 以后在分析它的实现过程.它就是申请连续的虚拟空间但是不保证物理内存的连续 当然用户程序也不怎么关心这个问题只所以会关心物理内存的连续性一般是由于设备驱动的使用或者DMA.但是vmal loc申请效率比较低还会造成TLB抖动.一般内核里常用kmal loc.除非特殊需求比如要获取大块内存时实例就是当ko模块加载到内核运行时 即需要vmal loc.释放函数 vfree

参考内核3.8.13

这里是说32位的处理器 即最大寻址4G虚拟空间 当然现在已经64位比较普及了后续补上吧而虚拟地址到物理地址的转化往往需要硬件的支持才能提高效率 即MMU。

当然前提需要os先建立页表PT.在l inux内核这4G空间并不是完全给用户空间使用在高端0xC0000000 3G开始留给内核空间使用x86默认配置默认0-16MDMA 16M-896MNormal 896M-1G 128M作为高端内存分配区域 当然这个区域也是可是配置的. .kmal loc函数返回的是虚拟地址(线性地址). kmal loc特殊之处在于它分配的内存是物理上连续的,这对于要进行DMA的设备十分重要.而用vmal loc分配的内存只

是线性地址连续,物理地址不一定连续,不能直接用于DMA。我们可以参考一个图 它是arm32

架构的内核虚拟地址分配图下面我们就看看vmal loc函数

(mm/vmal loc.c)

这里我们只用关注size即可而vmal loc优先从高端内存分配并且可以睡眠.继续重点看一下__vmal loc_node:

因为这里提到了VMALLOC_START和它们究竟是什么值呢 这里看了arm32和mips32的根据架构虚拟地址分配不同而不同比如mips就比较特殊在arch/mips/include/asm/pgtable-32.h 中首先看mips虚拟地址分布图

从这个图里我们知道用户空间为2G0x0-0x7fff ffff ,dma或者normal 内存映射

在kseg0 512M /kseg1,而对于vmal loc申请的虚拟地址在kseg2中当然还有其他一些特殊的映射比如io等.

在arch/arm/include/asm/pgtable.h

在看一个图

我们知道物理内存简单分为三个区域 ZONE_NORMAL、 ZONE_DMA、ZONE_HIGHMEMvmal loc我们看到它是默认从ZONE_HIGMEM里申请但是这两个函数虚拟地址是保持一致的 即都占用了4G地址空间的内核虚拟地址.通过上面的图我们确定了虚拟地址从哪里分配以及对于的物理空间从哪里分配。

下面看看vmal loc核心实现

它的基本实现思路很简单 1.分配虚拟地址空间2.对虚拟地址空间进行页表映射

需要熟知下面两个结构体 structvmap_area vm_struct *area 

这里在说明一下vmal loc_init的初始化.

其实在讲slab机制的时候已经说过。

下面就说说__get_vm_area_node函数

这个函数核心就是al loc_vmap_area这个很有趣的之前我们讲到了vmal loc申请的虚拟地址范围而它只传递了size而已对于mips x86arm会有不同的虚拟空间.

既然我们已经开辟了虚拟地址空间那么还需要做的当然是和页面一一映射起来.看函数__vmal loc_area_node

而insert_vmal loc_vml ist很明显把vm_struct插入到vml ist。 那么就完成了整个过程没有想象的复杂 当然对内存有了更多的认识这里还需要说一下一般情况下有高端内存会比没有的好些防止了vmal loc申请的时候造成的TLB抖动等问题更少的破坏normal空间。

可以通过proc来查看vmal loc的一下信息

还有

搬瓦工:新增荷兰机房 EUNL_9 测评,联通 AS10099/AS9929 高端优化路线/速度 延迟 路由 丢包测试

搬瓦工最近上线了一个新的荷兰机房,荷兰 EUNL_9 机房,这个 9 的编号感觉也挺随性的,之前的荷兰机房编号是 EUNL_3。这次荷兰新机房 EUNL_9 采用联通 AS9929 高端路线,三网都接入了 AS9929,对于联通用户来说是个好消息,又多了一个选择。对于其他用户可能还是 CN2 GIA 机房更合适一些。其实对于联通用户,这个荷兰机房也是比较远的,相比之下日本软银 JPOS_1 机房可...

wordpress简洁英文主题 wordpress简洁通用型高级外贸主题

wordpress简洁英文主题,wordpress简洁通用大气的网站风格设计 + 更适于欧美国外用户操作体验,完善的外贸企业建站功能模块 + 更好的移动设备特色模块支持,更高效实用的后台自定义设置 + 标准高效的代码程序功能结构,更利于Goolge等国际搜索引擎的SEO搜索优化和站点收录排名。点击进入:wordpress简洁通用型高级外贸主题主题价格:¥3980 特 惠 价:¥1280安装环境:运...

小欢互联19元/月起, 即日起至10月底 美国CERA 促销活动 美国/香港八折

小欢互联成立于2019年10月,主打海外高性价比云服务器、CDN和虚拟主机服务。近期上线了自营美国CERA机房高速VPS,进行促销活动,为客户奉上美国/香港八折优惠码:Xxc1mtLB优惠码适用于美国CERA一区/二区以及香港一区/二区优惠时间:即日起至10月底优惠码可无限次使用,且续费同价!官网:https://idc.xh-ws.com购买地址:美国CERA一区:https://idc.xh-...

linux内存管理为你推荐
全能虚拟主机时代互联的全能云虚拟主机怎么样,稳不稳定,速度怎么样的?域名注册查询如何知道域名注册信息?虚拟主机申请在哪里可以申请到虚拟主机呢网站空间购买怎么购买一个网站空间及购买注意事项免费网站空间申请哪个网站可以申请免费的网页空间虚拟主机评测浅谈建站新手如何挑选虚拟主机apache虚拟主机linux操作系统Apache配置虚拟主机长沙虚拟主机长沙哪里虚拟主机和主机托管比较关好!双线虚拟主机双线虚拟主机是智能的吗华众虚拟主机管理系统华众虚拟主机管理系统怎么样?
com域名注册1元 sugarhosts 仿牌空间 java主机 59.99美元 isatap 域名优惠码 国外php空间 gspeed 免费dns解析 33456 国外视频网站有哪些 德讯 789电视剧网 web服务器 server2008 电信测速器在线测网速 ddos攻击教程 竞彩论坛空间 腾讯空间登录首页 更多