paging.h
上传用户:qddsws
上传日期:2022-06-22
资源大小:723k
文件大小:3k
源码类别:

操作系统开发

开发平台:

C/C++

  1. #ifndef PAGING_H
  2. #define PAGING_H
  3. #include <i386/extern.h>
  4. #include <lib/string.h>
  5. #include <list.h>
  6. #define PAGE_SIZE 4096
  7. /*------------------------
  8.  * PHYSICAL ALLOCATOR
  9.  * -----------------------*/
  10. #define PAGE_ALIGN(addr)        ( (addr)&0xfffff000)
  11. #define PAGE_ALIGN_UP(addr)     (((addr)&0xfffff000) + PAGE_SIZE)
  12. #define TEMP_MAP_16_20M 0xFF000000 /* Pre mapping to physical stack pages */ 
  13. #define PHYS_16M 0x1000000 /* 16 Mb */
  14. #define PRE_OFFSET ((unsigned long)TEMP_MAP_16_20M-PHYS_16M) 
  15. #define PRE_PHYSTOVIRT(phys) ((unsigned long)phys+PRE_OFFSET)  /*Phy to virt*/
  16. #define PRE_VIRTTOPHYS(virt) ((unsigned long)(unsigned long)virt-PRE_OFFSET)
  17. /* Given a virtual address return the index of the page directory array */
  18. #define VIRT_TO_PDE(virt) ((int)((virt/(PAGE_SIZE*1024))))
  19. /* Return the index for the page table entry */
  20. #define VIRT_TO_PTE(virt) ((int)((virt >> 12)& 1023))
  21. #define VIRT_KERNEL_BASE 0xC0000000
  22. #define VIRT_PHYS_STACK_BASE 0xFF000000
  23. #define VIRT_VIDEO 0xD0800000
  24. #define VIRT_TEMP_MAP 0xFE000000
  25. #define VIRT_PTE_BASE 0xFFC00000
  26. /* Given a number of PDE returns the virtual base */ 
  27. #define VIRT_PTE(number) ((unsigned long)VIRT_PTE_BASE+(number*PAGE_SIZE))
  28. /* Given an address return where is the virtual address for PDE */
  29. #define VIRT_TO_PTE_VIRT(addr) ((unsigned long)VIRT_PTE(VIRT_TO_PDE(addr)))
  30. #define MEMLIMIT 0x100000000 /* 4Gb Mark */
  31. /* The page directory is always mapped to last virtual address 
  32.  * at the last PDE
  33.  */
  34. #define PHYS_PAGE_DIRECTORY ((unsigned long)PAGE_ALIGN(*(unsigned long*)(MEMLIMIT-sizeof(unsigned long))))
  35. #define VIRT_PAGE_DIRECTORY ((unsigned long*)(VIRT_PTE(1023)))
  36. /* Stack functions */
  37. void init_stack_up();
  38. void push_up_phys (unsigned long address) ;
  39. unsigned long pop_up_phys () ;
  40. /* Paging */
  41. void initialize_paging(int availmem);
  42. void fill_page_table (unsigned long* page_table, unsigned long base_physical_address, int number_of_pages, int attributes);
  43. void empty_page_table (unsigned long* page_table);
  44. void set_page_table_entry (unsigned long* page_table, int PTE_number,unsigned long phys_addr, int attributes);
  45. unsigned long get_temp_page_table ();
  46. unsigned long get_page_table ();
  47. void allocate_page(unsigned long virtualbase);
  48. void allocate_pages(unsigned long virtualbase, int pages);
  49. void deallocate_page(unsigned long virtualbase);
  50. void deallocate_pages(unsigned long virtualbase, int pages);
  51. /*---------------------------
  52.  *  DYNAMIC ALLOCATOR
  53.  *---------------------------*/
  54. typedef struct {
  55.    int freebytes;
  56. unsigned long base;
  57. unsigned long next;
  58. } free_list; 
  59. struct heap_member{
  60. struct list_node_head list;
  61. unsigned long size;
  62. unsigned long base;
  63. };
  64. typedef struct {
  65. unsigned long heap_top;
  66. struct heap_member *freelist;
  67. struct heap_member *usedlist;
  68. unsigned long maxfreechunk;
  69. free_list* freelisthead;
  70. free_list* freelistact;
  71. } heap_struct;
  72. #define KERNEL_HEAP_START 0xE0000000
  73. void initialize_dynamic_allocator();
  74. unsigned long kmalloc(int bytes);
  75. void kfree(unsigned long base) ;
  76. struct list_node_head* get_free_heap_base (int bytes);
  77. unsigned long morecore(int bytes);
  78. #endif