“BIOS”的版本间差异

来自osdev
跳到导航 跳到搜索
(创建页面,内容为“BIOS(基本输入/输出系统)的创建是为了向早期的PC系统程序员提供通用的低级服务。 基本目标是:对操作系统和应用程序隐藏(尽可能多地)PC型号和硬件的变化, 并且使操作系统和应用程序开发更容易(因为BIOS服务处理了大部分硬件级接口)。 这些BIOS服务仍在使用(特别是在启动期间),通常称为“BIOS功能”。 在Real Mode中,可以使用Assembl…”)
 
第1行: 第1行:
BIOS(基本输入/输出系统)的创建是为了向早期的PC系统程序员提供通用的低级服务。
BIOS(Basic Input/Output System)的创建是为了向早期的PC系统程序员提供通用的低级服务。
基本目标是:对操作系统和应用程序隐藏(尽可能多地)PC型号和硬件的变化,
基本目标是:对操作系统和应用程序隐藏(尽可能多地)PC型号和硬件的变化,
并且使操作系统和应用程序开发更容易(因为BIOS服务处理了大部分硬件级接口)。
并且使操作系统和应用程序开发更容易(因为BIOS服务处理了大部分硬件级接口)。


这些BIOS服务仍在使用(特别是在启动期间),通常称为“BIOS功能”。
这些BIOS服务仍在使用(特别是在启动期间),通常称为“BIOS功能”。(译者注:这里的BIOS functions不再翻译为“函数”,因为它们在BIOS里不是通过传统语言传参的方式调用的,而是通过设置寄存器和软中断的方式调用的。)
在[[Real Mode]]中,可以使用[[Assembly]]语言通过[[software interrupts]]轻松访问它们。
在[[Real Mode|实模式]]中,可以使用[[Assembly|汇编]]语言通过[[software interrupts|软件中断]]轻松访问它们。


==BIOS功能==
==BIOS功能==


要访问BIOS功能,通常需要将AH[[CPU寄存器x86 | CPU寄存器]](或AX或EAX)设置为特定值,然后执行以下操作:
要访问BIOS功能,通常需要将AH[[CPU Registers x86| CPU寄存器]](或AX或EAX)设置为特定值,然后执行一个INT机器操作码。 AH(或AX,或EAX)中的值与所选的特定中断编号相结合,就会请求调用特定的中断的BIOS功能。 (其它CPU寄存器不仅用于保存功能的“参数”,通常还保存功能调用的返回值。)
整数操作码。 AH(或AX,或EAX)中的值与所选的特定中断数相结合,请求特定的中断
BIOS功能。 (其他CPU寄存器保存函数的任何“参数”,通常还保存函数的返回值。)


通过指定中断号和值来创建BIOS函数列表是最简单的
所以通过说明中断号和选择功能的AH(或AX,或EAX)值来展示BIOS功能列表是最方便的。 本文在讨论中也以这种方式提及特定BIOS功能。 例如
用于选择函数的AH(或AX或EAX)。 在讨论中以这种方式提及特定BIOS功能也是最容易的。 例如
INT 0x13,AH=0是重置硬盘或软盘的BIOS功能。
INT 0x13,AH=0是重置硬盘或软盘的BIOS函数。


注:INT和AH值始终以十六进制表示法列出。 在INT操作码中意外使用十进制值
注:INT和AH值始终以十六进制表示法列出。 在使用BIOS功能时,在INT操作码中意外使用十进制值是非常常见的错误来源。
是使用BIOS功能时常见的错误源。


在某种程度上,BIOS功能是按中断号组织的:
在某种程度上,BIOS功能是按中断号组织的:
* INT 0x10 = 视频显示功能(包括VESA/VBE)
* INT 0x10 = 视频显示功能(包括VESA/VBE)
* INT 0x13 = 大容量存储(磁盘、软盘)访问
* INT 0x13 = 大容量存储(磁盘、软盘)访问
* INT 0x15 = 内存大小函数
* INT 0x15 = 内存大小功能
* INT 0x16 = 键盘功能
* INT 0x16 = 键盘功能


有关BIOS功能的详细列表,请访问[[RBIL]]。
有关BIOS功能的详细列表,请访问[[RBIL]]。


