【问题标题】:difference of 'INT' instruction between Linux and WindowsLinux和Windows之间'INT'指令的区别
【发布时间】:2017-07-15 08:07:32
【问题描述】:

我编写了一些代码来制作自己的操作系统并学习 x86 汇编语言。在学习 x86 汇编语言时,我开始想知道中断。看下面的汇编代码:

mov ah, 2
mov dl, 'A'
int 0x21

此代码将“A”打印到屏幕上。它适用于 MS-DOS。

mov eax, 1
mov ebx, 0
int 0x80

此代码使程序退出。它适用于 Linux。最后一个:

mov ah, 2
mov al, 1
mov ch, 0
mov cl, 2
mov dh, 0
mov dl, 0
int 0x13

我编写此代码是为了从磁盘复制内核代码。此代码包含在 MBR 扇区中。因此执行此代码时没有操作系统。我有一个问题。

假设有人执行“int”指令来调用中断,如果该“int”指令在 MBR 扇区上执行,它会调用 BIOS 例程。但是我想知道那个'int'指令是否在Linux或Windows上执行,会发生什么?它是指 Linux/Windows 中断向量或 BIOS 例程,与 MBR 扇区的情况相同吗?

坦率地说,我尝试在 Linux 上执行第一个代码时进行了测试,但没有成功。我认为'int'指令的结果取决于操作系统。如果不是真的,有没有人可以告诉我真相或任何想法?

【问题讨论】:

  • 如果你读过一点操作系统的实现,你应该知道int(或其他平台上的其他类似指令)通常被用作调用操作系统特定的一种方式功能。所以不,你不能使用 BIOS 或 DOS int“调用”并在其他任何地方使用它们。
  • 是的,INT 取决于它们的设置方式。 BIOS 将它们设置为一种默认方式,操作系统可以根据需要更改它们。更多信息wiki.osdev.org/Interrupts
  • BIOS 中断是实模式代码,直接在 pmode 中执行时不起作用

标签: assembly operating-system bios


【解决方案1】:

int 指令引发软件中断。这会导致 CPU 执行 中断描述表(IDT)中的中断处理程序 )。启动时,BIOS 设置一个 IDT,其中包含许多执行一些基本服务的中断处理程序。 DOS 将其自己的中断处理程序添加到此表中以提供 DOS 特定的功能。

现代操作系统在保护模式下运行。在这种模式下,BIOS 服务无法运行,因为它们被编写为在实模式下执行。现代操作系统通常用自定义表替换标准中断描述表。因此,DOS 和 BIOS 服务均不可用。

【讨论】:

  • 虽然真正的 DOS 和 BIOS 服务不可用,但保护模式操作系统通常会模拟它们的功能。这就是为什么大多数为 DOS 编写的程序可以直接在 Windows 中运行的原因。
  • @vitsoft:仅在以虚拟 8086 模式运行的 DOS 程序中,具有完整的传统 PC 模拟系统,该系统模拟具有 VGA 硬件和 DOS 的整个 16 位机器。 不在本机 Windows 可执行文件中。这就是为什么 64 位 Windows 内核不能以相同的方式为 .com 和 16 位 DOS .exes 提供相同的 NTVDM 支持 - x86-64 不支持 virtual-8086 作为 long 的子模式-模式。如果说 32 位 Windows 只是模拟 DOS 和 BIOS 服务,那是过于简单化了。这是一个完整的硬件虚拟化。
【解决方案2】:

INT 指令触发异常几乎就像被零除导致异常一样。不同之处在于 INT 允许您指定要触发的异常。

操作系统必须定义一个异常和中断处理程序表。表的位置和大小由硬件寄存器 IDTR 定义。各种异常(如除以零)具有分配的异常编号。 (INT 允许指定任何异常编号。)

https://en.wikipedia.org/wiki/Interrupt_descriptor_table

当异常(或中断)发生时,CPU 使用异常/中断号作为表中的索引并调用特定的处理程序。

操作系统定义了中断和异常的表和处理程序,因此它们是不同数量的操作系统。

【讨论】:

    猜你喜欢
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    相关资源
    最近更新 更多