地址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的一下信息

还有

盘点618年中大促中这款云服务器/VPS主机相对值得选择

昨天有在"盘点2021年主流云服务器商家618年中大促活动"文章中整理到当前年中大促618活动期间的一些国内国外的云服务商的促销活动,相对来说每年年中和年末的活动力度还是蛮大的,唯独就是活动太过于密集,而且商家比较多,导致我们很多新人不懂如何选择,当然对于我们这些老油条还是会选择的,估计没有比我们更聪明的进行薅爆款新人活动。有网友提到,是否可以整理一篇当前的这些活动商家中的促销产品。哪些商家哪款产...

两款半月湾 HMBcloud 春节88折日本和美国CN2 VPS主机套餐

春节期间我们很多朋友都在忙着吃好喝好,当然有时候也会偶然的上网看看。对于我们站长用户来说,基本上需要等到初八之后才会开工,现在有空就看看是否有商家的促销。这里看到来自HMBcloud半月湾服务商有提供两款春节机房方案的VPS主机88折促销活动,分别是来自洛杉矶CN2 GIA和日本CN2的方案。八八折优惠码:CNY-GIA第一、洛杉矶CN2 GIA美国原生IP地址、72小时退款保障、三网回程CN2 ...

HaBangNet(6.95美元/月)美国vps 5TB流量/德国vps 香港双向CN2 GIA VPS

HaBangNet支持支付宝和微信支付,只是价格偏贵,之前国内用户并不多。这次HaBangNet推出三个特价套餐,其中美国机房和德国机房价格也还可以,但是香港机房虽然是双向CN2 GIA线路,但是还是贵的惊人,需要美国和德国机房的可以参考下。HaBangNet是一家成立于2014年的香港IDC商家,中文译名:哈邦网络公司,主营中国香港、新加坡、澳大利亚、荷兰、美国、德国机房的虚拟主机、vps、专用...

linux内存管理为你推荐
注册域名注册域名有什么用?虚拟主机价格谁知道虚拟主机的价格?美国vps服务器美国VPS和美国服务器速度快吗注册国际域名哪里的国际域名注册便宜?网站空间价格我想自己弄个小网站,但我不会懂域名和买空间价格,便宜一点的一共要多少钱?虚拟主机评测麻烦看一下这些虚拟主机商那个好?成都虚拟主机一个虚拟主机最多支持几个子目录呢?一个百度推广账户是不是只能推广一个主域名下的网站?新加坡虚拟主机新加坡虚拟主机无法访问,Godaddy回邮件说是域名的问题?中文域名中文域名有哪写类型?域名交易域名如何买卖??
美国免费虚拟主机 长沙服务器租用 重庆vps租用 lamp安装 瓦工 紫田 gateone 华为云主机 美国php空间 512m内存 谁的qq空间最好看 服务器硬件防火墙 个人免费主页 512mb 什么是web服务器 睿云 删除域名 达拉斯 dbank 瓦工招聘 更多