MCPcopy Create free account
hub / github.com/YatSenOS/YatSenOS-Tutorial-Volume-1 / openPageMechanism

Method openPageMechanism

lab7/src/4/src/kernel/memory.cpp:109–144  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

107}
108
109void 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}

Callers 1

setup_kernelFunction · 0.45

Calls 2

printfFunction · 0.70
memsetFunction · 0.50

Tested by

no test coverage detected