4 #include "ProcessMan.h"
9 BYTE ThreadMan::buf[sizeof(ThreadMan)];
12 Thread::Thread(Process *p, DWORD tid, DWORD eip)
15 DWORD gdtsize = 0x400, idtsize = 0x800;
16 dtbuf.reset((BYTE *)MemMan::Inst().malloc(true, false, p->getpid()));
18 DWORD dtva = p->VirtualAlloc(0xc0000000, true, (DWORD)dtbuf.get());
20 dt.init((DWORD)dtbuf.get(), ((DWORD)dtbuf.get()) + gdtsize
21 , gdtsize - 1, idtsize - 1);
23 TSS32 *tsslist = (TSS32 *)(((DWORD)dtbuf.get()) + gdtsize + idtsize);
24 tss.reset(&tsslist[0], placementdeleter());
25 systss.reset(&tsslist[1], placementdeleter());
26 memset(tss.get(), 0, sizeof(TSS32));
27 memset(systss.get(), 0, sizeof(TSS32));
29 debugprint("systss:%p\n", systss.get());
31 dt.init_app_gdtidt(tss.get(), systss.get());
34 //
\83X
\83^
\83b
\83N
\97Ì
\88æ
\82Æ
\82µ
\82Ä1MB
\83\8a\83U
\81[
\83u
35 DWORD esp = p->VirtualAlloc(0xf00000, false, 0, false, 0x100);
36 p->VirtualAlloc(esp, false, 0, false, 2, false, true);
39 tss->iomap = 0x40000000;
40 tss->fs = tss->ds = tss->es = tss->gs = tss->ss = 1 << 3;
43 //tss->cr3 = p->getcr3();
44 tss->cr3 = SYSTEM_PAGE_DIRECTORY_PHY;
45 tss->eflags = 0x00000202;
46 tss->eax = tss->ecx = tss->edx = tss->edi = tss->esi = tss->ebp = tss->ebx = 0;
49 tss->ecx = p->getcr3();
52 systss->iomap = 0x40000000;
53 systss->cr3 = SYSTEM_PAGE_DIRECTORY_PHY;
60 void Thread::seteip(DWORD eip){
64 void Thread::SwitchThread(){
65 store_cr3(p->getcr3());
71 void ThreadMan::Init(void)
73 new ((void *)buf) ThreadMan();
76 ThreadMan::ThreadMan(void)
84 ThreadMan::~ThreadMan(void)
88 Thread *ThreadMan::CreateThread(Process *p, DWORD eip){
89 Thread t(p, curtid++, eip);
91 return thlist[thlist.GetCount() - 1];
94 void ThreadMan::SwitchThread(){
96 if(thlist.GetCount() < 1){
99 Thread *t = thlist[0];