【问题标题】:What is the difference between int 0x21 and int 0x80?int 0x21 和 int 0x80 有什么区别?
【发布时间】:2021-04-02 23:51:45
【问题描述】:

我最近接触了低级编程并了解了系统中断。据我了解,这两个中断都负责系统调用,但是我不明白两者之间的区别,以及何时使用哪个。希望得到解释。

【问题讨论】:

  • 针对不同操作系统的 ABI(系统调用约定)基本不同。 DOS 和 Linux(以及 BSD / MacOS)也有不同的 API,不同的函数集/系统调用可用,因此不一定有 Linux 系统调用等效于某些 DOS 的东西,反之亦然。 (对于 BIOS int 0x10 控制台屏幕内容尤其如此:在 Linux 中,您没有仅针对控制台屏幕和键盘的特殊系统调用,除非您甚至打开原始键盘或 USB HID 或 PS,否则您总是在处理 TTY 层/2 事件驱动程序)
  • 这就像问“DIRls 有什么区别”。它们是两种不同的机制,两个不同的系统通过它们完成类似的任务。

标签: linux assembly x86 system-calls dos


【解决方案1】:

int 21h(拼写为 MASM/TASM 语法,因为这是 DOS 最广泛使用的汇编程序)是 DOS 的系统调用中断。您可以在 Internet 上轻松找到可用服务的文档。可以从 DOS 程序访问的最重要的 DOS 服务的简短列表位于 http://spike.scu.edu.au/~barry/interrupts.html

另一方面,int 0x80(用气体语法拼写,因为这是 Linux 的“本机”汇编程序)是 32 位英特尔处理器上 Linux 的系统调用中断。你没有得到关于如何使用它的漂亮表格,就像你在 DOS 中得到的那样,因为你通常不直接调用它。如果你想直接调用它,看the manpage for syscall,看看你需要设置哪些寄存器,在哪里可以找到结果。例如,您可以在 https://fedora.juszkiewicz.com.pl/syscalls.html 找到系统调用的编号。

当调用int 21hint 0x80 时,程序的行为不是由 Intel 或 80386 处理器架构定义的。相反,int 指令要求处理器在入口点表(“中断描述符表”)中查找入口点,然后跳转到该入口点。这种跳转可能包括从用户空间切换到内核空间(如果处理器运行在支持不同权限级别的模式下)。 DOS 将入口点编号 21h 设置为指向提供大多数 DOS 服务的调度函数。另一方面,Linux/i386 设置入口点编号 0x80 以指向提供所有 linux 内核服务的调度函数。这意味着使用int 0x80 的程序只有在Linux(或兼容的,如Linux 的windows 子系统,版本1)环境中执行时才能工作,而使用int 21h 的程序只有在它是在 DOS(或 DOSBox 或 OS/2 DOS 窗口等兼容环境)下执行。

【讨论】:

  • int 21hint 0x80处理程序行为 不是英特尔定义的。另一方面,int 21hint 0x80 的行为完全由英特尔定义。(这就是你详细解释的内容)
  • 有像chromium.googlesource.com/chromiumos/docs/+/master/constants/…这样的Linux系统调用的“漂亮表”。但是您不需要它们,因为知道调用约定可以让您知道哪个 arg 来自手册页中的 C 原型。即 ABI 规则记录一次,而不是单独记录每个系统调用,包括表示 -errno 的值范围(-4095-1
猜你喜欢
  • 1970-01-01
  • 2012-09-17
  • 2020-05-05
  • 2015-11-04
  • 1970-01-01
  • 1970-01-01
  • 2014-10-20
  • 2017-02-23
  • 1970-01-01
相关资源
最近更新 更多