UserProcess::UserProcess(ustl::string filename, FileSystemInfo *fs_info, ProcessRegistry *process_registry, uint32 terminal_number) : Thread(fs_info, filename, Thread::USER_THREAD), fd_(VfsSyscall::open(filename, O_RDONLY)), process_registry_(process_registry) { process_registry_->processStart(); //should also be called if you fork a process if (fd_ >= 0) loader_ = new Loader(fd_); if (!loader_ || !loader_->loadExecutableAndInitProcess()) { debug(USERPROCESS, "Error: loading %s failed!\n", filename.c_str()); loader_ = 0; kill(); return; } size_t page_for_stack = PageManager::instance()->allocPPN(); loader_->arch_memory_.mapPage(USER_BREAK / PAGE_SIZE - 1, page_for_stack, 1); ArchThreads::createUserRegisters(user_registers_, loader_->getEntryFunction(), (void*) (USER_BREAK - sizeof(pointer)), getStackStartPointer()); ArchThreads::setAddressSpace(this, loader_->arch_memory_); debug(USERPROCESS, "ctor: Done loading %s\n", filename.c_str()); if (main_console->getTerminal(terminal_number)) setTerminal(main_console->getTerminal(terminal_number)); switch_to_userspace_ = 1; }
Thread::Thread(FileSystemInfo *working_dir, ustl::string name) : kernel_registers_(0), user_registers_(0), switch_to_userspace_(0), loader_(0), state_(Running), next_thread_in_lock_waiters_list_(0), lock_waiting_on_(0), holding_lock_list_(0), tid_(0), my_terminal_(0), working_dir_(working_dir), name_(name) { debug(THREAD, "Thread ctor, this is %p, stack is %p, fs_info ptr: %p\n", this, kernel_stack_, working_dir_); ArchThreads::createKernelRegisters(kernel_registers_, (void*)threadStartHack, getStackStartPointer()); kernel_stack_[2047] = STACK_CANARY; kernel_stack_[0] = STACK_CANARY; }