| 107 | } |
| 108 | |
| 109 | void MemoryManager::openPageMechanism() |
| 110 | { |
| 111 | // 页目录表指针 |
| 112 | int *directory = (int *)PAGE_DIRECTORY; |
| 113 | //线性地址0~4MB对应的页表 |
| 114 | int *page = (int *)(PAGE_DIRECTORY + PAGE_SIZE); |
| 115 | |
| 116 | // 初始化页目录表 |
| 117 | memset(directory, 0, PAGE_SIZE); |
| 118 | // 初始化线性地址0~4MB对应的页表 |
| 119 | memset(page, 0, PAGE_SIZE); |
| 120 | |
| 121 | int address = 0; |
| 122 | // 将线性地址0~1MB恒等映射到物理地址0~1MB |
| 123 | for (int i = 0; i < 256; ++i) |
| 124 | { |
| 125 | // U/S = 1, R/W = 1, P = 1 |
| 126 | page[i] = address | 0x7; |
| 127 | address += PAGE_SIZE; |
| 128 | } |
| 129 | |
| 130 | // 初始化页目录项 |
| 131 | |
| 132 | // 0~1MB |
| 133 | directory[0] = ((int)page) | 0x07; |
| 134 | // 3GB的内核空间 |
| 135 | directory[768] = directory[0]; |
| 136 | // 最后一个页目录项指向页目录表 |
| 137 | directory[1023] = ((int)directory) | 0x7; |
| 138 | |
| 139 | // 初始化cr3,cr0,开启分页机制 |
| 140 | asm_init_page_reg(directory); |
| 141 | |
| 142 | printf("open page mechanism\n"); |
| 143 | |
| 144 | } |
no test coverage detected