Linux内核中常见内存分配函数(三) 分类: arm-linux-Ubuntu 2013-08-08 17:59 2550人阅读 评论(0) 收藏
2013-08-08 17:59
621 查看
ioremap
void * ioremap (unsigned long offset, unsigned long size)
ioremap是一种更直接的内存“分配”方式,使用时直接指定物理起始地址和需要分配内存的大小,然后将该段 物理地址映射到内核地址空间。ioremap用到的物理地址空间都是事先确定的,和上面的几种内存 分配方式并不太一样,并不是分配一段新的物理内存。
ioremap多用于设备驱动,可以让CPU直接访问外部设备的IO空间。ioremap能映射的内存由原有的物理内存空间决定,所以没有进行测试。Linux培训
Boot Memory
如果要分配大量的连续物理内存,上述的分配函数都不能满足,就只能用比较特殊的方
式,在Linux内核引导阶段来预留部分内存。
在内核引导时分配内存
void* alloc_bootmem(unsigned long size)
可以在linux内核引导过程中绕过伙伴系统来分配大块内存。使用方法是在linux内核引导时,调用mem_init函数之前 用alloc_bootmem函数申请指定大小的内存。如果需要在其他地方调用这块内存,可以将alloc_bootmem返回的内存首地址通过EXPORT_SYMBOL导 出,然后就可以使用这块内存了。这种内存分配方式的缺点是,申请内存的代码必须在链接到内核中的代码里才能使用,因此必须重新编译内核,而且内存管理系统 看不到这部分内存,需要用户自行管理。测试结果表明,重新编译内核后重启,能够访问引导时分配的内存块。
通过内核引导参数预留顶部内存
在Linux内核引导时,传入参数“mem=size”保留顶部的内存区间。比如系统有256MB内 存,参数“mem=248M”会预留顶部的8MB内存,进入系统后可以调用ioremap(0xF800000,
0x800000)来申请这段内存。
几种分配函数的比较
分配原理最大内存其他
__get_free_pages直接对页框进行操作4MB适用于分配较大量的连续物理内存
kmem_cache_alloc基于slab机制实现128KB适合需要频繁申请释放相同大小内存块时使用
kmalloc基于kmem_cache_alloc实现128KB最常见的分配方式,需要小于页框大小的内存时可以使用
vmalloc建立非连续物理内存到虚拟地址的映射物理不连续,适合需要大内存,但是对地址连续性没有要求的场合Linux培训
dma_alloc_coherent基于__alloc_pages实现4MB适用于DMA操 作
ioremap实现已知物理地址到虚拟地址的映射适用于物理地址已知的场合,如设备驱动
alloc_bootmem在启动kernel时,预留一段内存,内核看不见小于物理内存大小,内存管理要求较高
void * ioremap (unsigned long offset, unsigned long size)
ioremap是一种更直接的内存“分配”方式,使用时直接指定物理起始地址和需要分配内存的大小,然后将该段 物理地址映射到内核地址空间。ioremap用到的物理地址空间都是事先确定的,和上面的几种内存 分配方式并不太一样,并不是分配一段新的物理内存。
ioremap多用于设备驱动,可以让CPU直接访问外部设备的IO空间。ioremap能映射的内存由原有的物理内存空间决定,所以没有进行测试。Linux培训
Boot Memory
如果要分配大量的连续物理内存,上述的分配函数都不能满足,就只能用比较特殊的方
式,在Linux内核引导阶段来预留部分内存。
在内核引导时分配内存
void* alloc_bootmem(unsigned long size)
可以在linux内核引导过程中绕过伙伴系统来分配大块内存。使用方法是在linux内核引导时,调用mem_init函数之前 用alloc_bootmem函数申请指定大小的内存。如果需要在其他地方调用这块内存,可以将alloc_bootmem返回的内存首地址通过EXPORT_SYMBOL导 出,然后就可以使用这块内存了。这种内存分配方式的缺点是,申请内存的代码必须在链接到内核中的代码里才能使用,因此必须重新编译内核,而且内存管理系统 看不到这部分内存,需要用户自行管理。测试结果表明,重新编译内核后重启,能够访问引导时分配的内存块。
通过内核引导参数预留顶部内存
在Linux内核引导时,传入参数“mem=size”保留顶部的内存区间。比如系统有256MB内 存,参数“mem=248M”会预留顶部的8MB内存,进入系统后可以调用ioremap(0xF800000,
0x800000)来申请这段内存。
几种分配函数的比较
分配原理最大内存其他
__get_free_pages直接对页框进行操作4MB适用于分配较大量的连续物理内存
kmem_cache_alloc基于slab机制实现128KB适合需要频繁申请释放相同大小内存块时使用
kmalloc基于kmem_cache_alloc实现128KB最常见的分配方式,需要小于页框大小的内存时可以使用
vmalloc建立非连续物理内存到虚拟地址的映射物理不连续,适合需要大内存,但是对地址连续性没有要求的场合Linux培训
dma_alloc_coherent基于__alloc_pages实现4MB适用于DMA操 作
ioremap实现已知物理地址到虚拟地址的映射适用于物理地址已知的场合,如设备驱动
alloc_bootmem在启动kernel时,预留一段内存,内核看不见小于物理内存大小,内存管理要求较高
相关文章推荐
- Linux内核中常见内存分配函数(一) 分类: arm-linux-Ubuntu 2013-08-08 17:57 582人阅读 评论(0) 收藏
- Linux内核中常见内存分配函数(二) 分类: arm-linux-Ubuntu 2013-08-08 17:58 723人阅读 评论(0) 收藏
- linux下的framebuffer显示图片 分类: arm-linux-Ubuntu 2013-08-12 15:43 506人阅读 评论(0) 收藏
- linux下insmod lsmod rmmod 分类: arm-linux-Ubuntu 2015-05-08 11:51 277人阅读 评论(0) 收藏
- V4L2驱动的移植与应用(三) 分类: arm-linux-Ubuntu 2013-08-16 08:41 473人阅读 评论(0) 收藏
- Linux常用软件 分类: arm-linux-Ubuntu 2013-07-22 16:28 301人阅读 评论(0) 收藏
- Ubuntu 11.04 NFS 配置 分类: arm-linux-Ubuntu 2013-07-22 16:29 326人阅读 评论(0) 收藏
- Ubuntu 11.10下GRUB 2 1.99版编译安装笔记 分类: arm-linux-Ubuntu 2013-07-22 16:29 336人阅读 评论(0) 收藏
- JFFS2 文件系统及新特性介绍 分类: arm-linux-Ubuntu 2013-07-22 16:30 269人阅读 评论(0) 收藏
- Ubuntu 上 hi3531 交叉编译环境 arm-hisiv100nptl-linux 搭建过程 分类: HI3531 arm-linux-Ubuntu 2014-06-18 08:44 807人阅读 评论(0) 收藏
- u盘安装ubuntu10.04 server.txt 分类: arm-linux-Ubuntu 2013-09-11 14:10 882人阅读 评论(1) 收藏
- Linux开机启动图片修改 分类: arm-linux-Ubuntu TI-AM335X 2015-06-19 16:12 390人阅读 评论(0) 收藏
- LINUX下printf输出字体的特效 分类: arm-linux-Ubuntu 2014-02-17 11:56 623人阅读 评论(0) 收藏
- linux 之 getopt_long() 分类: arm-linux-Ubuntu 2013-07-30 09:33 594人阅读 评论(0) 收藏
- Linux系统信息查看命令大全 分类: arm-linux-Ubuntu 2013-07-22 16:28 302人阅读 评论(0) 收藏
- AHB/APB简介 分类: arm-linux-Ubuntu 2013-07-22 16:30 335人阅读 评论(0) 收藏
- 基于Linux系统的病毒 分类: arm-linux-Ubuntu 2014-06-18 17:48 463人阅读 评论(0) 收藏
- 视频播放的基本原理 分类: arm-linux-Ubuntu 2015-03-20 11:58 419人阅读 评论(0) 收藏
- linux 之 popen函数 分类: arm-linux-Ubuntu 2013-07-30 09:56 642人阅读 评论(0) 收藏
- hi3531 SDK 编译 kernel, 修改 参数 分类: arm-linux-Ubuntu HI3531 2014-05-07 11:23 1120人阅读 评论(0) 收藏