写在代码前:

Jack:上次你说的8个问题。我都想过了。不过不是特别清楚。

我:那我从头介绍一下吧。

Jack:好。你开始吧。

中断在几乎所有的CPU里都分为三类:中断(interrupt)、异常(exception)、陷阱(trap)。在各种介绍CPU的书籍里,都会提到这三个概念,这里也就不复述了。如果想理解中断的本质大可以不去深究这3个概念,因为这三个概念完全是意淫出来的。

为了能将各种中断分门别类,CPU定义了一个“中断向量”(vector)的概念。而为了描述和管理中断向量,CPU有专门的寄存器——中断寄存器(IDTR)。IDTR里存储的是中断向量表的起始地址——听起来和全局描述寄存器(GDTR)、局部描述寄存器(LDTR)很类似吧。是的,中断描述符表IDT和GDT、LDT是同一个层面的东西。

x86的CPU定义了256种中断。其中0—19种是intel定义死了的,不能用作别的用途。而20—255是可以自己使用的。我们接触得最多的莫过于0x80号中断——所有的系统调用,如read、write、fork等,都是0x80号中断。

因为x86的CPU只有256种中断,所以,中断描述符表的entry数最多不大于256(可以小于256)。

Jack:中断描述符表的entry都记录了些什么呢?

我:中断描述符表里的entry分为三大类——中断(interrupt)门、陷阱(trap)门、任务(task)门。这里的“门”的意思很形象,就是说,通过这些entry就能进入到相应的中断服务程序对应的代码段。

Jack:那这些门是什么样子的呢?举个例子来分析下吧。

我:其中,任务门的格式和GDT、LDT中的entry的格式是一样的。三个门的格式具体如下:

摘自《Linux内核完全注释》

中断描述符表的内容、中断描述附表的地址一般在bootloader里就会设置好(地址存进idtr)。

只不过,这个时候,中断描述符表中的entry指向的代码都是空的,是“哑中断”。

这样,在进入start_kernel()函数之后,内核调用init_IRQ(void)进行真正的中断初始化。描述附表指向的程序才真正有效。

Linux内核源代码分析——中断(一鞭一条痕)(下)相关推荐

  1. Linux内核源代码分析——中断(一鞭一条痕)(上)

    Jack:为什么标题是--一鞭一条痕呢? 我:中断是CPU的核心,更是Linux内核的核心.我希望本文能把中断讲清楚,讲到你看了就明白什么是中断.希望能做到"一鞭一条痕,一掌一筐血" ...

  2. Linux内核源代码分析-目录

    第一部分 Linux 内核源代码 arch/i386/kernel/entry.S 2 arch/i386/kernel/init_task.c 8 arch/i386/kernel/irq.c 8 ...

  3. Linux内核源代码分析——可执行文件header处理(二进制文件读写范例,写DUL工具入门指引)...

    在把Linux内核源代码生成Image之前,需要把执行文件头结构信息剔除出来.这个过程对理解Linux内核具有很大的帮助.同时,由于是对可执行文件进行直接读写操作,想写DUL工具的童鞋可以在这里学习到 ...

  4. linux内核源代码分析----内核基础设施之klist

    概述 klist是list的线程安全版本,他提供了整个链表的自旋锁,查找链表节点,对链表节点的插入和删除操作都要获得这个自旋锁.klist的节点数据结构是klist_node,klist_node引入 ...

  5. Linux内核源代码分析——swap实现

    swap是现代Unix操作系统一个非常重要的特性.尤其在大型数据库服务器上,swap往往是性能首要查看指标. 通俗的说法,在Unix里,将开辟一个磁盘分区,用作swap,这块磁盘将作为内存的的替代品, ...

  6. Linux内核源代码分析经验

      Linux的最大的好处之一就是它的源码公开.同时,公开的核心源码也吸引着无数的电脑爱好者和程序员:他们把解读和分析Linux的核心源码作为自己的 最大兴趣,把修改Linux源码和改造Linux系统 ...

  7. Linux内核源代码分析——fork()原理多进程网络模型

    今晚和一位500强的leader喝喝小酒吃吃烤鱼,生活乐无边.这位兄弟伙才毕业2年,已经做到管理层了,机遇和能力不可谓不好.喝酒之余,聊到Linux内核的两个问题--fork().exec()的原理. ...

  8. Linux内核源代码分析-第三章 内核体系结构概述-1

    第3章 内核体系结构概述 本章从较高层次上对内核进行说明.从顺序上来说,本章首先介绍内核设计目标,接下来 介绍内核体系结构,最后介绍内核源程序目录结构. 3.1 内核设计目标 Linux 的内核展现出 ...

  9. Linux 内核源代码分析 chap 2 存储管理 (5)

    物理页面分配 linux 内核 2.4 中有 2 个版本号的物理页面分配函数 alloc_pages(). 一个在 mm/numa.c 中, 还有一个在 mm/page_alloc.c 中, 依据条件 ...

最新文章

  1. Ubuntu Linux系统下apt-get命令详解
  2. HTML5与CSS3实战指南读书笔记之一些可能会有用的东西
  3. mysql blob 导出_mysql blob导出文本解密 | 学步园
  4. Android File.listFiles()返回null问题
  5. Python学习13 异常处理机制
  6. 用MySQL-zrm来备份和恢复MySQL数据库
  7. 第一个python代码
  8. php js的视频教程,【JS视频教程推荐】2021年最值得推荐的5个JavaScript视频教程
  9. 转载+收藏 数理化地生常用软件
  10. 高质免费图片素材网站
  11. NvRam增加记录恢复出厂设置次数(下)
  12. Deepin搭建Qt5开发环境
  13. 根据银行卡号来获取银行名称-java
  14. 清单的用法、配置文件的配置、临时命令的用法
  15. ISTIO文档解读学习(三)
  16. 来自“飞人”乔丹的启示!奥尼尔开启的另一个“赛场”
  17. MyEclipse ci8破解教程,图文教你一步一步走向成功
  18. Shell编程规范与变量(shell编程规范,执行脚本文件的四种方式,管道符号与重定向,shell变量的作用于类型)
  19. 【算法学习笔记】寒假打卡1——数组
  20. python gui 三维 pyqt5_【PyQt5-Qt Designer】在GUI中使用pyqtgraph绘图库

热门文章

  1. git checkout远程分支_Git检出远程分支
  2. 9个开源自动化测试框架,质量保证测试工程师用起来
  3. 发红包的测试用例设计点
  4. vue 报错 Error: timeout of 5000ms exceeded
  5. 黑马博客——详细步骤(十)项目功能的实现之开发环境与生产环境
  6. 剑指offer面试题[60]-将二叉树打印成多行
  7. php中mysql数据库集群,MySQL集群
  8. mysql 5乱码_MySQL 5.x乱码问题解决
  9. AJAX技术文案沙雕,vue-router 中使用 keep-alive 控制 ajax 请求的缓存策略(二)
  10. 英语计算机试卷二,计算机专业英语模拟试题2参考答案.doc