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

Method executeProcess

lab8/src/6/src/kernel/program.cpp:205–246  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

203}
204
205int ProgramManager::executeProcess(const char *filename, int priority)
206{
207 bool status = interruptManager.getInterruptStatus();
208 interruptManager.disableInterrupt();
209
210 // 在线程创建的基础上初步创建进程的PCB
211 int pid = executeThread((ThreadFunction)load_process,
212 (void *)filename, filename, priority);
213 if (pid == -1)
214 {
215 interruptManager.setInterruptStatus(status);
216 return -1;
217 }
218
219 // 找到刚刚创建的PCB
220 PCB *process = ListItem2PCB(allPrograms.back(), tagInAllList);
221
222 // 创建进程的页目录表
223 process->pageDirectoryAddress = createProcessPageDirectory();
224 //printf("%x\n", process->pageDirectoryAddress);
225
226 if (!process->pageDirectoryAddress)
227 {
228 process->status = ProgramStatus::DEAD;
229 interruptManager.setInterruptStatus(status);
230 return -1;
231 }
232
233 // 创建进程的虚拟地址池
234 bool res = createUserVirtualPool(process);
235
236 if (!res)
237 {
238 process->status = ProgramStatus::DEAD;
239 interruptManager.setInterruptStatus(status);
240 return -1;
241 }
242
243 interruptManager.setInterruptStatus(status);
244
245 return pid;
246}
247
248int ProgramManager::createProcessPageDirectory()
249{

Callers 1

first_threadFunction · 0.45

Calls 4

getInterruptStatusMethod · 0.45
disableInterruptMethod · 0.45
setInterruptStatusMethod · 0.45
backMethod · 0.45

Tested by

no test coverage detected