コード例 #1
0
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");
}
コード例 #2
0
ファイル: sysfs.c プロジェクト: Omtar/PyBBIO
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);
}