📄 main.c~
字号:
#include "include/main.h"
//主函数,初始化各个内核任务
void Main()
{
PROCESS *pProc;
PROCESS *next;
t_8 Priority=15;
t_16 SelectorLDT=SELECTOR_LDT_FIRST;
t_8 privilege;
t_8 rpl;
int eflags;
int i;
printk("***************main***********************\n");
/*初始化内存管理*/
//initMem();
/*初始化进程结构体分配器*/
initProcStruct();
//ideInit();
//initFS();
initTTY();
initClock();
SetIrqHandler(0,ClockHandler);
SetIrqHandler(1,keyboardHandler);
SetIrqHandler(14,harddiskHandler);
pProc=(PROCESS *)kmalloc();
privilege = PRIVILEGE_USER;
rpl = RPL_USER;
eflags = 0x202;
pProc->state= READY;
pProc->TTYNum=1;
pProc->InitPriority=pProc->Priority=15;
pProc->Pid=2;//进程ID
pProc->LDTSelector=SelectorLDT;//局部描述符选择子
//复制GDT中的代码段和数据段到LDT中
MemoryCopy(&pProc->LDT[0],&gdt[SELECTOR_FLAT_C>>3],sizeof(DESCRIPTOR));
pProc->LDT[0].Attribute1=DA_C|privilege<<5;
MemoryCopy(&pProc->LDT[1],&gdt[SELECTOR_FLAT_RW>>3],sizeof(DESCRIPTOR));
pProc->LDT[1].Attribute1=DA_DRW|privilege<<5;
//设置各个段寄存器选择子和属性
pProc->Regs.cs=((8*0)&SA_RPL_MASK&SA_TI_MASK)|SA_TIL|rpl;
pProc->Regs.ds=((8*1)&SA_RPL_MASK&SA_TI_MASK)|SA_TIL|rpl;
pProc->Regs.es=((8*1)&SA_RPL_MASK&SA_TI_MASK)|SA_TIL|rpl;
pProc->Regs.fs=((8*1)&SA_RPL_MASK&SA_TI_MASK)|SA_TIL|rpl;
pProc->Regs.ss=((8*1)&SA_RPL_MASK&SA_TI_MASK)|SA_TIL|rpl;
pProc->Regs.gs=(SELECTOR_VIDEO&SA_RPL_MASK)|rpl;
pProc->Regs.eip=(t_32)TestB;//任务入口点
pProc->Regs.esp =(t_32)memAlloc(1024);;//任务堆栈
pProc->Regs.eflags=eflags;//标志位
pProc->ReturnValue=0;
//设置GDT中的LDT段
SetDescriptor(&gdt[ SelectorLDT>>3],vir2phys(Seg2Phys(SELECTOR_FLAT_RW),pProc->LDT),
LDT_SIZE*sizeof(DESCRIPTOR),DA_LDT);
pProc->next=NULL;
pCurrentProc=NULL; /*TINIX for(i=0;i<NR_TASKS+NR_PROCS;i++){
if (i < NR_TASKS) { // 任务
p_task = task_table + i;
privilege = PRIVILEGE_TASK;
rpl = RPL_TASK;
eflags = 0x1202; // IF=1, IOPL=1, bit 2 is always 1
}
else { // 用户进程
p_task = user_proc_table + (i - NR_TASKS);
privilege = PRIVILEGE_USER;
rpl = RPL_USER;
eflags = 0x202; // IF=1, bit 2 is always 1
}
strcpy(p_proc->name, p_task->name); //name of the process
p_proc->pid = i; //pid
p_proc->ldt_sel = selector_ldt;
memcpy(&p_proc->ldts[0], &gdt[SELECTOR_KERNEL_CS >> 3], sizeof(DESCRIPTOR));
p_proc->ldts[0].attr1 = DA_C | privilege << 5; /change the DPL
memcpy(&p_proc->ldts[1], &gdt[SELECTOR_KERNEL_DS >> 3], sizeof(DESCRIPTOR));
p_proc->ldts[1].attr1 = DA_DRW | privilege << 5;//change the DPL
p_proc->regs.cs = ((8 * 0) & SA_RPL_MASK & SA_TI_MASK) | SA_TIL | rpl;
p_proc->regs.ds = ((8 * 1) & SA_RPL_MASK & SA_TI_MASK) | SA_TIL | rpl;
p_proc->regs.es = ((8 * 1) & SA_RPL_MASK & SA_TI_MASK) | SA_TIL | rpl;
p_proc->regs.fs = ((8 * 1) & SA_RPL_MASK & SA_TI_MASK) | SA_TIL | rpl;
p_proc->regs.ss = ((8 * 1) & SA_RPL_MASK & SA_TI_MASK) | SA_TIL | rpl;
p_proc->regs.gs = (SELECTOR_KERNEL_GS & SA_RPL_MASK) | rpl;
p_proc->regs.eip = (t_32)p_task->initial_eip;
p_proc->regs.esp = (t_32)p_task_stack;
p_proc->regs.eflags = eflags;
p_proc->nr_tty = 0;
p_task_stack -= p_task->stacksize;
p_proc++;
p_task++;
selector_ldt += 1 << 3;
} for(i=0;i<NR_TASKS+NR_PROCS;i++){
init_descriptor(&gdt[selector_ldt>>3],
vir2phys(seg2phys(SELECTOR_KERNEL_DS), proc_table[i].ldts),
LDT_SIZE * sizeof(DESCRIPTOR) - 1,
DA_LDT);
p_proc++;
selector_ldt += 1 << 3;
} */
ReadyProc=next=usrProc=pProc;
EnableIrq(0);
EnableIrq(1);
EnableIrq(14);
createProc((t_32)TestC);
createProc((t_32)TestD);
ReStart();//启动任务
while(1){}
}void TestD()
{
while(1)
{
Delay(1);
printk("d");
}
}
void TestA()
{
while(1)
{
Delay(1);
printk("A");
}
}
void TestC()
{
while(1)
{
// Delay(1);
getchar();
printk("C");
}
}
void TestB()
{
while(1)
{
Delay(1);
printk("e");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -