| 19 | } |
| 20 | |
| 21 | void ProgramManager::initialize() |
| 22 | { |
| 23 | allPrograms.initialize(); |
| 24 | readyPrograms.initialize(); |
| 25 | running = nullptr; |
| 26 | |
| 27 | for (int i = 0; i < MAX_PROGRAM_AMOUNT; ++i) |
| 28 | { |
| 29 | PCB_SET_STATUS[i] = false; |
| 30 | } |
| 31 | |
| 32 | // 初始化用户代码段、数据段和栈段 |
| 33 | int selector; |
| 34 | |
| 35 | selector = asm_add_global_descriptor(USER_CODE_LOW, USER_CODE_HIGH); |
| 36 | USER_CODE_SELECTOR = (selector << 3) | 0x3; |
| 37 | |
| 38 | selector = asm_add_global_descriptor(USER_DATA_LOW, USER_DATA_HIGH); |
| 39 | USER_DATA_SELECTOR = (selector << 3) | 0x3; |
| 40 | |
| 41 | selector = asm_add_global_descriptor(USER_STACK_LOW, USER_STACK_HIGH); |
| 42 | USER_STACK_SELECTOR = (selector << 3) | 0x3; |
| 43 | |
| 44 | initializeTSS(); |
| 45 | } |
| 46 | |
| 47 | int ProgramManager::executeThread(ThreadFunction function, void *parameter, const char *name, int priority) |
| 48 | { |
no outgoing calls
no test coverage detected