`
suoyihen
  • 浏览: 1358831 次
文章分类
社区版块
存档分类
最新评论

linux 共享内存映射原理 vmalloc kmalloc getfreepage

 
阅读更多

Linux提供了复杂的存储管理系统,使得进程所能访问的内存达到4GB

进程的4GB内存空间被人为的分为两个部分--用户空间与内核空间。用户空间地址分布从0到3GB(PAGE_OFFSET,在0x86中它等于0xC0000000),3GB到4GB为内核空间

内核空间中,从3G到vmalloc_start这段地址是物理内存映射区域(该区域中包含了内核镜像、物理页框表mem_map等等),比如我们使用 的VMware虚拟系统内存是256M,那么3G~3G+1256M这片内存就应该映射物理内存。在物理内存映射区之后,就是vmalloc区域。对于256M的系统而言,vmalloc_start位置应在3G+256M附近(在物理内存映射区与vmalloc_start期间还存在一个8M的gap 来防止跃界),vmalloc_end的位置接近4G(最后位置系统会保留一片128k大小的区域用于专用页面映射)

| 进程地址空间 |物理内存映射区| |
0 3G vmalloc startvmalloc end

kmalloc和get_free_page申请的内存位于物理内存映射区域,而且在物理上也是连续的,它们与真实的物理地址只有一个固定的偏移,因此存在较简单的转换关系,virt_to_phys()可以实现内核虚拟地址转化为物理地址:

#define __pa(x) ((unsigned long)(x)-PAGE_OFFSET)
extern inline unsigned long virt_to_phys(volatile void * address)
{
return __pa(address);
}

同理:

#define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET))
extern inline void * phys_to_virt(unsigned long address)
{
return __va(address);
}

而vmalloc申请的内存则位于vmalloc_start~vmalloc_end之间,与物理地址没有简单的转换关系,虽然在逻辑上它们也是连续的,但是在物理上它们不要求连续。

再来介绍一下这三个函数:

1、 get_free_page:

为分配页, 下列函数可用:
get_zeroed_page(unsigned int flags);
返回一个指向新页的指针并且用零填充了该页.
__get_free_page(unsigned int flags);
类似于 get_zeroed_page, 但是没有清零该页.
__get_free_pages(unsigned int flags, unsigned int order);
分配并返回一个指向一个内存区第一个字节的指针, 内存区可能是几个(物理上连续)页长但是没有清零.
flags 参数同 kmalloc 的用法相同; 常常使用 GFP_KERNEL 或者 GFP_ATOMIC, 可能带有 __GFP_DMA 标志( 给可能用在 ISA DMA 操作的内存 ) 或者 __GFP_HIGHMEM 当可能使用高端内存时. [29]order 是你在请求的或释放的页数的以 2 为底的对数(即, log2N). 例如, 如果你要一个页 order 为 0, 如果你请求 8 页就是 3. 如果 order 太大(没有那个大小的连续区可用), 页分配失败. get_order 函数, 它使用一个整数参数, 可以用来从一个 size 中提取 order(它必须是 2 的幂)给主机平台. order 允许的最大值是 10 或者 11 (对应于 1024 或者 2048 页), 依赖于体系. 但是, 一个 order-10 的分配在除了一个刚刚启动的有很多内存的系统中成功的机会是小的.

分享到:
评论

相关推荐

    Linux内存管理之malloc、vmalloc、kmalloc

    Linux内存管理之malloc、vmalloc、kmalloc, 区别,相似之处

    kmalloc()和vmalloc()的区别

    kmalloc()和vmalloc()的区别

    linux arm的高端内存映射详解

    )描述了高端内存原理和源码注释详解,能够清楚的理解什么是高端内存,什么是vmalloc,什么是永久映射,什么是临时映射,需要注意什么,应用场合是怎样,在源码中的前龙后脉都有详细的注释和解释

    linux的VMALLOC虚拟地址空间管理

    linux内核使用vm_struct结构体表示映射的地址空间,并且被组织在链表vmlist中,同时为了快速搜索VMA中一块连续的虚拟地址空间采用了红黑树进行管理,另外根据红黑树的层次结构将红黑树的各节点信息保存在vmap_area_...

    linux 系统源码全面剖析

    共享内存 网络 Socket接口 Unix Domain Socket TUN/TAP设备原理与实现 LVS原理与实现 - 原理篇 LVS原理与实现 - 实现篇 ARP协议与邻居子系统剖析 IP协议源码分析 UDP协议源码分析 TCP源码分析 - 三次握手之 connect ...

    memory_map_kmalloc.c

    vmalloc分配的内存虚拟地址连续但物理地址不连续,所以只能在缺页异常中逐页建立映射 下面给出使用kmalloc分配内存,并在mmap函数中一次性建立映射的示例

    linux内存分配实例

    可见分配的内存的虚拟地址符合预期,__get_fre_page和kmalloc分配的内存在线性映射区,vmalloc分配的内存在非连续内存区

    LINUX设备驱动第三版_588及代码.rar

    第十五章 内存映射和DMA Linux的内存管理 mmap设备操作 执行直接I/O访问 直接内存访问 快速参考 第十六章 块设备驱动程序 注册 块设备操作 请求处理 其他一些细节 快速参考 第十七章 网络驱动程序 ...

    Linux DeviceDrivers 3rd Edition

    第十五章 内存映射和DMA 408 Linux的内存管理 408 mmap设备操作 418 执行直接I/O访问 429 直接内存访问 435 快速参考 453 第十六章 块设备驱动程序 458 注册 459 块设备操作 464 请求处理 468 其他一些...

    linux中vmalloc和相关函数的应用

    今天我写写vmalloc和相关函数的作用,可能很多童鞋知道malloc函数,但很少有人知道vmalloc函数,写出来,与大家分享。

    videobuf-vmalloc.rar_Capture

    helper functions for vmalloc video4linux capture buffers

    linux设备驱动程序

    对期望了解操作系统内部工作原理的读者来讲,《LINUX设备驱动程序(第3版)》也深入阐述了地址空间、异步事件以及I/O等方面的内容。 作者简介 作者:(美)科波特 译者:魏永明 耿岳 钟书毅 Jonahan Corbet早在1981年就...

    lx_mem_utils:获取有关 linux 内存的有用信息的 Shell 脚本

    获取有关 linux 内存的有用信息的 Shell 脚本 示例输出: root@babu-VirtualBox:~/tools# ./low_mem_dist.sh 低内存分配的分布 低总:792.711MB 低免费:108.691MB SLUB 分配的内存:89.2992MB Vmalloc 分配的...

    percpu-vm.rar_VMAlloc

    mm percpu-vm.c - vmalloc area based chunk allocation.

    ION基本概念.docx

    ION是Google的下一代内存管理器,用来支持不同的内存分配机制,如CARVOUT(PMEM),物理连续内存(kmalloc), 虚拟地址连续但物理不连续内存(vmalloc), IOMMU等。

    《Windows高级编程指南(第三版)》(含PASCAL例子)

    DIPS & -- 进入Explorer.exe进程以操作桌面项目 DIPSLib SysInfo -- 显示系统相关信息 MMFShare -- 利用内存映射共享数据 FileRev -- 利用内存映射处理文件 Counter -- 纤程例子 (后台纤程以低优先级作运算) ...

    【Linux Device Driver】(3edtion).pdf

    Linux Device Driver (3edtion)原版 1. An Introduction to Device Drivers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 The Role of the Device Driver 2 Splitting the Kernel ...

    kernel/userspace shared memory driver-开源

    mbuff.o模块和/ dev / mbuff旨在用作共享内存设备,从而可以使用vmalloc在内核中分配的内存映射到用户空间。 特别推荐用于RT-Linux任务/用户空间通信。

Global site tag (gtag.js) - Google Analytics