⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 process.cpp

📁 哈工大的几个人开发的操作系统pyos的部分源码
💻 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 + -