《操作系统》的实验代码。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

103 lines
3.2 KiB

12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
  1. #ifndef __KERN_MM_VMM_H__
  2. #define __KERN_MM_VMM_H__
  3. #include <defs.h>
  4. #include <list.h>
  5. #include <memlayout.h>
  6. #include <sync.h>
  7. //pre define
  8. struct mm_struct;
  9. // the virtual continuous memory area(vma), [vm_start, vm_end),
  10. // addr belong to a vma means vma.vm_start<= addr <vma.vm_end
  11. struct vma_struct {
  12. struct mm_struct *vm_mm; // the set of vma using the same PDT
  13. uintptr_t vm_start; // start addr of vma
  14. uintptr_t vm_end; // end addr of vma, not include the vm_end itself
  15. uint32_t vm_flags; // flags of vma
  16. list_entry_t list_link; // linear list link which sorted by start addr of vma
  17. };
  18. #define le2vma(le, member) \
  19. to_struct((le), struct vma_struct, member)
  20. #define VM_READ 0x00000001
  21. #define VM_WRITE 0x00000002
  22. #define VM_EXEC 0x00000004
  23. #define VM_STACK 0x00000008
  24. // the control struct for a set of vma using the same PDT
  25. struct mm_struct {
  26. list_entry_t mmap_list; // linear list link which sorted by start addr of vma
  27. struct vma_struct *mmap_cache; // current accessed vma, used for speed purpose
  28. pde_t *pgdir; // the PDT of these vma
  29. int map_count; // the count of these vma
  30. void *sm_priv; // the private data for swap manager
  31. int mm_count; // the number ofprocess which shared the mm
  32. lock_t mm_lock; // mutex for using dup_mmap fun to duplicat the mm
  33. };
  34. struct vma_struct *find_vma(struct mm_struct *mm, uintptr_t addr);
  35. struct vma_struct *vma_create(uintptr_t vm_start, uintptr_t vm_end, uint32_t vm_flags);
  36. void insert_vma_struct(struct mm_struct *mm, struct vma_struct *vma);
  37. struct mm_struct *mm_create(void);
  38. void mm_destroy(struct mm_struct *mm);
  39. void vmm_init(void);
  40. int mm_map(struct mm_struct *mm, uintptr_t addr, size_t len, uint32_t vm_flags,
  41. struct vma_struct **vma_store);
  42. int do_pgfault(struct mm_struct *mm, uint32_t error_code, uintptr_t addr);
  43. int mm_unmap(struct mm_struct *mm, uintptr_t addr, size_t len);
  44. int dup_mmap(struct mm_struct *to, struct mm_struct *from);
  45. void exit_mmap(struct mm_struct *mm);
  46. uintptr_t get_unmapped_area(struct mm_struct *mm, size_t len);
  47. int mm_brk(struct mm_struct *mm, uintptr_t addr, size_t len);
  48. extern volatile unsigned int pgfault_num;
  49. extern struct mm_struct *check_mm_struct;
  50. bool user_mem_check(struct mm_struct *mm, uintptr_t start, size_t len, bool write);
  51. bool copy_from_user(struct mm_struct *mm, void *dst, const void *src, size_t len, bool writable);
  52. bool copy_to_user(struct mm_struct *mm, void *dst, const void *src, size_t len);
  53. static inline int
  54. mm_count(struct mm_struct *mm) {
  55. return mm->mm_count;
  56. }
  57. static inline void
  58. set_mm_count(struct mm_struct *mm, int val) {
  59. mm->mm_count = val;
  60. }
  61. static inline int
  62. mm_count_inc(struct mm_struct *mm) {
  63. mm->mm_count += 1;
  64. return mm->mm_count;
  65. }
  66. static inline int
  67. mm_count_dec(struct mm_struct *mm) {
  68. mm->mm_count -= 1;
  69. return mm->mm_count;
  70. }
  71. static inline void
  72. lock_mm(struct mm_struct *mm) {
  73. if (mm != NULL) {
  74. lock(&(mm->mm_lock));
  75. }
  76. }
  77. static inline void
  78. unlock_mm(struct mm_struct *mm) {
  79. if (mm != NULL) {
  80. unlock(&(mm->mm_lock));
  81. }
  82. }
  83. #endif /* !__KERN_MM_VMM_H__ */