初始化GDT 和 IDT
void Init_GDT_IDT(void)
{
struct SEGMENT_DESCRIPTOR *pGDT_Add =
(struct SEGMENT_DESCRIPTOR *) 0x00270000;
struct GATE_DESCRIPTOR *pIDT_Add =
(struct GATE_DESCRIPTOR *) 0x0026f800;
int i;
for(i = 0; i < 8192; i++)
{
SetSegmDesc(pGDT_Add+i , 0, 0, 0);
}
for(i = 0; i < 8192; i++)
{
SetGateDesxc(pIDT_Add+i , 0, 0, 0);
}
SetSegmDesc(pGDT_Add+1 , 0xffffffff, 0x00000000, 0x4092);
SetSegmDesc(pGDT_Add+2 , 0x0007ffff, 0x00280000, 0x409a,);
load_gdtr(0xffff, 0x00270000);
load_idtr(0x7ff, 0x0026f800);
return ;
}
设置段描述符
void SetSegmDesc(struct SEGMENT_DESCRIPTOR *pSd,
unsigned int unLimit, int nBase, int nAccessRight)
{
if(unLimit > 0xfffff)
{
nAccessRight |= 0x8000;
unLimit /= 0x1000;
}
pSd->sLimitLow = unLimit & 0xffff;
pSd->sBaseLow = nBase & 0Xffff;
pSd->cBaseMid = (nBase >> 16) & 0xff;
pSd->cAccessRight = nAccessRight & 0xff;
pSd->cLimitHigh =
((unLimit >> 16) & 0x0f) | ((nAccessRight >> 8) & 0xf0);
pSd->cBaseHigh = (nBase >> 24) & 0xff;
return;
}
设置门描述符
void SetGateDesxc(struct GATE_DESCRIPTOR *pGd, int nOffest,
int nSelector, int nAccessRight)
{
pGd->sOffsetLow = nOffest & 0xffff;
pGd->sSelector = nSelector;
pGd->cDwCount = (nAccessRight >> 8) & 0xff;
pGd->cAccessRight = nAccessRight & 0xff;
pGd->sOffsetHigh = (nOffest >> 16) & 0xffff;
return;
}