最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

kmalloc

工作和技术 crifan 1985浏览 0评论

kmalloc

 

NAME

__get_free_pages,      get_free_page,     __get_free_page,
       __get_dma_pages, free_pages,  free_page,  kmalloc,  kfree,
       kfree_s, vmalloc, vfree - Allocate and free dynamic kernel
       memory

SYNOPSIS

<strong>#include</strong> <strong>&lt;linux/malloc.h&gt;</strong>
<strong>#include</strong> <strong>&lt;linux/mm.h&gt;</strong>
<strong>unsigned</strong> <strong>long</strong> <strong>__get_free_pages(int</strong> <strong>priority,</strong> <strong>unsigned</strong> <strong>long</strong> <strong>gfporder);</strong>
<strong>unsigned</strong> <strong>long</strong> <strong>__get_free_page(int</strong> <strong>priority);</strong>
<strong>unsigned</strong> <strong>long</strong> <strong>get_free_page(int</strong> <strong>priority);</strong>
<strong>void</strong> <strong>free_pages(unsigned</strong> <strong>long</strong> <strong>addr,</strong> <strong>unsigned</strong> <strong>long</strong> <strong>order);</strong>
<strong>void</strong> <strong>free_page(addr);</strong>
<strong>void</strong> <strong>*kmalloc</strong> <strong>(size_t</strong> <strong>size,</strong> <strong>int</strong> <strong>priority)</strong>
<strong>void</strong> <strong>kfree_s(void</strong> <strong>*</strong> <strong>obj,</strong> <strong>int</strong> <strong>size);</strong>
<strong>void</strong> <strong>kfree(void</strong> <strong>*obj);</strong>
<strong>void</strong> <strong>*</strong> <strong>vmalloc(unsigned</strong> <strong>long</strong> <strong>size);</strong>
<strong>void</strong> <strong>vfree(void</strong> <strong>*</strong> <strong>addr);</strong>

DESCRIPTION

<strong>__get_free_pages()</strong>
              allocates 2^<em>gfporder</em> consecutive  pages  in  kernel
              space.

              <em>priority</em> is one of <strong>GFP_BUFFER,</strong> <strong>GFP_ATOMIC,</strong> <strong>GFP_KER-</strong>
<strong>NEL,</strong> <strong>GFP_USER,</strong> <strong>GFP_NOBUFFER,</strong> <strong>GFP_NFS</strong> or <strong>GFP_DMA.</strong>
<strong>GFP_BUFFER</strong>
              has the lowest priority, and doesn't  try  to  free
              other  pages  if  the requested memory isn't avail-
              able.

       <strong>GFP_ATOMIC</strong>
              tries to allocate the memory immediately.  The task
              will  not  sleep  if  the  memory  isn't available.
              There is a number of reserved pages for GFP_ATOMIC.
              For  allocating  memory on interrupt this has to be
              used.

       <strong>GFP_KERNEL</strong>
              is the normal way to allocate memory in the  kernel
              space.  The reserved pages will not be used, and if
              the   memory   is   not   available    immediately,
              <em>try</em><strong>_</strong><em>to</em><strong>_</strong><em>free</em><strong>_</strong><em>page()</em> will be called.

       <strong>GFP_USER</strong>
              is currently the same as GFP_KERNEL.

       <strong>GFP_NOBUFFER</strong>
              doesn't  try  to shrink the buffer cache for memory
              allocation. This is used  in kernel for  allocating
              pages for the buffer cache.

       <strong>GFP_NFS</strong>
              is  the  same  as GFP_KERNEL, but the number of the
              reserved pages  is  lower,  so  this  will  succeed
              faster.

       <strong>GFP_DMA</strong>
              Has  no  effect in __get_free_pages(). This flag is
              only for use with kmalloc().  For DMA memory  kmal-
              loc or __get_dma_pages should be used.  Description
              of effect see __get_dma_pages().

       <strong>__get_dma_pages()</strong>
              calls repeatedly  __get_free_pages()  until   pages
              suitable for dma are found.  After success the mis-
              takenly allocated pages will be freed.  This  func-
              tion  is  necessary  because  PC DMA controlles are
              limited to 16MB.   DMA  Pages  may  not  cross  64k
              boundaries.  This  is  guaranteed by the allocation
              algorithm of __get_free_pages(). This function

       <strong>__get_free_page()</strong>
              allocates one  page.  It's  a   macro  which  calls
              __get_free_pages() with <em>gfporder</em> 0.

       <strong>get_free_page()</strong>
              Same  as  __get_free_page(),  except  the allocated
              memory is set to zero.

       <strong>free_pages()</strong>
              frees  the  memory space starting  at  addr,  which
              must  have  been  returned  by a previous  call  to
              __get_free_pages().   <em>order</em>  has  to  be  the  same
              __get_free_pages() was called with.  Note that <em>addr</em>
              is unsigned long.

       <strong>free_page()</strong>
              frees the memory page starting at <em>addr</em>, which  must
              have   been   returned   by   a  previous  call  to
              __get_free_page() or  get_free_page().   Note  that
              <em>addr</em> is unsigned long.

       <strong>kmalloc()</strong>
              allocates  <em>size</em> bytes, and returns a pointer to the
              allocated memory.  On  i386  the  following  bucket
              sizes  are  possible:  24, 56, 120, 244, 500, 1012,
              2032, 4072, 8168, 16360, 32744,  65512  and  131048
              bytes.  ( See linux/mm/kmalloc.c ) If an other size
              is kmalloc'ed  the the next  bigger  one  is  allo-
              cated. For <em>priority</em> see <strong>__get_free_pages.</strong>
