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

Method executeProcess

lab8/src/7/src/kernel/program.cpp:201–242  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

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

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