将ISR链接到向量中断80x86 32位AT& T组件

时间:2011-09-28 20:40:54

标签: assembly x86

我在Intel-Atom 32位(装配AT& T)上工作。

我想将我的ISR链接到矢量中断0x33:

push %ebp   //save the context to swith back
movl %esp,%ebp

movl $OSTickISR, %eax //address of int 0x33 = address of OSTickISR
movl $0x33*4, %ebx
movl %eax, (%ebx)

pop %ebp //Return to the calling function
ret

当我尝试使用我的int $ 0x33时,没有任何事情发生!!!

出了什么问题?

3 个答案:

答案 0 :(得分:3)

在x86 32位中,ISR信息存储在IDT中。 IDT不仅仅是地址列表,也不一定存储在地址0中。有关IDT格式的说明,请参阅OSDev Wiki page。 IDT的位置由OS确定,用户模式软件可能无法访问。假设您确实有权修改它,您可以使用sidt指令获取IDT的位置。

sidt -6(%esp)

在32位模式下,sidt将在指定位置存储6个字节的数据。我使用-6(%esp)作为我的示例,它将数据存储在当前堆栈的正下方。低两个字节是IDT的长度,以字节为单位,接下来的4个字节(在32位模式下)是IDT的地址。由于每个IDT条目长度为8个字节,因此在IDT开始后,所需条目的位置将为0x33*8个字节。在修改条目之前,应确保IDT实际包含该条目(长度至少为0x34*8个字节)。

这是一个查找IDT的示例,确保它足够长,并设置中断0x33的条目。

sidt    -6(%esp)          // Get the location and size of the IDT
cmpw    $0x34*8, -6(%esp) // Make sure the IDT is long enough
jb      IDT_too_short     //  and handle the error if it isn't
mov     -4(%esp), %ebx    // Get the IDT's address
add     $0x33*8, %ebx     //  and move to the entry for 0x33
mov     $OSTickISR, %eax  // Get the ISR's address
mov     %ax, (%ebx)       // Store the low 16 bits of the ISR's address
movw    $ISR_CS, 2(%ebx)  // Store the code segment which should be used with this ISR
movb    $0, 4(%ebx)       // This has to be 0
movb    $0xEE, 5(%ebx)    // See the OSDev link for information on this byte.
                          // 0xEE is most common for interrupts available from user mode
shr     $16, %eax
mov     %ax, 6(%ebx)      // Store the high 16 bits of the ISR's address

答案 1 :(得分:1)

x86上的地址由段和偏移量组成。在实模式中,它是段* 16 +偏移。在保护模式下有一些间接:段寄存器它实际上是一个指向段描述符的选择器,它包含段基和限制,以及其他段属性。访问内存的指令可以采用显式的段说明符(例如:DS:BX),否则它们采用一个隐含的段,这取决于所使用的寄存器(例如:如果使用SP则隐式段是SS)。

实模式下的IVT位于地址0000:0000,受保护模式下的IDT位于地址IDT:0000,其中IDT可通过LIDT / SIDT指令访问。

您还应该考虑到,如果您在虚拟内存操作系统上运行,则无法直接访问物理内存,程序中的地址是在分段和分页后转换为物理地址的虚拟地址

答案 2 :(得分:0)

已解决:),因为有BIOS,它已经构建了GDT / IDT,所以我使用sidt和sgdt指令找到了IDT的地址,并且我将我的ISR添加到了sidt