📄 process.cpp
字号:
#include "process.h"
#include "system.h"
#include "interrupt.h"
// 定义进程队列,0 , 1 , 2 , 3 共 4 个进程
struct_pyos_Process class_pyos_Process::ProcessQueue[ 4 ] ;
// 定义进程所用的任务状态段
struct_pyos_TSS class_pyos_Process::TSS[ 4 ] ;
// 定义变量,用于保存当前运行的进程号
unsigned int class_pyos_Process::CurrentProcessNumber ;
// 进程初始化函数
void class_pyos_Process::Init()
{
struct_pyos_TSS* tss ;
struct_pyos_TSSItem* tssItem ;
unsigned int tssAddr ;
/* 设置当前的进程号是 0 号 */
CurrentProcessNumber = 0 ;
/* 初始化 0 号进程所用的任务段 */
tss = &class_pyos_Process::TSS[ 0 ] ;
tss->Cr3 = 0 ;
tss->Ldt = 0 ;
/* 初始化 0 号进程所用的任务段描述符 */
tssAddr = ( unsigned int )&class_pyos_Process::TSS[ 0 ] ;
tssItem = &class_pyos_System::m_gdt.TSS[ 0 ] ;
tssItem->B = 0 ;
tssItem->Base_0_15 = tssAddr ;
tssItem->Base_16_23 = tssAddr >> 16 ;
tssItem->Base_24_31 = tssAddr >> 24 ;
tssItem->DPL = 0 ;
tssItem->G = 1 ;
tssItem->LimitLength_0_15 = 103 ;
tssItem->LimitLength_16_19 = 0 ;
tssItem->P = 1 ;
tssItem->Saved_00 = 0 ;
tssItem->Saved_010 = 2 ;
tssItem->Saved_1 = 1 ;
/* 载入 0 号 进程也即当前进程的 TSS 的选择符到 TR(任务寄存器)中 */
__asm__( "movw $0x28 , %ax" ) ;
__asm__( "ltr %ax" ) ;
// 设置 1 号进程的进程队列参数
class_pyos_Process::ProcessQueue[ 1 ].CpuTime = 200 ; // 分配 1 号进程 200 个时间片
class_pyos_Process::ProcessQueue[ 1 ].TssSelector = 0x30 ;
/* 初始化 1 号进程(A进程)所用的任务段 */
tss = &class_pyos_Process::TSS[ 1 ] ;
tss->Cr3 = 0 ;
tss->Cs = 0x8 ;
tss->Ds = 0x10 ;
tss->Eax = 0 ;
tss->Ebp = 0 ;
tss->Ebx = 0 ;
tss->Ecx = 0 ;
tss->Edi = 0 ;
tss->Edx = 0 ;
tss->Eip = 0x80000 ;
tss->Es = 0x10 ;
tss->Esi = 0 ;
tss->Esp = 0x8ffff ;
tss->Fs = 0x10 ;
tss->Gs = 0x10 ;
tss->Ldt = 0 ;
tss->Ss = 0x10 ;
tss->Eflags = 0x202 ; // 指定 Eflags,其中断标志设为开中断
/* 初始化 1 号进程所用的任务段描述符 */
tssAddr = ( unsigned int )&class_pyos_Process::TSS[ 1 ] ;
tssItem = &class_pyos_System::m_gdt.TSS[ 1 ] ;
tssItem->B = 0 ;
tssItem->Base_0_15 = tssAddr ;
tssItem->Base_16_23 = tssAddr >> 16 ;
tssItem->Base_24_31 = tssAddr >> 24 ;
tssItem->DPL = 0 ;
tssItem->G = 1 ;
tssItem->LimitLength_0_15 = 103 ;
tssItem->LimitLength_16_19 = 0 ;
tssItem->P = 1 ;
tssItem->Saved_00 = 0 ;
tssItem->Saved_010 = 2 ;
tssItem->Saved_1 = 1 ;
// 设置 2 号进程的进程队列参数
class_pyos_Process::ProcessQueue[ 2 ].CpuTime = 400 ; // 分配 2 号进程 400 个时间片
class_pyos_Process::ProcessQueue[ 2 ].TssSelector = 0x38 ;
/* 初始化 2 号进程(B进程)所用的任务段 */
tss = &class_pyos_Process::TSS[ 2 ] ;
tss->Cr3 = 0 ;
tss->Cs = 0x8 ;
tss->Ds = 0x10 ;
tss->Eax = 0 ;
tss->Ebp = 0 ;
tss->Ebx = 0 ;
tss->Ecx = 0 ;
tss->Edi = 0 ;
tss->Edx = 0 ;
tss->Eip = 0x90000 ;
tss->Es = 0x10 ;
tss->Esi = 0 ;
tss->Esp = 0x9ffff ;
tss->Fs = 0x10 ;
tss->Gs = 0x10 ;
tss->Ldt = 0 ;
tss->Ss = 0x10 ;
tss->Eflags = 0x202 ;
/* 初始化 2 号进程所用的任务段描述符 */
tssAddr = ( unsigned int )&class_pyos_Process::TSS[ 2 ] ;
tssItem = &class_pyos_System::m_gdt.TSS[ 2 ] ;
tssItem->B = 0 ;
tssItem->Base_0_15 = tssAddr ;
tssItem->Base_16_23 = tssAddr >> 16 ;
tssItem->Base_24_31 = tssAddr >> 24 ;
tssItem->DPL = 0 ;
tssItem->G = 1 ;
tssItem->LimitLength_0_15 = 103 ;
tssItem->LimitLength_16_19 = 0 ;
tssItem->P = 1 ;
tssItem->Saved_00 = 0 ;
tssItem->Saved_010 = 2 ;
tssItem->Saved_1 = 1 ;
/* 初始化 3 号进程(时钟中断)所用的任务段 */
tss = &class_pyos_Process::TSS[ 3 ] ;
tss->Cr3 = 0 ;
tss->Cs = 0x8 ;
tss->Ds = 0x10 ;
tss->Eax = 0 ;
tss->Ebp = 0 ;
tss->Ebx = 0 ;
tss->Ecx = 0 ;
tss->Edi = 0 ;
tss->Edx = 0 ;
tss->Eip = ( unsigned int )pyos_asm_interrupt_handle_for_cpu_time ;
tss->Es = 0x10 ;
tss->Esi = 0 ;
tss->Esp = 0x7ffff ; // 时钟中断所用的堆栈区,(时钟中断单独使用自己的堆栈区,以免内核出现堆栈错误)
tss->Fs = 0x10 ;
tss->Gs = 0x10 ;
tss->Ldt = 0 ;
tss->Ss = 0x10 ;
tss->Eflags = 0x202 ;
/* 初始化 3 号进程所用的任务段描述符 */
tssAddr = ( unsigned int )&class_pyos_Process::TSS[ 3 ] ;
tssItem = &class_pyos_System::m_gdt.TSS[ 3 ] ;
tssItem->B = 0 ;
tssItem->Base_0_15 = tssAddr ;
tssItem->Base_16_23 = tssAddr >> 16 ;
tssItem->Base_24_31 = tssAddr >> 24 ;
tssItem->DPL = 0 ;
tssItem->G = 1 ;
tssItem->LimitLength_0_15 = 103 ;
tssItem->LimitLength_16_19 = 0 ;
tssItem->P = 1 ;
tssItem->Saved_00 = 0 ;
tssItem->Saved_010 = 2 ;
tssItem->Saved_1 = 1 ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -