我们好像忘了很重要的东西:

(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的初始化相关推荐

  1. [Linux内核]软中断与硬中断

    转自:http://blog.csdn.net/zhangskd/article/details/21992933 本文主要内容:硬中断 / 软中断的原理和实现 内核版本:2.6.37 Author: ...

  2. Linux内核基础——Linux中断的概念

    一.什么是中断? 中断是指计算机运行过程中,出现某些意外情况需要主机干预时,中断源向CPU发送一个中断请求,CPU能进行中断响应去停止正在运行的程序并且保护现场数据,然后转入中断服务程序进行处理,处理 ...

  3. 【Linux 内核】Linux 内核体系架构 ( 进程调度 | 内存管理 | 中断管理 | 设备管理 | 文件系统 )

    文章目录 一.进程调度 二.内存管理 三.中断管理 四.设备管理 五.文件系统 一.进程调度 进程调度 : 进程 是 系统中 进行 资源分配 的 基本单位 ; 每个进程 在 运行时 , 都 感觉自己占 ...

  4. 嵌入式之linux用户空间与内核空间,进程上下文与中断上下文

    文章目录 前言 用户空间与内核空间 内核态与用户态 进程上下文和中断上下文 上下文 原子 进程上下文 中断上下文 进程上下文VS中断上下文 原子上下文 前言 之前在学习嵌入式linux系统的时候,一直 ...

  5. 【读书笔记】Linux内核设计与实现--中断和中断处理

    文章目录 1.中断 2.中断处理程序 3.上半部与下半部的对比 4.注册中断处理程序--request_irq 5.编写中断处理程序 5.1 共享的中断处理程序 5.2 中断处理程序实例-rtc驱动程 ...

  6. 转:Linux 2.4.x内核软中断机制

    源地址:http://www.ibm.com/developerworks/cn/linux/kernel/interrupt/ Linux 2.4.x内核软中断机制 杨沙洲 (pubb@163.ne ...

  7. ARM linux解析之压缩内核zImage的启动过程

    ARM linux解析之压缩内核zImage的启动过程 首先,我们要知道在zImage的生成过程中,是把arch/arm/boot/compressed/head.s 和解压代码misc.c,deco ...

  8. linux内核剖析---Linux系统调用详解(实现机制分析)

    原文博客 http://blog.csdn.net/gatieme/article/details/50779184 本文介绍了系统调用的一些实现细节.首先分析了系统调用的意义,它们与库函数和应用程序 ...

  9. Linux内核网络栈1.2.13-网卡设备的初始化流程

    参考资料 <<linux内核网络栈源代码情景分析>> 网卡设备的初始化 本文主要描述一下网卡设备的整个初始化的过程,该过程主要就是根据设备的硬件信息来获取与传输网络数据,注册相 ...

  10. 【内核】linux内核启动流程详细分析【转】

    转自:http://www.cnblogs.com/lcw/p/3337937.html Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件 ...

最新文章

  1. python编译成exe速度会变快吗_python如何编译成exe
  2. OpenCV点分类器points classifier的实例(附完整代码)
  3. 2021年四季度企业薪酬报告发布 38个核心城市平均薪酬首次超万
  4. SQL优化二(SQL性能调优)
  5. 美国计算机专业硏究生,2014年美国计算机专业研究生排名
  6. C语言,你真的弄懂了么?
  7. mysql 5.7.13 mac_Mac 安装mysql 5.7.13版本 登录及改密码
  8. VC编译器中混有.c文件时出现fatal error C1853错误(转)
  9. Hibernate中配置C3P0连接池
  10. 马云:搞AI严防叶公好龙;李彦宏:不拥抱AI的公司会死掉
  11. 【图像修复】基于matlab GUI运动模糊消除(逆滤波)【含Matlab源码 847期】
  12. 插件效果【网站开发必备】——12款响应式 Lightbox(灯箱)效果插件
  13. MIUI12内置软件卸载工具 MIUI系统应用 免ROOT 卸载工具
  14. 畅捷通T+ v17任意文件上传漏洞复现
  15. 创建链表:头插法与尾插法
  16. 斐乐第五家高尔夫独立店东莞开业;康莱德酒店及度假村签约西安、南京和成都三家酒店 | 美通企业日报...
  17. 苹果手机10秒解除锁屏_Redmi 10X手机密码忘了怎么办?手机10秒解除锁屏,三步解开安卓苹果密码【详细步骤】...
  18. 叉积求点到平面距离_用叉乘求法向量.doc
  19. u盘推荐知乎_U盘推荐|U盘哪个牌子更好?怎么选择?
  20. [原创]Netfilter源码分析-我来抛砖,望能引玉

热门文章

  1. ftp script for DOS
  2. asp.net的10个提升性能或扩展性的秘密(二)
  3. ThickBox学习之一 ThickBox介绍以及单图片显示示例
  4. 朋友公司招聘1名项目经理和两名asp.net(c#)程序员
  5. WSL之Emacs中文乱码解决
  6. Emacs镜像ELPA
  7. 解决U盘安装Win10报错:No bootbale devices found.
  8. 小米刷机降级(自测红米note5)
  9. C语言之10/16进制字符串和数字转换(四)
  10. 获取Android 光感Sensor的值