PUBLIC void kernelCreateProcess(const char* processName) { asm("cli"); //将用户进程文件放入内存适当位置 int fd = kernelOpenFile(0, processName, DEV_OM_READ); char* buf = (char*)USER_PROCESS_POS;//将用户程序拷到0x800000处 kernelFileRead(fd, buf, BS); //移动用户程序到指定位置 u16 e_phnum = *((u16*)(buf + 44)); u32 e_phoff = *((u32*)(buf + 28)); char* phoff_pos = (char*)USER_PROCESS_POS + e_phoff; //根据elf的数据,将各段移动到内存中的正确位置 int i = 0; for(i = 0; i < e_phnum; i++) { if(*((u32*)(phoff_pos)) == 0)//p_type == 0 continue; u32 p_filesz = *((u32*)(phoff_pos + 16)); //段在文件中的长度 u32 p_offset = *((u32*)(phoff_pos + 4)); //段的第一字节在文件中的偏移 char* poff_pos = (char*)USER_PROCESS_POS + p_offset; //段现在内存中的偏移 u32 p_vaddr = *((u32*)(phoff_pos + 8)); //段应该放在内存中的虚拟地址 memcpy((char*)p_vaddr, poff_pos, p_filesz); phoff_pos += 32; } //找到一个非法PCB(即空PCB),为其设值 for(i = 0; i < NR_PROC; i++){ if(proc_table[i].state == PROC_STATE_ILLEGAL) break; } proc_table[i].state = PROC_STATE_READY; asm("sti"); }
static PyObject* kernelFileIO(PyObject *self, PyObject *args) { char read_value[READ_BUFFER_LENGTH]; char *value = NULL; char *path; int rc; // Parse path and optional value: if(!(PyArg_ParseTuple(args, "s|s", &path, &value))) { Py_INCREF(Py_None); return Py_None; } if (value) { // value is not a NULL pointer, meaning a value was passed in rc = kernelFileWrite(path, value); if (rc) return Py_BuildValue("i", rc); // Got error code, return it return Py_BuildValue("s", value); } rc = kernelFileRead(path, read_value, READ_BUFFER_LENGTH); if (rc) return Py_BuildValue("i", rc); return Py_BuildValue("s", read_value); }