linux 共享内存映射原理 vmalloc kmalloc getfreepage
来源:互联网 发布:网络语言暴力调查问卷 编辑:程序博客网 时间:2024/05/15 07:50
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 start vmalloc 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 共享内存映射原理1 vmalloc kmalloc getfreepage
- linux 共享内存映射原理 vmalloc kmalloc getfreepage
- Linux内存管理 -- malloc,kmalloc,vmalloc区别
- LINUX内核内存管理kmalloc,vmalloc
- Linux内存管理之vmalloc和kmalloc
- linux内存管理之malloc、vmalloc、kmalloc的区别
- linux内存管理之malloc、vmalloc、kmalloc的区别
- linux内存管理——kmalloc和vmalloc
- kmalloc()、kzalloc()、vmalloc() 内存申请
- linux中kmalloc()与vmalloc()
- linux中kmalloc()与vmalloc()
- linux kmalloc与vmalloc区别
- kmalloc, vmalloc分配的内存结构
- vmalloc,kmalloc,get_free_page,kmem_cache_create分配内存实例
- [转]kmalloc, vmalloc分配的内存结构
- kmalloc, vmalloc分配的内存结构
- [转]kmalloc, vmalloc分配的内存结构
- kmalloc, vmalloc分配的内存结构
- VC++动态链接库(DLL)编程(关键知识点)
- Apache性能优化的25个技巧
- SurfaceView和View最本质的区别
- Java代码不允许使用中文
- Cookie
- linux 共享内存映射原理 vmalloc kmalloc getfreepage
- 异常的错误使用导致性能问题
- android读取xml的三种方法,dom,sax和pull
- hdu pie(二分+贪心)
- 在sql server 中复制表结构?
- jos_installed_app tables
- C# 计算中文汉字笔画数
- 项目实训总结
- 伟大的灵魂