不幸的是,个人电脑行业从来都不善于维护标准。 所以每个PC制造商和每个BIOS
不幸的是,个人电脑行业从来都不善于维护标准。 因此,每个PC制造商和每个BIOS制造商都随机组合了新的BIOS功能。 还可能“拦截Hook”这些中断中的任何一个,并插入模拟原BIOS功能的额外功能。 早期的PC硬件和软件制造商经常这样做。 因此,最终出现了数以千计的BIOS功能(或模拟功能)。 RBIL列表非常庞大,并且大部分都充满了仅在与某些完全过时的计算机、BIOS或硬件或软件结合使用时才起作用的功能。
制造商随机制造了新的BIOS功能。 也可以“钩住”这些中断中的任何一个,并插入额外的中断
模拟BIOS功能的函数。 早期的PC硬件和软件制造商经常这样做。 因此,最终的结果是
数千个BIOS功能(或模拟)。 RBIL列表非常庞大,并且大部分都是只包含
与一些完全过时的计算机、BIOS或硬件或软件结合使用时工作。


===共同功能===
===共同功能===


不幸的是,RBIL并没有明确指出哪些BIOS功能是“通用的”(从某种意义上说)。 也就是说,那些总是可用的,
不幸的是,RBIL并没有明确指出哪些BIOS功能是“通用的”(从某种意义上说)。 通用功能的要求是那些功能总是可用的,并且每个人都要使用的。 这在一定程度上是因为“标准”BIOS功能随着时间的推移而增长,所以如果你追溯到足够远的时间,你通常会发现一台计算机几乎不支持任何特定的BIOS功能。
而且每个人都使用。 部分原因是“标准”BIOS功能随着时间的推移而增长,因此,如果您回溯的时间足够长,您可以
通常会找到一台几乎不支持任何特定BIOS功能的计算机。
但肯定有一套是目前大多数操作系统中常用的。
但肯定有一套是目前大多数操作系统中常用的。


* INT 0x10, AH = 1 -- 设置光标
* INT 0x10, AH = 1 -- 设置光标
* INT 0x10, AH = 3 -- 光标位置
* INT 0x10, AH = 3 -- 光标定位
* INT 0x10, AH = 0xE -- 显示字符
* INT 0x10, AH = 0xE -- 显示字符
* INT 0x10, AH = 0xF -- 获取视频页面和模式
* INT 0x10, AH = 0xF -- 获取视频页面和模式
第57行: 第47行:
* INT 0x11 -- 硬件检测
* INT 0x11 -- 硬件检测


(see [[ATA_in_x86_RealMode_(BIOS)|ATA using BIOS]] for more detail on these BIOS function calls)
(有关这些BIOS功能调用的更多详细信息,请参见 [[ATA_in_x86_RealMode _(BIOS)| ATA使用BIOS]])
* INT 0x13, AH = 0 -- reset floppy/hard disk
* INT 0x13, AH = 0 -- reset floppy/hard disk
* INT 0x13, AH = 2 -- read floppy/hard disk in CHS mode
* INT 0x13, AH = 2 -- read floppy/hard disk in CHS mode
第87行: 第77行:




===ASM notes===
===ASM 提醒===


每个BIOS功能(如RBIL中所述)都有一组特定的“结果”寄存器。 除了列出的登记册,
每个BIOS功能(如RBIL中所述)都有一组特定的“结果”寄存器。 除了列出的那些寄存器之外,BIOS功能应该完美地保留所有其它寄存器值。 早期版本的Bochs (2.3以下) 对此有一个小问题。 所有32位扩展寄存器(即EBX、ECX)的下半部分都得到了适当的保留,但一些寄存器的上半部分被破坏。
BIOS函数应该完全保留所有其他寄存器值。 Bochs的早期版本(低于2.3)
这有点小问题。 所有32位扩展寄存器(即EBX、ECX)的下半部分都被正确保留,但
一些寄存器的高位字被破坏了。


BIOS功能本身永远不会崩溃。如果出现任何错误,他们将:
BIOS功能本身永远不会崩溃。如果出现任何错误,他们将:
* almost always set the carry flag (test with JC),
* 几乎总是设置进位标志(使用JC进行测试)
* sometimes return "ah = 0x86 (unsupported function)",
* 有时返回 “ah = 0x86 (不支持的功能)”,
* sometimes return "ah = 0x80 (invalid command)"
* 有时返回“ah=0x80(无效命令)”
* or (for seriously buggy BIOSes) return with nothing changed.
* 或者(对于有严重缺陷的BIOS)返回时不做任何更改。


尝试始终测试这些错误返回,因为在许多情况下,BIOS功能可能会返回有效的错误
尽量始终检查这些错误返回,因为在许多情况下,BIOS功能可能返回有效(但非常错误)的数据,而不是错误代码。
(but very wrong) data -- rather than an error code.


