Day_05初始化GDT和IDT

这段代码展示了初始化全局描述表(GDT)和中断描述表(IDT)的过程。GDT和IDT是x86架构中用于管理和控制内存段及中断处理的关键数据结构。程序首先清空了GDT和IDT的所有条目,然后设置了两个特定的段描述符和门描述符,最后加载了GDT和IDT寄存器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

初始化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;
}
GDT(全局描述符IDT(中断描述符)是操作系统中用于管理内存中断的重要数据结构。 GDT是一个,用于存储所有内存段的描述符,描述符包含了段的基地址、段的长度、访问权限等信息。在x86体系结构的保护模式下,所有的内存访问都必须通过段寄存器来实现。当CPU执行一条访存指令时,它会把段寄存器的值当做段描述符的索引,在GDT中找到对应的描述符,从而确定要访问的内存地址的范围访问权限。因此,初始化GDT是操作系统启动时的必要步骤。 IDT是另一个,用于存储所有中断异常处理程序的描述符。当CPU收到一个中断请求或异常时,它会从IDT中找到对应的描述符,从而确定要执行的中断或异常处理程序的地址。因此,初始化IDT也是操作系统启动时的必要步骤。 GDTIDT初始化大致可以分为以下几个步骤: 1.创建并填充GDTIDT项,每个项对应一个内存段或中断处理程序。 2.创建并填充GDTR(GDT寄存器)IDTR(IDT寄存器),这两个寄存器分别存储GDTIDT的地址大小信息。 3.使用LGDTLIDT指令将GDTRIDTR的值加载到CPU中,从而告诉CPU如何寻找GDTIDT。 需要注意的是,为了保证安全性,GDTIDT通常被放置在内核态的固定位置,并且只有内核态的代码才能够修改它们。此外,为了简化实现,现代操作系统通常会使用一些预定义的GDTIDT项,而不是每次都手动填充项。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值