linux内核中断向量表,Linux内核中断之中断向量表IDT的初始化
我们好像忘了很重要的东西:
(1)set_intr_gate
/*
* This needs to use 'idt_table' rather than 'idt', and
* thus use the _nonmapped_ version of the IDT, as the
* Pentium F0 0F bugfix can have resulted in the mapped
* IDT being write-protected.
*/
staticinlinevoidset_intr_gate(unsignedintn,void*addr)
{
BUG_ON((unsigned)n > 0xFF);
_set_gate(n, GATE_INTERRUPT, addr, 0, 0, __KERNEL_CS);//设置中断门
}
(2)set_system_intr_gate
/*
* This routine sets up an interrupt gate at directory privilege level 3.
*/
staticinlinevoidset_system_intr_gate(unsignedintn,void*addr)
{
BUG_ON((unsigned)n > 0xFF);
_set_gate(n, GATE_INTERRUPT, addr, 0x3, 0, __KERNEL_CS);//设置中断门
}
(3)set_task_gate
staticinlinevoidset_task_gate(unsignedintn, unsignedintgdt_entry)
{
BUG_ON((unsigned)n > 0xFF);
_set_gate(n, GATE_TASK, (void*)0, 0, 0, (gdt_entry<<3));//设置任务门
}
(4)set_system_trap_gate
staticinlinevoidset_system_trap_gate(unsignedintn,void*addr)
{
BUG_ON((unsigned)n > 0xFF);
_set_gate(n, GATE_TRAP, addr, 0x3, 0, __KERNEL_CS);//设置陷阱门
}
我们观察一下这几个函数,都是调用_set_gate,区别在于第二个和第四个参数。第二个参数对应于中断门或陷阱门格式中的D标志位加上类型位段;第四个参数对应于DPL。下面,我们来看一下_set_gate函数:
staticinlinevoid_set_gate(intgate, unsigned type,void*addr,
unsigned dpl, unsigned ist, unsigned seg)
{
gate_desc s;
pack_gate(&s, type, (unsignedlong)addr, dpl, ist, seg);
/*
* does not need to be atomic because it is only done once at
* setup time
*/
write_idt_entry(idt_table, gate, &s);
}
其第一个操作pack_gate():
staticinlinevoidpack_gate(gate_desc *gate, unsignedchartype,
unsignedlongbase, unsigned dpl, unsigned flags,
unsignedshortseg)
{
gate->a = (seg <
gate->b = (base & 0xffff0000) | (((0x80 | type | (dpl <
}
而wirte_idt_entry():
#define write_idt_entry(dt, entry, g) native_write_idt_entry(dt, entry, g)
staticinlinevoidnative_write_idt_entry(gate_desc *idt,intentry,constgate_desc *gate)
{
memcpy(&idt[entry], gate,sizeof(*gate));
}
trap_init()中设置了一些为CPU保留专用的IDT表项以及系统调用所用的陷阱门以后,就进入init_IRQ()设置大量用于外设的通用中断门了:void__init init_IRQ(void)
{
inti;
/*
* We probably need a better place for this, but it works for
* now ...
*/
x86_add_irq_domains();
/*
* On cpu 0, Assign IRQ0_VECTOR..IRQ15_VECTOR's to IRQ 0..15.
* If these IRQ's are handled by legacy interrupt-controllers like PIC,
* then this configuration will likely be static after the boot. If
* these IRQ's are handled by more mordern controllers like IO-APIC,
* then this vector space can be freed and re-used dynamically as the
* irq's migrate etc.
*/
for(i = 0; i nr_legacy_irqs; i++)
per_cpu(vector_irq, 0)[IRQ0_VECTOR + i] = i;
x86_init.irqs.intr_init();
}
这段内容在《情景分析》中有精彩的解释,但是我没有在3.0.4中找到合适的代码,不过想来应该是变化不大的,特别是基本的原理应该变化不大,因此就不费时讲解了。
linux内核中断向量表,Linux内核中断之中断向量表IDT的初始化相关推荐
- [Linux内核]软中断与硬中断
转自:http://blog.csdn.net/zhangskd/article/details/21992933 本文主要内容:硬中断 / 软中断的原理和实现 内核版本:2.6.37 Author: ...
- Linux内核基础——Linux中断的概念
一.什么是中断? 中断是指计算机运行过程中,出现某些意外情况需要主机干预时,中断源向CPU发送一个中断请求,CPU能进行中断响应去停止正在运行的程序并且保护现场数据,然后转入中断服务程序进行处理,处理 ...
- 【Linux 内核】Linux 内核体系架构 ( 进程调度 | 内存管理 | 中断管理 | 设备管理 | 文件系统 )
文章目录 一.进程调度 二.内存管理 三.中断管理 四.设备管理 五.文件系统 一.进程调度 进程调度 : 进程 是 系统中 进行 资源分配 的 基本单位 ; 每个进程 在 运行时 , 都 感觉自己占 ...
- 嵌入式之linux用户空间与内核空间,进程上下文与中断上下文
文章目录 前言 用户空间与内核空间 内核态与用户态 进程上下文和中断上下文 上下文 原子 进程上下文 中断上下文 进程上下文VS中断上下文 原子上下文 前言 之前在学习嵌入式linux系统的时候,一直 ...
- 【读书笔记】Linux内核设计与实现--中断和中断处理
文章目录 1.中断 2.中断处理程序 3.上半部与下半部的对比 4.注册中断处理程序--request_irq 5.编写中断处理程序 5.1 共享的中断处理程序 5.2 中断处理程序实例-rtc驱动程 ...
- 转:Linux 2.4.x内核软中断机制
源地址:http://www.ibm.com/developerworks/cn/linux/kernel/interrupt/ Linux 2.4.x内核软中断机制 杨沙洲 (pubb@163.ne ...
- ARM linux解析之压缩内核zImage的启动过程
ARM linux解析之压缩内核zImage的启动过程 首先,我们要知道在zImage的生成过程中,是把arch/arm/boot/compressed/head.s 和解压代码misc.c,deco ...
- linux内核剖析---Linux系统调用详解(实现机制分析)
原文博客 http://blog.csdn.net/gatieme/article/details/50779184 本文介绍了系统调用的一些实现细节.首先分析了系统调用的意义,它们与库函数和应用程序 ...
- Linux内核网络栈1.2.13-网卡设备的初始化流程
参考资料 <<linux内核网络栈源代码情景分析>> 网卡设备的初始化 本文主要描述一下网卡设备的整个初始化的过程,该过程主要就是根据设备的硬件信息来获取与传输网络数据,注册相 ...
- 【内核】linux内核启动流程详细分析【转】
转自:http://www.cnblogs.com/lcw/p/3337937.html Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件 ...
最新文章
- python编译成exe速度会变快吗_python如何编译成exe
- OpenCV点分类器points classifier的实例(附完整代码)
- 2021年四季度企业薪酬报告发布 38个核心城市平均薪酬首次超万
- SQL优化二(SQL性能调优)
- 美国计算机专业硏究生,2014年美国计算机专业研究生排名
- C语言,你真的弄懂了么?
- mysql 5.7.13 mac_Mac 安装mysql 5.7.13版本 登录及改密码
- VC编译器中混有.c文件时出现fatal error C1853错误(转)
- Hibernate中配置C3P0连接池
- 马云:搞AI严防叶公好龙;李彦宏:不拥抱AI的公司会死掉
- 【图像修复】基于matlab GUI运动模糊消除(逆滤波)【含Matlab源码 847期】
- 插件效果【网站开发必备】——12款响应式 Lightbox(灯箱)效果插件
- MIUI12内置软件卸载工具 MIUI系统应用 免ROOT 卸载工具
- 畅捷通T+ v17任意文件上传漏洞复现
- 创建链表:头插法与尾插法
- 斐乐第五家高尔夫独立店东莞开业;康莱德酒店及度假村签约西安、南京和成都三家酒店 | 美通企业日报...
- 苹果手机10秒解除锁屏_Redmi 10X手机密码忘了怎么办?手机10秒解除锁屏,三步解开安卓苹果密码【详细步骤】...
- 叉积求点到平面距离_用叉乘求法向量.doc
- u盘推荐知乎_U盘推荐|U盘哪个牌子更好?怎么选择?
- [原创]Netfilter源码分析-我来抛砖,望能引玉
热门文章
- ftp script for DOS
- asp.net的10个提升性能或扩展性的秘密(二)
- ThickBox学习之一 ThickBox介绍以及单图片显示示例
- 朋友公司招聘1名项目经理和两名asp.net(c#)程序员
- WSL之Emacs中文乱码解决
- Emacs镜像ELPA
- 解决U盘安装Win10报错:No bootbale devices found.
- 小米刷机降级(自测红米note5)
- C语言之10/16进制字符串和数字转换(四)
- 获取Android 光感Sensor的值