linux内核内存分配

1 kmalloc和 vmalloc

  都是以字节为单位分配内存

  kmalloc分配的内存都是位于3GB~high memory之间,这段内核空间与物理内存一一映射,即差为一固定值,vmalloc  分配的内存空间在VMALLOC_START~4GB之间,虚拟地址上连续物理地址上不一定连续.

  一般情况下,只有硬件设备才需要物理地址连续的内存,因为硬件设备往往存在于MMU之外,不了解虚拟内存,但为了性能上的考虑,内核中一般使用kmalloc只有需要获得较大的内存时用vmalloc(kamalloc分配内存小于128kb),例如模块被动态加载到内核当中时,就把模块装载到vmalloc分配的内存上。

  使用kmalloc需使用GFP_标识,kmalloc会通过__get_free_pages进行,类型如下

      GFP_KERNEL 用于进程上下文,内存不足时可以睡眠,等待空闲页的出现。

      GFP_ATOMIC 用于不可以睡眠进程的上下文,如中断,或软中断

      GFP_DMA从ZONE_DMA进行分配,常和第一二个标识一起使用。

      GFP_USER为用户空间分配内存,可能睡眠

      GFP_HIGHUSER首先试图从ZONE_HIGHMEM分配,若分配不到,尝试从ZONE_NORMAL和ZONE_DMA分配

      GFP_NOIO类同于GFP_KERNEL但在试图获取内存时不允许进行任何I/O操作

      GFP_NOFS类同于GFP_KERNEL,但在试图获取内存时不允许进行文件系统调用

      GFP_NOWAIT分配过程不会睡眠。

     标示符在linux/gfp.h

2 按页分配

  get_zeroed_page(unsigned int flags);

  __get_free_page(unsigned int flags);

  __get_free_pages(unsigned int flags,ubsigned int order);

释放页void free_page(unsigned long addr);

           void free_pages(unsigned long addr,unsigned long order);



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章