首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux中断 - IDT

中断描述符项定义 当中断发生,cpu获取到中断向量后,查找IDT中断描述符表得到相应的中断描述符,再根据中断描述符记录的信息来作权限判断,运行级别转换,最终调用相应的中断处理程序; 这里涉及到Linux...IDT 中断描述符表本身的存储 IDT 中断描述符表的物理地址存储在IDTR寄存器中,这个寄存器存储了IDT的基地址和长度。...(idt_table, &data, 1, false); } 上面的函数主要是填充好idt_data,然后调用idt_setup_from_table; idt_setup_from_table...传统系统调用相关 IDT 的设置 Linux系统启动过程中内核压解后最终都调用到start_kernel, 在这里会调用trap_init, 然后又会调用idt_setup_traps: void...硬件中断相关IDT的初始化也是在Linux启动时完成,在start_kernel中通过调用init_IRQ完成,我们来看一下: void __init init_IRQ(void) { int

6.5K10

Linux内核19-中断描述符表IDT的初始化

Linux使用中断描述符表IDT记录管理所有的中断和异常。那么,首先,Linux内核应该把IDT的起始地址写入idtr寄存器,然后初始化所有的表项。这一步在初始化系统时完成。...让我们看看Linux如何实现这种策略。 中断、陷阱和系统门 在之前的文章中,我们已经介绍过,Intel提供了三种类型的中断描述符:任务,中断和陷阱门描述符。...Linux的分类有些不同,它们如下所示: 中断门 和Intel的中断门相同。所有的用户进程不能访问(该门的DPL设为0)。所有Linux的中断处理程序都是通过中断门激活的,也就是说只能在内核态访问。...三个Linux异常处理程序对应的中断号分别是4、5和128,分别使用into、bound和int $0x80三条汇编指令发出对应的中断信号。...一旦Linux启动,IDT会被搬运到RAM的受保护区域并被第二次初始化,因为Linux不会使用任何BIOS程序。 IDT结构被存储在idt_table表中,包含256项。

85310
您找到你想要的搜索结果了吗?
是的
没有找到

Linux中断一网打尽(1) —— 中断及其初始化

[toc] Linux中断一网打尽 —— 中断及其初始化 前情提要 通过本文您可以了解到如下内容: Linux 中断是什么,如何分类,能干什么? Linux 中断在计算机启动各阶段是如何初始化的?...ioapic.jpg 中断的初始化 Linux 启动流程 中断的初始化是穿插在Linux本身启动和初始化过程中的,因此我们在这里简要说一下Linux本身的初始化。...linux启动流程.png 中断描述符表 外设千万种,CPU统统不知道。...比如Linux在初始化时需要获取物理内存的详情,就 是调用了BIOS的相应中断来获取的。见下图: ?...选区_035.png 中断的第二次初始化 在进入到保护模式后,会全新初始化一个空的中断描述符表 IDT, 供 kernel 使用; Linux Kernel提供256个大小的中断描述符表 #define

1.5K21

保护模式第六讲-IDT表-中断门 陷阱门 任务门

目录 保护模式第六讲-IDT表-中断门 陷阱门 任务门 一丶IDT表 1.1 中断门段描述符表 1.2 中断门的Call调用流程流程图 1.3 中断门的调用以及返回 1.4 中断门的构造与代码 二丶陷阱门...IDT表也是 记录在 IDTR 以及 IDTL 两个寄存器中 其中IDT表中 只能存储 中断门段描述符表 陷阱门段描述符表 任务门段描述符表 其中 中断门段描述符表 陷阱们段描述符表 其实都跟调用门用法一样...进而去IDT表中中寻找中断门段描述符. 与 调用门不同的是. 当返回的时候. 比如使用 (IRET / IRETD)来进行返回 int xxx xxx是索引. 是IDT表中的索引....IDT.base + xxx * 8 = 实际的中断门所在的位置....也可以理解为 IDT[xxx -1] 例如 int 3 查找的就是 IDT[2] 索引 数组从下标从0开始 0 1 2 正好查找的是第三项 调用门是 RETF 中断门是 IRET /IRETD RETF

2.7K20

深入分析Linux内核源代码阅读笔记 第三章

外部中断(或硬件中断) 内部中断(或叫异常) 本章主要讨论在 Intel i386 保护模式下中断机制在 Linux 中的实现。...的预初始化: 中断描述表寄存器 IDTR 的初始化 把 IDT 表的起始地址装入 IDTR 用 setup_idt()函数填充 idt_table 表中的 256 个表项 在对 idt_table...setup_idt()函数对 IDT 表进行填充 中断向量表的最终初始化: 在对中断描述符表进行预初始化后, 内核将在启用分页功能后对 IDT 进行第二遍初始化,也就是说,用实际的陷阱和中断处理程序替换这个空的处理程序...通过 IDTR 寄存器找到 IDT 表,读取 IDT 表第 i 项(或叫第 i 个门)。...分两步进行有效性检查: “段”级检查 “门”级检查 检查是否发生了特权级的变化 Linux 对中断的处理: Linux 把一个中断要执行的操作分为下面的 3 类: 紧急的(Critical)

1.3K40

在winxp环境下,用windbg查看GDT表、IDT表、TSS描述符

网上搜索了一圈,才觉得查看GDT、IDT、TSS这些应该是属于内核调试的。...但是感觉又有点不相信,接着往下看,第一次看的时候没看懂下面的dd是干什么,后来好像有点懂了,这里dd后面加的是8003f000,这不就是GDT后面的值嘛,应该是它的地址了,那既然查看GDT是这样,那查看IDT...表: lkd>dd 8003f400 8003f400 0008f23c 80538e00 0008f3b4 80538e00 //可以看到IDT的基地址是在803f400 8003f410 0058113e...网上还有很多博客的方法说可以用r idtr来查看idtr寄存器中保存的idt表地址,但是我使用时都出现Bad register error in 'r idtr'。...也有查看IDT的其他方法:http://blog.csdn.net/hgy413/article/details/20310091(我当时可能是因为看到了这篇博客才想到去找内核调试的……)

1.4K40

中断机制和中断描述符表、中断和异常的处理

注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为了更好地理清系统编程和网络编程中的一些概念性问题...Linux 只用了其中的一个(即128 或0x80向量)用来实现系统调用。...TSS 是Intel 所提供的任务切换机制,但是 Linux 并没有采用任务门来进行任务切换。...Linux 内核在系统的初始化阶段要进行大量的初始化工作,其与中断相关的工作有:初始化可编程控制器8259A;将中断向量IDT 表的起始地址装入IDTR 寄存器,并初始化表中的每一项。...• 通过IDTR 寄存器找到IDT 表,读取IDT 表第 i 项(或叫第i 个门)。

3.5K10

一个整数+1,攻破了Linux内核!

本故事根据Linux内核真实漏洞改编 帝国危机 夜幕降临,喧嚣褪去,繁忙的Linux帝国渐渐平静了下来,谁也没有想到,一场危机正在悄然而至...... “咚咚!”...“你是说,他是通过中断描述符表(IDT)进来的?” 小黑点了点头。 “小王,你赶紧跟他过去IDT看一下,调查清楚速来报我”,部长对着一旁的助理说到。...此事非同小可,我还是亲自去一趟吧” IDT修改谜案 安全部长随即出发,来到IDT所在的地方,这里一切如旧,未见有何异样。 部长指着这中段描述符表问道:“他是从哪道门进来的?”...,“这入口地址是64位的,在IDT表项中拆分成三部分存储。...,在64位Linux帝国,内核空间的地址高32位都是0xFFFFFFFF,如果······” “如果利用前面的event_id数组下标越界访问,把这个地方原子+1,那就变成了0,对不对?”

35420

使用Jexus 容器化您的 Blazor 应用程序

C:\workshop\idt2019\wasmtest\wasmtest.csproj 的还原在 93.3 ms 内完成。...\idt2019\wasmtest\publish\ 在这里,你可以看到我们的程序的文件都发布到了路径C:\workshop\idt2019\wasmtest\publish\, 我们的所有成果输出都是静态文件...,都放在文件夹wwwroot 目录下: PS C:\workshop\idt2019\wasmtest\publish> ls wwwroot 目录: C:\workshop\idt2019...Jexus 是一款国产的 Linux 平台上的高性能WEB服务器 和负载均衡网关,以支持 ASP.NET、 ASP.NET CORE、 PHP 为特色, 同时具备反向代理、 入侵 检测等重要功能。...可以这样说, Jexus是 .NET、 .NET CORE 跨平台的最优秀的宿主服务器,如 果我们认为它是 Linux平台 的 IIS ,这并不为过,因为, Jexus 不但非常快,而且拥有 IIS 和

2.2K10

system_call到iret过程分析

中断的过程   在linux内核启动过程中,start_kernel中trap_init()函数初始化了中断门,通过set_system_intr_gate->set_gate进行设置,通过write_idt_entry...将中断信息写进中断描述符表IDT,中断描述符表(Interrupt Descriptor Table,IDT)是一个系统表,它与每一个中断或异常向量相联系,每一个向量在表中存放的是相应的中断或异常处理程序的入口地址...,当处于实模式下时,IDT 被初始化并由 BIOS 程序所使用。...然而,一旦 Linux 开始接管,IDT 就被移到另一个区域,并进行第二次初始化。    ..._TIF_ALLWORK_MASK, %ecx # current->work jne syscall_exit_work 下面我们看看SAVE_ALL执行了哪些操作,对fork系统调用一文中我们对linux

1K50

Linux内核17-硬件如何处理中断和异常

Linux有效地利用它们,在CPU之间传递消息。 目前,大部分的单核系统也都包含一个I/O-APIC芯片,可以使用两种不同的方式配置它: 当一个标准的8259A类型的外部PIC使用。...IDT表中,每一项对应一个中断或者异常,大小8个字节。因而,IDT需要256x8=2048个字节大小的存储空间。 IDT表的物理地址存储在CPU寄存器idtr中:包括IDT的基地址和最大长度。...在使能中断之前,必须使用lidt汇编指令初始化IDT表。 IDT表包含三种类型的描述符,使用Type位域表示(40-43位)。下图分别解释了这三种描述符各个位的意义。...如果发生中断,控制单元就会做如下处理: 确定中断或异常的编号N; 读取IDT表中的第N项;(在后面的描述中,假设包含的是中断门或陷阱门) 获取GDT的基地址,遍历GDT找到IDT表第N项中的段选择器标识的段描述符...其实对于Linux来说,只使用了supervisor和user两种特权等级。所以中断应该都是在supervisor特权等级下运行。

2K10

一文讲透计算机的“中断”

咱们在此只介绍中断门描述符,4种描述符除了任务门其他都类似,中断门也是最常用的,如Linux的系统调用就是使用中断门实现的。...位表示IDT的界限。...(不同特权级有着不同的栈,如Linux使用了0, 3特权级,则有两个栈,一个内核栈,一个用户栈) 2、于是处理器临时保存当前的旧栈SS和ESP的值,从TSS(每一个任务有一个TSS结构,其中保存着不同特权级栈的...具体操作:取出IDTR中的IDT地址,加上中断向量号 * 8,得到的地址指向所要的中断描述符。...5 中断处理过程 中断的实际处理过程就是执行中断处理程序,Linux将中断处理程序分为上下两部分,需要紧急处理立即执行的归为上半部,不那么紧急的归为下半部。 这便涉及到了开关中断的问题。

93321

一个小小指针,竟把Linux内核攻陷了!

这些函数记录在中断描述符表IDT中,由操作系统初始化系统的时候预先安排。 异常: 异常是CPU在执行指令的过程中出现的问题,如除法指令的除数为0,访问的内存地址无效等等。...异常和中断处理逻辑类似,也是通过记录在IDT中的异常处理函数来执行,同样由操作系统初始化系统的时候预先安排。...典型漏洞案例:CVE-2016-0728 Linux 整数溢出 + 数组越界 在操作系统中,有很多函数地址以表格的形式存储了起来,如: 系统调用表:SSDT/sys_call_table 中断描述符表...:IDT 假如有办法能修改这些表格中的函数地址,改写成攻击者的代码地址,不就能有办法让我们的代码在内核模式下运行了吗?...典型漏洞案例:CVE-2013-2094 Linux 这是一个Linux内核任意地址写入漏洞,通过精准控制系统调用的参数,实现改写IDT中的函数地址为恶意代码地址,实现在内核态执行恶意代码!

92810
领券