Day_05初始化GDT和IDT

初始化GDT 和 IDT

//初始化GDT 和 IDT
void Init_GDT_IDT(void)
{
	//将0x00270000开始的地址 存放GDT表 0x270000-0x27ffff
	struct SEGMENT_DESCRIPTOR *pGDT_Add = 
	(struct SEGMENT_DESCRIPTOR *) 0x00270000;
	//将0x0026f800开始的地址 存放GDT表 0x26f800-0x270000
	struct GATE_DESCRIPTOR *pIDT_Add = 
	(struct GATE_DESCRIPTOR *) 0x0026f800;
	int i;

	//将GDT表全置0
	for(i = 0; i < 8192; i++)
	{
		SetSegmDesc(pGDT_Add+i , 0, 0, 0);
	}

	//将IDT表全置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)//如果先要设置G位为1 每次访问1页
	{
		nAccessRight |= 0x8000;//G = 1
		unLimit /= 0x1000;//0x1000 = 4096 = 4KB
	}

	pSd->sLimitLow = unLimit & 0xffff;//获取偏移地址的低16位
	pSd->sBaseLow = nBase & 0Xffff; //获取段基址的低16位
	pSd->cBaseMid = (nBase >> 16) & 0xff; //获取段基址的中8位
	pSd->cAccessRight = nAccessRight & 0xff;//访问权限8位
	//拓展访问权限4位 偏移地址的高4位
	pSd->cLimitHigh = 
	((unLimit >> 16) & 0x0f) | ((nAccessRight >> 8) & 0xf0);
	pSd->cBaseHigh = (nBase >> 24) & 0xff;//获得高8位

	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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值