中断之中断向量表IDT的初始化_对中断向量表进行初始化-程序员宅基地

技术标签: struct  system  Linux内核之中断/异常/系统调用  x86  vector  signal  table  

中断的初始化是在哪里完成的呢?是在start_kernel()中:

512	trap_init();

535    /* init some links before init_ISA_irqs() */
536    early_irq_init();
537    init_IRQ(); //最终调用native_init_IRQ,由它来完成主要工作。



中断向量表的初始化分为两个部分:

(1)对0~19号和0x80号系统保留中断向量的初始化,在trap_init中完成

(2)对其它中断向量的初始化,在init_IRQ中完成。

我们首先来看对系统保留中断向量的初始化,这部分的初始化工作实在trap_init中完成的:

void __init trap_init(void)
{
	int i;

#ifdef CONFIG_EISA
	void __iomem *p = early_ioremap(0x0FFFD9, 4);

	if (readl(p) == 'E' + ('I'<<8) + ('S'<<16) + ('A'<<24))
		EISA_bus = 1;
	early_iounmap(p, 4);
#endif

	set_intr_gate(0, ÷_error);
	set_intr_gate_ist(2, &nmi, NMI_STACK);
	/* int4 can be called from all */
	set_system_intr_gate(4, &overflow);
	set_intr_gate(5, &bounds);
	set_intr_gate(6, &invalid_op);
	set_intr_gate(7, &device_not_available);
#ifdef CONFIG_X86_32
	set_task_gate(8, GDT_ENTRY_DOUBLEFAULT_TSS);
#else
	set_intr_gate_ist(8, &double_fault, DOUBLEFAULT_STACK);
#endif
	set_intr_gate(9, &coprocessor_segment_overrun);
	set_intr_gate(10, &invalid_TSS);
	set_intr_gate(11, &segment_not_present);
	set_intr_gate_ist(12, &stack_segment, STACKFAULT_STACK);
	set_intr_gate(13, &general_protection);
	set_intr_gate(15, &spurious_interrupt_bug);
	set_intr_gate(16, &coprocessor_error);
	set_intr_gate(17, &alignment_check);
#ifdef CONFIG_X86_MCE
	set_intr_gate_ist(18, &machine_check, MCE_STACK);
#endif
	set_intr_gate(19, &simd_coprocessor_error);

	/* Reserve all the builtin and the syscall vector: */
	for (i = 0; i < FIRST_EXTERNAL_VECTOR; i++)
		set_bit(i, used_vectors);

#ifdef CONFIG_IA32_EMULATION
	set_system_intr_gate(IA32_SYSCALL_VECTOR, ia32_syscall);
	set_bit(IA32_SYSCALL_VECTOR, used_vectors);
#endif

#ifdef CONFIG_X86_32
	set_system_trap_gate(SYSCALL_VECTOR, &system_call);
	set_bit(SYSCALL_VECTOR, used_vectors);
#endif

	/*
	 * Should be a barrier for any external CPU state:
	 */
	cpu_init();

	x86_init.irqs.trap_init();  //这个是什么意思呢?好像跟虚拟机有关,我们不用关注。
}

    程序中首先设置中断向量表的头19个陷阱门,这些中断向量表都是CPU保留用于异常处理的。 

接着,有这样的操作:

	/* Reserve all the builtin and the syscall vector: */
	for (i = 0; i < FIRST_EXTERNAL_VECTOR; i++)
		set_bit(i, used_vectors);

系统设置了一个位图used_vectors,来表示每个中断向量表的使用情况,FIRST_EXTERNAL_VECTOR = 20,可以看到,这里是将前20(0~19)个向量表项对应的位图设置为1,表示已经被占用了。

紧接着:

	set_system_trap_gate(SYSCALL_VECTOR, &system_call);
初始化系统调用向量。SYS_CALL_VECTOR = 0x80。这里有一个这样的问题,为什么用的是set_system_trap_gate,而不是像2.4那样用set_system_gate呢?我们可以将系统调用看成是trap,因为它同样要陷入内核空间,可以这样理解,当陷入陷阱时,EIP指向的是下一条指令,而当故障(fault)发生时,EIP指向当前指令,当异常发生时,EIP的指向是不固定的,因此想想系统调用后EIP的变化,它必然是属于陷阱范畴的。


接下来,看这样一个操作cpu_init()

