Linux内核源代码分析——中断(一鞭一条痕)(下)
写在代码前:
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内核源代码分析——中断(一鞭一条痕)(下)相关推荐
- Linux内核源代码分析——中断(一鞭一条痕)(上)
Jack:为什么标题是--一鞭一条痕呢? 我:中断是CPU的核心,更是Linux内核的核心.我希望本文能把中断讲清楚,讲到你看了就明白什么是中断.希望能做到"一鞭一条痕,一掌一筐血" ...
- Linux内核源代码分析-目录
第一部分 Linux 内核源代码 arch/i386/kernel/entry.S 2 arch/i386/kernel/init_task.c 8 arch/i386/kernel/irq.c 8 ...
- Linux内核源代码分析——可执行文件header处理(二进制文件读写范例,写DUL工具入门指引)...
在把Linux内核源代码生成Image之前,需要把执行文件头结构信息剔除出来.这个过程对理解Linux内核具有很大的帮助.同时,由于是对可执行文件进行直接读写操作,想写DUL工具的童鞋可以在这里学习到 ...
- linux内核源代码分析----内核基础设施之klist
概述 klist是list的线程安全版本,他提供了整个链表的自旋锁,查找链表节点,对链表节点的插入和删除操作都要获得这个自旋锁.klist的节点数据结构是klist_node,klist_node引入 ...
- Linux内核源代码分析——swap实现
swap是现代Unix操作系统一个非常重要的特性.尤其在大型数据库服务器上,swap往往是性能首要查看指标. 通俗的说法,在Unix里,将开辟一个磁盘分区,用作swap,这块磁盘将作为内存的的替代品, ...
- Linux内核源代码分析经验
Linux的最大的好处之一就是它的源码公开.同时,公开的核心源码也吸引着无数的电脑爱好者和程序员:他们把解读和分析Linux的核心源码作为自己的 最大兴趣,把修改Linux源码和改造Linux系统 ...
- Linux内核源代码分析——fork()原理多进程网络模型
今晚和一位500强的leader喝喝小酒吃吃烤鱼,生活乐无边.这位兄弟伙才毕业2年,已经做到管理层了,机遇和能力不可谓不好.喝酒之余,聊到Linux内核的两个问题--fork().exec()的原理. ...
- Linux内核源代码分析-第三章 内核体系结构概述-1
第3章 内核体系结构概述 本章从较高层次上对内核进行说明.从顺序上来说,本章首先介绍内核设计目标,接下来 介绍内核体系结构,最后介绍内核源程序目录结构. 3.1 内核设计目标 Linux 的内核展现出 ...
- Linux 内核源代码分析 chap 2 存储管理 (5)
物理页面分配 linux 内核 2.4 中有 2 个版本号的物理页面分配函数 alloc_pages(). 一个在 mm/numa.c 中, 还有一个在 mm/page_alloc.c 中, 依据条件 ...
最新文章
- Ubuntu Linux系统下apt-get命令详解
- HTML5与CSS3实战指南读书笔记之一些可能会有用的东西
- mysql blob 导出_mysql blob导出文本解密 | 学步园
- Android File.listFiles()返回null问题
- Python学习13 异常处理机制
- 用MySQL-zrm来备份和恢复MySQL数据库
- 第一个python代码
- php js的视频教程,【JS视频教程推荐】2021年最值得推荐的5个JavaScript视频教程
- 转载+收藏 数理化地生常用软件
- 高质免费图片素材网站
- NvRam增加记录恢复出厂设置次数(下)
- Deepin搭建Qt5开发环境
- 根据银行卡号来获取银行名称-java
- 清单的用法、配置文件的配置、临时命令的用法
- ISTIO文档解读学习(三)
- 来自“飞人”乔丹的启示!奥尼尔开启的另一个“赛场”
- MyEclipse ci8破解教程,图文教你一步一步走向成功
- Shell编程规范与变量(shell编程规范,执行脚本文件的四种方式,管道符号与重定向,shell变量的作用于类型)
- 【算法学习笔记】寒假打卡1——数组
- python gui 三维 pyqt5_【PyQt5-Qt Designer】在GUI中使用pyqtgraph绘图库
热门文章
- git checkout远程分支_Git检出远程分支
- 9个开源自动化测试框架,质量保证测试工程师用起来
- 发红包的测试用例设计点
- vue 报错 Error: timeout of 5000ms exceeded
- 黑马博客——详细步骤(十)项目功能的实现之开发环境与生产环境
- 剑指offer面试题[60]-将二叉树打印成多行
- php中mysql数据库集群,MySQL集群
- mysql 5乱码_MySQL 5.x乱码问题解决
- AJAX技术文案沙雕,vue-router 中使用 keep-alive 控制 ajax 请求的缓存策略(二)
- 英语计算机试卷二,计算机专业英语模拟试题2参考答案.doc