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

还有

BGPTO独服折优惠- 日本独服65折 新加坡独服75折

BGPTO是一家成立于2017年的国人主机商,从商家背景上是国内的K总和有其他投资者共同创办的商家,主营是独立服务器业务。数据中心包括美国洛杉矶Cera、新加坡、日本大阪和香港数据中心的服务器。商家对所销售服务器产品拥有自主硬件和IP资源,支持Linux和Windows。这个月,有看到商家BGPTO日本和新加坡机房独服正进行优惠促销,折扣最低65折。第一、商家机房优惠券码这次商家的活动机房是新加坡...

妮妮云(43元/月 ) 香港 8核8G 43元/月 美国 8核8G

妮妮云的来历妮妮云是 789 陈总 张总 三方共同投资建立的网站 本着“良心 便宜 稳定”的初衷 为小白用户避免被坑妮妮云的市场定位妮妮云主要代理市场稳定速度的云服务器产品,避免新手购买云服务器的时候众多商家不知道如何选择,妮妮云就帮你选择好了产品,无需承担购买风险,不用担心出现被跑路 被诈骗的情况。妮妮云的售后保证妮妮云退款 通过于合作商的友好协商,云服务器提供2天内全额退款,超过2天不退款 物...

PacificRack 端午节再来一款年付$38 VPS主机 2核4GB内存1TB流量

这不端午节和大家一样回家休息几天,也没有照顾网站的更新。今天又出去忙一天没有时间更新,这里简单搜集看看是不是有一些商家促销活动,因为我看到电商平台各种推送活动今天又开始一波,所以说现在的各种促销让人真的很累。比如在前面我们也有看到PacificRack 商家发布过年中活动,这不在端午节(昨天)又发布一款闪购活动,有些朋友姑且较多是端午节活动,刚才有看到活动还在的,如果有需要的朋友可以看看。第一、端...

linux内存管理为你推荐
域名价格为什么很多网站域名价格差别很大,价格贵贱有什么关系啊域名空间代理哪里的域名空间商比较好?已备案域名查询怎样知道一个网站是不是真的已经备案?me域名.me域名和com的价值对比,懂的告诉我呀php虚拟空间怎样修改php虚拟空间单个文件上传大小限制免费网站空间那里有免费网站空间免费网站空间申请申请免费空间的网站1g虚拟主机打算买个1G的虚拟主机,用来做什么好?沈阳虚拟主机网站慢想要换一个沈阳的双线机房免费域名有哪些免费域名
免费虚拟空间 政务和公益机构域名注册管理中心 东莞服务器租用 合租服务器 greengeeks 网络星期一 debian6 美国php空间 免费静态空间 警告本网站 hnyd 美国十次啦服务器 圣诞促销 申请个人网站 网站cdn加速 ntfs格式分区 太原网通测速平台 免费dns解析 idc查询 卡巴斯基是免费的吗 更多