/*
 * cpu_init() initializes state that is per-CPU. Some data is already
 * initialized (naturally) in the bootstrap process, such as the GDT
 * and IDT. We reloa
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/SunnyBeiKe/article/details/6958473

智能推荐

【图形化编程】_图形化编程逻辑-程序员宅基地

文章浏览阅读765次,点赞6次,收藏17次。可视化编程 蓝图_图形化编程逻辑

发自肺腑深入肌肤 —— 一位武汉老程序员的自白-程序员宅基地

文章浏览阅读159次。我是一个对技术没有很大热情的程序员。即使在项目忙的时候我也不会加班很长时间,因为我觉得我的身体坐了一天了,它予我以生存,我必须善待它,但步行3公里回去吃完饭我还是会在各论坛上看看解决问题的最好办法,因为公司予我以饭碗,我必须对得起他,不断的学习只是因为单纯的觉得想要更好就必须学习,出于欲望而不是热情有时会走..._饭现在只能/ 发自肺腑t呢

卷积神经网络在图像重建任务中的应用-程序员宅基地

文章浏览阅读323次,点赞4次,收藏3次。1.背景介绍卷积神经网络(Convolutional Neural Networks,CNN)是一种深度学习模型,广泛应用于图像分类、目标检测、语音识别等多个领域。在图像重建任务中,卷积神经网络能够自动学习图像特征,从而实现高效的图像重建。图像重建是指从观测到的有限信息(如噪声图像、缺失图像或压缩图像)中恢复原始图像的过程。图像重建是计算机视觉领域的一个关键任务,具有广泛的应用前景,如图像...

你是否会被人工智能哭泣的声音所打动?| Mixlab 技术前沿-程序员宅基地

文章浏览阅读179次。#音频工程#、#AI语音技术#、#AI Deepfake#AI 语音——语音识别技术,与语音合成语音识别技术是指机器自动将人的语音,转成文字的技术,即ASR技术:Automatic S..._sonantic ai

arcgis for flex api version3.7 教程:5.使用Editor对地图进行编辑-程序员宅基地

文章浏览阅读1.5k次。ArcGIS的网络编辑操作(可以认为是网页端的相关地理处理操作)需要feature service来提供符号信息和几何数据信息。feature service允许你创建自定义的REST方法节点,用来存储和查询地理数据,如点、线和面。存储自定义的渲染规则和元数据信息,例如地名,评级,地址等。对存储的数据进行分析和计算。ArcGIS API for Flex提供的Featurelayer允许你获取

查看变量类型的python内置函数名是_Python-day05-20200722-函数查看-变量类型和不可变类型参数传递-递归函数-匿名函数-排序映射筛选器-内置函数摘要-一个函数作为另一个函数的返...-程序员宅基地

文章浏览阅读316次。P115# 函数的回顾总结# 1.函数的声明 def# 2.函数的格式 def 函数名(形式参数1,形式参数2....)# 3.函数的调用 函数名(实参1,实参2.....)# 4.函数返回值 使用return 语句返回函数的执行结果# 5.函数返回多个结果 将多个数据打包成一个整体返回# 可以使用字典和列表 通常用元组# 函数名字也是一个标识符# 由字母 数字 下划线 组成 不能以数字开头 ..._查看变量类型的python内置函数为

随便推点

iOS开发笔记 -- 蓝牙开发_蓝牙appendbytes-程序员宅基地

文章浏览阅读263次。简述 最近在做一个蓝牙项目,由于之前并没有接触过蓝牙开发,开发的过程中 也遇到了很多的问题,在此 记录一下基本的概念和解决的方案。一、蓝牙的基本概念在蓝牙的通讯过程中涉及了两个主要的角色 -&amp;amp;amp;amp;gt; 中心设备和外围设备,外围设备 有其它设备所需要的数据,而中心设备 使用外围设备提供的数据完成特定的任务,简单理解 中心设备就是 扫描周围蓝牙硬件的设备,外围设备就是 被扫描的设..._蓝牙appendbytes

【Transformer-Hugging Face手册 07/10】 微调预训练模型_预训练模型的tokenizer的返回类型是batchencoding吗-程序员宅基地

文章浏览阅读983次,点赞49次,收藏12次。使用预训练模型有显着的好处。它可以降低计算成本和碳足迹,并允许您使用最先进的模型,而无需从头开始训练。 Transformers 提供了针对各种任务的数千个预训练模型的访问权限。当您使用预训练模型时,您可以在特定于您的任务的数据集上对其进行训练。这被称为微调,是一种非常强大的训练技术。_预训练模型的tokenizer的返回类型是batchencoding吗

探索Blender OSM:3D建模与OpenStreetMap的完美结合-程序员宅基地

文章浏览阅读377次,点赞3次,收藏4次。探索Blender OSM:3D建模与OpenStreetMap的完美结合项目地址:https://gitcode.com/vvoovv/blender-osm项目简介Blender OSM 是一个开源插件,它将流行的3D建模工具Blender与全球最大的地理信息数据库OpenStreetMap(OSM)相结合。通过此插件,用户可以轻松地导入和编辑基于OSM数据的3D模型,大大简化了城市景..._blender osm

遨博协作机器人ROS开发 - MoveGroup Python接口编程_moveit group python-程序员宅基地

文章浏览阅读1.7k次。大家好,欢迎关注遨博学院带来的系列技术分享文章(协作机器人ROS开发),今天我们来学习遨博机械臂MoveGroup Python接口编程。_moveit group python

运维工程师必备技能_运维工程师 技能专长 csdn-程序员宅基地

文章浏览阅读2k次。通用技能 公司与个人 公司是盈利性组织个人和公司必须双赢在认同公司理念且能够给公司创造足够价值的基础上,为个人发展而工作WHO AM I 黑客是守正出奇且具备创造力的群体 守正出奇 这条正道/底线得坚守但如果太过正就迂腐了,为了搞定任务有时得出奇招创造力 一个没有创造力的人是多么的可怜,对于团队来说也是一种耻辱本技能表的本质目的只有一个:引导你拥有足够的创造力黑客也可以是一..._运维工程师 技能专长 csdn

c盘越来越大怎么清理?C:\Windows\System32\DriverStore\FileRepository-程序员宅基地

文章浏览阅读5.7k次。c盘越来越大怎么清理?清理C:\Windows\System32\DriverStore\FileRepository c盘越来越大怎么清理?装系统时划了50G给C盘,随着使用C..._c:\windows\system32\driverstore

推荐文章

热门文章

相关标签