==BIOS in Protected Mode==
== 保护模式下的BIOS ==


不幸的是,在[[Protected mode]]中,几乎所有BIOS功能都不可用,尽管如此,尝试调用它们仍会导致异常或错误
不幸的是,在[[Protected mode|保护模式]]中,几乎所有BIOS功能都不可用,尝试调用它们会导致异常或不可靠的响应(因为处理“段”值的方式不同)。 但是,一些较新的服务(如SMBios、PCI、PnP或VBE)提供与32位保护模式兼容的接口。
不可靠的响应(因为“段”值的处理方式不同)。 但有些较新的服务(如SMBios、PCI、PnP或VBE)
提供与32位保护模式兼容的接口。


如果在CPU切换到保护模式后必须使用实模式BIOS功能,请参阅[[Virtual 8086 Mode]]
如果在CPU切换到保护模式后必须使用实模式BIOS功能,那么请参阅 [[Virtual 8086 Mode|虚拟8086模式]],或者退出保护模式,并立即返回 [[Real Mode|实模式]]。 这两种方法都有严重的问题,所以任何对BIOS的调用都应该在物理设备已通过代码编程之前完成,因为:
或者退出保护模式,并立即返回[[实际模式]]。 这两种方法都存在严重问题,因此,任何对BIOS的调用都应在任何物理设备通过代码编程之前完成:


* BIOS calls may use interrupts, which means that you need to forward IRQs or map the PIC back to its original configuration.
* BIOS调用可能使用中断,这意味着你需要转发IRQ或将PIC映射回其原始配置。
* BIOS calls may access devices that you have already configured - notably the PIT and PIC
* BIOS调用可能会访问你已经配置的设备-尤其是PIT和PIC
* BIOS calls can enter protected mode on their own to access MMIO registers, which is beyond the limits of virtual 8086 mode.
* BIOS调用可以自行进入保护模式以访问MMIO寄存器,这超出了虚拟8086模式的限制。
* In real mode, you have no way of managing interrupts and your drivers may get stuck for interrupts being lost.
* 在实模式下,你无法管理中断,并且你的驱动程序可能会因为丢失中断而卡住。
* In real mode, you have no control over time, performance and security guarantees.
* 在实模式下,你无法控制时间,性能和安全性保证。


唯一的设备是视频BIOS,它通常不与主板捆绑在一起,因此也不能依赖BIOS服务。 大多数当前的操作系统(无论是商业操作系统还是业余操作系统)都使用v8086监视器或仿真器来支持没有本地驱动程序的图形设备。因此,许多BIOS都已针对这种设置进行了测试。
唯一的设备是视频BIOS,它通常不与主板捆绑在一起,因此也不能依赖BIOS服务。 大多数当前的操作系统(无论是商业操作系统还是业余操作系统)都使用v8086监视器或仿真器来支持没有本地驱动程序的图形设备。因此,许多BIOS都已针对这种设置进行了测试。


==BIOS in Long Mode==
==长模式下的BIOS==


就像在[[保护模式]]中一样,[[长模式]]中也无法使用BIOS功能。 不幸的是,没有[[虚拟8086模式]]来救援。 必须立即切换到[[实模式]],或模拟CPU并通过软件解释操作码。 后一种方法的所有必要信息都可以在Intel和AMD文档中找到。
就像在[[Protected Mode|保护模式]]中一样,[[Long Mode|长模式]]中也无法使用BIOS功能。 不幸的是,没有[[Virtual 8086 Mode|虚拟8086模式]]来挽救这种情况。 必须立即切换到[[Real Mode|实模式]],或模拟CPU并通过软件解释操作码。 后一种方法的所有必要信息都可以在Intel和AMD文档中找到。


==Additional Information from the BIOS==
==来自BIOS的其它信息==


从BIOS中获得的大多数有用信息将来自调用BIOS函数。 然而,有一小部分
从BIOS中获得的大多数有用信息将来自调用BIOS功能。 但是,其它地方还可以获取少量的附加信息。
可以获取的附加信息的数量。


