README
上传用户:wudi5211
上传日期:2010-01-21
资源大小:607k
文件大小:4k
源码类别:

嵌入式Linux

开发平台:

C/C++

  1. The allocator shown here  exploits high memory. This document explains
  2. how  a user can  deal   with drivers uses   this  allocator and how  a
  3. programmer can link in the module.
  4. User's manual
  5. =============
  6. One of the most compelling problems with any DMA-capable device is the
  7. allocation  of a suitable  memory buffer. The "allocator" module tries
  8. to deal with  the problem in  a clean way.  The module is  able to use
  9. high   memory  (above the  one   used in  normal   operation)  for DMA
  10. allocation.
  11. To prevent  the  kernel for using   high memory,  so  that it  remains
  12. available for  DMA, you should  pass a  command  line argument to  the
  13. kernel.  Command line arguments  can be passed to  Lilo, to Loadlin or
  14. to whichever loader  you are using  (unless it's very poor in design).
  15. For Lilo, either use  "append=" in  /etc/lilo.conf or add  commandline
  16. arguments to the  interactive prompt. For  example, I have a 32MB  box
  17. and reserve two megs for DMA:
  18. In lilo.conf:
  19. image = /zImage
  20. label = linux
  21. append = "mem=30M"
  22. Or, interactively:
  23. LILO: linux mem=30M
  24. Once  the kernel is booted  with the  right command-line argument, any
  25. driver  linked   with  the  allocator   module  will  be able   to get
  26. DMA-capable memory without  much  trouble (unless the  various drivers
  27. need more memory than available).
  28. The module implements an alloc/free  mechanism,  so that it can  serve
  29. multiple drivers  at the  same time. Note  however that  the allocator
  30. uses all of  high memory and assumes to  be the only piece of software
  31. using such memory.
  32. Programmer's manual
  33. ===================
  34. The allocator  can be either  linked to a  device driver or used  as a
  35. separate module. If  linked to the driver, you  must not define MODULE
  36. when compiling allocator.c, and  the driver must call allocator_init()
  37. before using  the allocator  and must call  allocator_cleanup() before
  38. unloading.   This  is  usually  done  from  within  init_module()  and
  39. cleanup_module(). If the allocator is  linked to a driver, it won't be
  40. possible for several drivers to allocate high DMA memory, as explained
  41. above.
  42. It  is  possible, on  the  other  hand, to  compile  the  module as  a
  43. standalone module, so  that several modules can rely  on the allocator
  44. for they DMA buffers. To  compile the allocator as a standalone module
  45. you need  to define  MODULE when compiling  allocator.c . This  is the
  46. default  in this  distribution, by  virtue of  the  provided Makefile.
  47. Drivers   using   a   standalone   allocator  won't   need   to   call
  48. allocator_init() nor allocator_cleanup().
  49. The allocator exports the following functions (declared in allocator.h):
  50.    unsigned long allocator_allocate_dma (unsigned long bytes,
  51.  int priority);
  52. This function returns a physical address, over high_memory,
  53. which corresponds to an area of at least "bytes" bytes.
  54. The area will be owned by the module calling the function.
  55. The returned address can be passed to device boards, to instruct
  56. their DMA controllers, via phys_to_bus(). The address can be used
  57. by C code after vremap()/ioremap(). The "priority" argument should
  58. be GFP_KERNEL or GFP_ATOMIC, according to the context of the
  59. caller; it is used to call kmalloc(), as the allocator must keep
  60. track of any region it gives away. In case of error the function
  61. returns 0, and the caller is expected to issue a -ENOMEM error.
  62.    int allocator_free_dma (unsigned long address);
  63. This function is the reverse of the previous one. If a driver
  64. doesn't free the DMA memory it allocated, the allocator will
  65. consider such memory as busy. Note, however, that
  66. allocator_cleanup() calls kfree() on every region it reclaimed,
  67. so that a driver with the allocator linked in can avoid calling
  68. allocator_free_dma() at unload time. The return value is 0
  69. or -EINVAL if the address is not handled by allocator.