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

Method executeProcess

lab8/src/3/src/kernel/program.cpp:199–239  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

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

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