x86中断编程

来源:互联网 发布:java免费书籍下载txt 编辑:程序博客网 时间:2024/05/21 11:36

        x86下的cpu ,有256个中断,0~19号中断属于CPU所有,而且第20-31号中断也被Intel保留,所以从32~255号才属于用户自定义中断。分为两种中断模式,实模式和保护模式。

     实模式下:即cpu在上电时得运行模式,为16位,即bios相似的运行环境,cpu具体启动如 http://www.mouseos.com/arch/interrupt.html所述

processor 执行的第一条指针在 0xFFFFFFF0 处,这个地址经过 North Bridge(北桥)和 South ridge(南桥)芯片配合解码,最终会访问到固化的 ROM 块,同时,经过别名机制映射在地址空间低端,实际上等于 ROM 被映射到地址空间最高端低端位置。

此时在系统的内存里其实并不存在 BIOS 代码,ROM BIOS 的一部分职责是负责安装 BIOS 代码进入系统内存。

jmp far f000:e05b

典型是这条指令就是 0xFFFFFFF0 处的 ROM BIOS 指令,执行后它将跳到 0x000FE05B 处,这条指令的作用很大:

  • 更新 CS.base 使 processor 变成纯正的 real mode
  • 跳转到低端内存,使之进入 1M 低端区域

前面说过,此时内存中也不存在 BIOS,也就是说 IVT(中断向量表)也是不存在的,中断系统此时是不可用的,那么由 ROM BIOS 设置 IVT 。

),在这种模式下,bois会初始化LVT(即中断向量表),一共256个向量,每个向量4字节,即一共1k(256x4)的空间为向量表。

在 x86/x64 体系中允许有 256 个中断存在,中断号从 0x00 - 0xff,共 256 个中断,如图:

     上面这个图是实模式下的 IVT 表,每个向量占据 4 个字节,中断服务例程入口是以 segment:offset 形式提供的,offset 在低端,segment 在高端,整个 IVT 表从地址 0x0 - 0x3FF,占据了 1024 个字节,即 1K bytes。我们使用中断向量表就可以设置我们的中断程序。

     保护模式下:x86的中断编程为使用ITD向量表,步骤如下:

      1.建一个IDT中断向量表结构,结构里面放的是每个中断的中断号和中断服务程序地址,还有一些属性信息。

      2.建一个IDT表,从中断0到中断256,每个中断向量建一个IDT结构,大小占8字节。

      3.将IDT的基地址和界限载入IDTR中。

      4.为每个中断服务程序写一个调用规制:规制为:第一部分是一致的现场保护操作;第二部分是每个中断特有的处理逻辑;第三部分又是一致的现场恢复。

      注意在linux中,又分为不同的中断门调用。

      


0 0
原创粉丝点击