【问题标题】:Is there a way to get the list of all BIOS interrupts present on the current system programmatically?有没有办法以编程方式获取当前系统上存在的所有 BIOS 中断列表?
【发布时间】:2019-08-28 12:51:28
【问题描述】:

我正在查找我的 PC 提供的 BIOS 中断列表。

要获得最常见的 BIOS 调用,有各种公共资源,但我希望获得我的 PC 的所有(可能不是非常公开的)BIOS 调用的列表。

是否有一个程序可以做到这一点,或者我可以用任何方式编写一个(最好是汇编或 C 语言)?

我的目标是避免 BIOS 反汇编。我也知道 BIOS 的低级 API 比较相似,因此 API 调用列表也很相似。

【问题讨论】:

  • 原始问题要求提供列表,这违反了“资源请求”规则。似乎不同意该规则的 Meta 答案建议将问题更改为询问如何以编程方式获取该列表,我同意这更切题。但是,我不相信这是实际的问题,我想知道关于程序调用是否仅仅是重新提出问题的一种手段,所以我不确定是否值得重新投票。不过,您似乎已经收到了满意的答案。
  • 以编程方式获取列表的答案也很有用。我同意编辑,每个都同样有用。
  • 好的,很公平 - 感谢您如此建设性地参与元讨论。既然有兴趣打开这个,我就投最后一个。

标签: assembly x86 bios real-mode


【解决方案1】:

Ralf Brown's interrupt list”可能对你有帮助。

该网站列出了 x86 系统上最常用的中断:

不仅列出了 BIOS 中断,还列出了 MS-DOS 中断和常用程序使用的中断。这包括列出 Linux 系统调用(中断 0x80)的部分。

...即请不要包含...

不幸的是,您必须将“常见”BIOS 中断、仅存在于某些 BIOS 中的中断和 MS-DOS 中断分开。

但是,对于许多中断,列表中的内容类似于:“仅存在于 Example Software Inc. 制造的 BIOS 中。”

...我最近的编辑...

如果我的理解正确,您希望有某种 API 来告诉您某个系统上存在哪些中断。

很遗憾,这样的 API 不存在:

BIOS 不一定是一个单一的软件。相反,某些硬件组件(例如显卡)可能有自己的固件。

此类组件的固件通常没有自己的中断,但它可以通过更改中断向量为 BIOS 中断添加功能。

显卡的固件可以通过改变中断向量将函数AX=5678h添加到int 10h,使其指向以下代码:

new_int_10_vector:
    cmp ax, 5678h
    je new_function

    ; (In reality, the next line is not as simple as shown here)
    jmp original_int_10_vector

new_function:
    ; Perform the "new" function "AX=5678h" of "int 10h"
    ; ...
    iret

如果现代 BIOS 供应商想要引入列出所有支持的功能(您正在寻找的功能)的功能,他们会遇到问题:

BIOS应该如何检测到显卡固件在int 10h中增加了AX=5678h的附加功能?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 2016-07-31
    相关资源
    最近更新 更多