modutil.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:2k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*  arch/x86_64/mm/modutil.c
  2.  *
  3.  *  Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
  4.  *  Based upon code written by Linus Torvalds and others.
  5.  * 
  6.  *  Blatantly copied from sparc64 for x86-64 by Andi Kleen. 
  7.  *  Should use direct mapping with 2MB pages. This would need extension
  8.  *  of the kernel mapping.
  9.  */
  10.  
  11. #include <linux/slab.h>
  12. #include <linux/vmalloc.h>
  13. #include <asm/uaccess.h>
  14. #include <asm/system.h>
  15. static struct vm_struct * modvmlist = NULL;
  16. void module_unmap (void * addr)
  17. {
  18. struct vm_struct **p, *tmp;
  19. if (!addr)
  20. return;
  21. if ((PAGE_SIZE-1) & (unsigned long) addr) {
  22. printk("Trying to unmap module with bad address (%p)n", addr);
  23. return;
  24. }
  25. for (p = &modvmlist ; (tmp = *p) ; p = &tmp->next) {
  26. if (tmp->addr == addr) {
  27. *p = tmp->next;
  28. vmfree_area_pages(VMALLOC_VMADDR(tmp->addr), tmp->size);
  29. kfree(tmp);
  30. return;
  31. }
  32. }
  33. printk("Trying to unmap nonexistent module vm area (%p)n", addr);
  34. }
  35. void * module_map (unsigned long size)
  36. {
  37. void * addr;
  38. struct vm_struct **p, *tmp, *area;
  39. size = PAGE_ALIGN(size);
  40. if (!size || size > MODULES_LEN) return NULL;
  41. addr = (void *) MODULES_VADDR;
  42. for (p = &modvmlist; (tmp = *p) ; p = &tmp->next) {
  43. if (size + (unsigned long) addr < (unsigned long) tmp->addr)
  44. break;
  45. addr = (void *) (tmp->size + (unsigned long) tmp->addr);
  46. }
  47. if ((unsigned long) addr + size >= MODULES_END) return NULL;
  48. area = (struct vm_struct *) kmalloc(sizeof(*area), GFP_KERNEL);
  49. if (!area) return NULL;
  50. area->size = size + PAGE_SIZE;
  51. area->addr = addr;
  52. area->next = *p;
  53. *p = area;
  54. if (vmalloc_area_pages(VMALLOC_VMADDR(addr), size, GFP_KERNEL, PAGE_KERNEL)) {
  55. module_unmap(addr);
  56. return NULL;
  57. }
  58. return addr;
  59. }