<strong>kfree_s()</strong>
              frees  the  memory  object pointed to by <em>obj</em>.  <em>size</em>
              should be the size of the memory  object  or  zero.
              <em>kfree</em><strong>_</strong><em>s()</em>  determines  the  size of the object from
              the block header. If <em>size</em> is not zero  it  will  be
              checked for being correct.

       <strong>kfree()</strong>
              frees the memory object pointed to by <em>obj</em>.  It is a
              macro which calls kfree_s() with <em>size</em> zero.

       <strong>vmalloc()</strong>
              allocates <em>size</em> bytes, and returns a pointer to  the
              allocated  memory.  size  becomes  page  aligned by
              vmalloc(), so the smallest allocated amount is 4kB.
              The  allocated pages are mapped to the virtual mem-
              ory space behind the 1:1 mapped physical memory  in
              the  kernel  space.  Behind  every  vmalloc'ed area
              there is at least one  unmapped  page.  So  writing
              behind the end of a vmalloc'ed area will not result
              in a system crash, but in a segmentation  violation
              in  the kernel space.  Because memory fragmentation
              isn't a big problem for vmalloc(), vmalloc() should
              be used for huge amounts of memory.

       <strong>vfree()</strong>
              frees  the  virtual memory area pointed to by <em>addr</em>,
              which must have been allocated by a  previous  call
              to vmalloc().

RETURN VALUES

<strong>__get_free_pages(),</strong> <strong>__get_free_page()</strong>  and  <strong>get_free_page</strong>
       return on success an unsigned long which is the address of
       the start of the allocated memory, and  should normally be
       cast to a pointer. On failure zero is returned.

       <strong>kmalloc</strong> and <strong>vmalloc</strong> return a pointer to the allocated mem-
       ory on success and <strong>NULL</strong> on failure.

ERRORS

If    one    of    the    functions    __get_free_pages(),
       __get_free_page(), get_free_page(), or kmalloc() is called
       from  interrupt,  and  priority  is not GFP_ATOMIC, syslog
       will give a warning.

SOURCES

<strong>linux/mm/kmalloc.c</strong>
<strong>linux/mm/vmalloc.c</strong>
<strong>linux/mm/swap.c</strong>
<strong>linux/include/linux/mm.h</strong>
<strong>linux/include/linux/malloc.h</strong>

BUGS/LIMITAIONS

Because of memory fragmentation  it's  still  insecure  to
       allocate  areas  of many pages with kmalloc. So for  areas
       bigger than one page vmalloc() should be  used.  Only  for
       DMA kmalloc or __get_dma_pages() has to be used.

AUTHOR

Linus Torvalds

转载请注明:在路上 » kmalloc

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
79 queries in 0.169 seconds, using 22.14MB memory