一些BIOS检测/状态结果存储在[[内存映射(x86)#BIOS数据区.28BDA.29 | BIOS数据区]]中。
一些BIOS检测/状态结果存储在[[Memory Map (x86)#BIOS Data Area .28BDA.29| BIOS Data Area]]中。


Additional information is kept in the [[CMOS]] chip.
还有一些附加信息保存在[[CMOS]]芯片中。


== See Also ==
== 另见 ==


=== Articles ===
=== 文章===
* [[Real Mode OS Warning]]
* [[Real Mode OS Warning]]
* [[DMI]]
* [[DMI]]


=== 话题 ===
=== 论坛主题 ===
* [[Topic:23125|ASM example code about how to call BIOS function from Long Mode (by switching into RM and back again)]]
* [[Topic:23125|ASM example code about how to call BIOS function from Long Mode (by switching into RM and back again)]]



2022年2月21日 (一) 02:31的版本

BIOS(Basic Input/Output System)的创建是为了向早期的PC系统程序员提供通用的低级服务。 基本目标是:对操作系统和应用程序隐藏(尽可能多地)PC型号和硬件的变化, 并且使操作系统和应用程序开发更容易(因为BIOS服务处理了大部分硬件级接口)。

这些BIOS服务仍在使用(特别是在启动期间),通常称为“BIOS功能”。(译者注:这里的BIOS functions不再翻译为“函数”,因为它们在BIOS里不是通过传统语言传参的方式调用的,而是通过设置寄存器和软中断的方式调用的。) 在实模式中,可以使用汇编语言通过软件中断轻松访问它们。

BIOS功能

要访问BIOS功能,通常需要将AH CPU寄存器(或AX或EAX)设置为特定值,然后执行一个INT机器操作码。 AH(或AX,或EAX)中的值与所选的特定中断编号相结合,就会请求调用特定的中断的BIOS功能。 (其它CPU寄存器不仅用于保存功能的“参数”,通常还保存功能调用的返回值。)

所以通过说明中断号和选择功能的AH(或AX,或EAX)值来展示BIOS功能列表是最方便的。 本文在讨论中也以这种方式提及特定BIOS功能。 例如 INT 0x13,AH=0是重置硬盘或软盘的BIOS功能。

注:INT和AH值始终以十六进制表示法列出。 在使用BIOS功能时,在INT操作码中意外使用十进制值是非常常见的错误来源。

在某种程度上,BIOS功能是按中断号组织的:

  • INT 0x10 = 视频显示功能(包括VESA/VBE)
  • INT 0x13 = 大容量存储(磁盘、软盘)访问
  • INT 0x15 = 内存大小功能
  • INT 0x16 = 键盘功能

有关BIOS功能的详细列表,请访问RBIL

不幸的是,个人电脑行业从来都不善于维护标准。 因此,每个PC制造商和每个BIOS制造商都随机组合了新的BIOS功能。 还可能“拦截Hook”这些中断中的任何一个,并插入模拟原BIOS功能的额外功能。 早期的PC硬件和软件制造商经常这样做。 因此,最终出现了数以千计的BIOS功能(或模拟功能)。 RBIL列表非常庞大,并且大部分都充满了仅在与某些完全过时的计算机、BIOS或硬件或软件结合使用时才起作用的功能。

共同功能

不幸的是,RBIL并没有明确指出哪些BIOS功能是“通用的”(从某种意义上说)。 通用功能的要求是那些功能总是可用的,并且每个人都要使用的。 这在一定程度上是因为“标准”BIOS功能随着时间的推移而增长,所以如果你追溯到足够远的时间,你通常会发现一台计算机几乎不支持任何特定的BIOS功能。 但肯定有一套是目前大多数操作系统中常用的。

  • INT 0x10, AH = 1 -- 设置光标
  • INT 0x10, AH = 3 -- 光标定位
  • INT 0x10, AH = 0xE -- 显示字符
  • INT 0x10, AH = 0xF -- 获取视频页面和模式
  • INT 0x10, AH = 0x11 -- 设置8x8字体
  • INT 0x10, AH = 0x12 -- 检测EGA/VGA
  • INT 0x10, AH = 0x13 -- 显示字符串
  • INT 0x10, AH = 0x1200 -- 交替打印屏幕
  • INT 0x10, AH = 0x1201 -- 关闭光标模拟
  • INT 0x10, AX = 0x4F00 -- 视频内存大小
  • INT 0x10, AX = 0x4F01 -- 获取模式信息呼叫
  • INT 0x10, AX = 0x4F02 -- 选择VESA视频模式
  • INT 0x10, AX = 0x4F0A -- VESA 2.0保护模式接口


  • INT 0x11 -- 硬件检测

(有关这些BIOS功能调用的更多详细信息,请参见 ATA使用BIOS)

  • INT 0x13, AH = 0 -- reset floppy/hard disk
  • INT 0x13, AH = 2 -- read floppy/hard disk in CHS mode
  • INT 0x13, AH = 3 -- write floppy/hard disk in CHS mode
  • INT 0x13, AH = 0x15 -- detect second disk
  • INT 0x13, AH = 0x41 -- test existence of INT 13 extensions
  • INT 0x13, AH = 0x42 -- read hard disk in LBA mode
  • INT 0x13, AH = 0x43 -- write hard disk in LBA mode


(see Detecting Memory (x86) for more detail on these BIOS function calls)

  • INT 0x12 -- get low memory size
  • INT 0x15, EAX = 0xE820 -- get complete memory map
  • INT 0x15, AX = 0xE801 -- get contiguous memory size
  • INT 0x15, AX = 0xE881 -- get contiguous memory size
  • INT 0x15, AH = 0x88 -- get contiguous memory size


  • INT 0x15, AH = 0xC0 -- Detect MCA bus
  • INT 0x15, AX = 0x0530 -- Detect APM BIOS
  • INT 0x15, AH = 0x5300 -- APM detect
  • INT 0x15, AX = 0x5303 -- APM connect using 32 bit
  • INT 0x15, AX = 0x5304 -- APM disconnect


  • INT 0x16, AH = 0 -- read keyboard scancode (blocking)
  • INT 0x16, AH = 1 -- read keyboard scancode (non-blocking)
  • INT 0x16, AH = 3 -- keyboard repeat rate


ASM 提醒

每个BIOS功能(如RBIL中所述)都有一组特定的“结果”寄存器。 除了列出的那些寄存器之外,BIOS功能应该完美地保留所有其它寄存器值。 早期版本的Bochs (2.3以下) 对此有一个小问题。 所有32位扩展寄存器(即EBX、ECX)的下半部分都得到了适当的保留,但一些寄存器的上半部分被破坏。

BIOS功能本身永远不会崩溃。如果出现任何错误,他们将:

  • 几乎总是设置进位标志(使用JC进行测试),
  • 有时返回 “ah = 0x86 (不支持的功能)”,
  • 有时返回“ah=0x80(无效命令)”
  • 或者(对于有严重缺陷的BIOS)返回时不做任何更改。

尽量始终检查这些错误返回,因为在许多情况下,BIOS功能可能返回有效(但非常错误)的数据,而不是错误代码。

保护模式下的BIOS

不幸的是,在保护模式中,几乎所有BIOS功能都不可用,尝试调用它们会导致异常或不可靠的响应(因为处理“段”值的方式不同)。 但是,一些较新的服务(如SMBios、PCI、PnP或VBE)提供与32位保护模式兼容的接口。

如果在CPU切换到保护模式后必须使用实模式BIOS功能,那么请参阅 虚拟8086模式,或者退出保护模式,并立即返回 实模式。 这两种方法都有严重的问题,所以任何对BIOS的调用都应该在物理设备已通过代码编程之前完成,因为:

  • BIOS调用可能使用中断,这意味着你需要转发IRQ或将PIC映射回其原始配置。
  • BIOS调用可能会访问你已经配置的设备-尤其是PIT和PIC
  • BIOS调用可以自行进入保护模式以访问MMIO寄存器,这超出了虚拟8086模式的限制。
  • 在实模式下,你无法管理中断,并且你的驱动程序可能会因为丢失中断而卡住。
  • 在实模式下,你无法控制时间,性能和安全性保证。

唯一的设备是视频BIOS,它通常不与主板捆绑在一起,因此也不能依赖BIOS服务。 大多数当前的操作系统(无论是商业操作系统还是业余操作系统)都使用v8086监视器或仿真器来支持没有本地驱动程序的图形设备。因此,许多BIOS都已针对这种设置进行了测试。

长模式下的BIOS

就像在保护模式中一样,长模式中也无法使用BIOS功能。 不幸的是,没有虚拟8086模式来挽救这种情况。 必须立即切换到实模式,或模拟CPU并通过软件解释操作码。 后一种方法的所有必要信息都可以在Intel和AMD文档中找到。

来自BIOS的其它信息

从BIOS中获得的大多数有用信息将来自调用BIOS功能。 但是,其它地方还可以获取少量的附加信息。

一些BIOS检测/状态结果存储在 BIOS Data Area中。

还有一些附加信息保存在CMOS芯片中。

另见

文章

论坛主题

外部链接

de:Basic Input Output System