查看“BIOS”的源代码
←
BIOS
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
BIOS(基本输入/输出系统)的创建是为了向早期的PC系统程序员提供通用的低级服务。 基本目标是:对操作系统和应用程序隐藏(尽可能多地)PC型号和硬件的变化, 并且使操作系统和应用程序开发更容易(因为BIOS服务处理了大部分硬件级接口)。 这些BIOS服务仍在使用(特别是在启动期间),通常称为“BIOS功能”。 在[[Real Mode]]中,可以使用[[Assembly]]语言通过[[software interrupts]]轻松访问它们。 ==BIOS功能== 要访问BIOS功能,通常需要将AH[[CPU寄存器x86 | CPU寄存器]](或AX或EAX)设置为特定值,然后执行以下操作: 整数操作码。 AH(或AX,或EAX)中的值与所选的特定中断数相结合,请求特定的中断 BIOS功能。 (其他CPU寄存器保存函数的任何“参数”,通常还保存函数的返回值。) 通过指定中断号和值来创建BIOS函数列表是最简单的 用于选择函数的AH(或AX或EAX)。 在讨论中以这种方式提及特定BIOS功能也是最容易的。 例如 INT 0x13,AH=0是重置硬盘或软盘的BIOS函数。 注:INT和AH值始终以十六进制表示法列出。 在INT操作码中意外使用十进制值 是使用BIOS功能时常见的错误源。 在某种程度上,BIOS功能是按中断号组织的: * INT 0x10 = 视频显示功能(包括VESA/VBE) * INT 0x13 = 大容量存储(磁盘、软盘)访问 * INT 0x15 = 内存大小函数 * INT 0x16 = 键盘功能 有关BIOS功能的详细列表,请访问[[RBIL]]。 不幸的是,个人电脑行业从来都不善于维护标准。 所以每个PC制造商和每个BIOS 制造商随机制造了新的BIOS功能。 也可以“钩住”这些中断中的任何一个,并插入额外的中断 模拟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 -- 硬件检测 (see [[ATA_in_x86_RealMode_(BIOS)|ATA using BIOS]] for more detail on these BIOS function calls) * 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 notes=== 每个BIOS功能(如RBIL中所述)都有一组特定的“结果”寄存器。 除了列出的登记册, BIOS函数应该完全保留所有其他寄存器值。 Bochs的早期版本(低于2.3) 这有点小问题。 所有32位扩展寄存器(即EBX、ECX)的下半部分都被正确保留,但 一些寄存器的高位字被破坏了。 BIOS功能本身永远不会崩溃。如果出现任何错误,他们将: * almost always set the carry flag (test with JC), * sometimes return "ah = 0x86 (unsupported function)", * sometimes return "ah = 0x80 (invalid command)" * or (for seriously buggy BIOSes) return with nothing changed. 尝试始终测试这些错误返回,因为在许多情况下,BIOS功能可能会返回有效的错误 (but very wrong) data -- rather than an error code. ==BIOS in Protected Mode== 不幸的是,在[[Protected mode]]中,几乎所有BIOS功能都不可用,尽管如此,尝试调用它们仍会导致异常或错误 不可靠的响应(因为“段”值的处理方式不同)。 但有些较新的服务(如SMBios、PCI、PnP或VBE) 提供与32位保护模式兼容的接口。 如果在CPU切换到保护模式后必须使用实模式BIOS功能,请参阅[[Virtual 8086 Mode]], 或者退出保护模式,并立即返回[[实际模式]]。 这两种方法都存在严重问题,因此,任何对BIOS的调用都应在任何物理设备通过代码编程之前完成: * BIOS calls may use interrupts, which means that you need to forward IRQs or map the PIC back to its original configuration. * BIOS calls may access devices that you have already configured - notably the PIT and PIC * BIOS calls can enter protected mode on their own to access MMIO registers, which is beyond the limits of virtual 8086 mode. * 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 in Long Mode== 就像在[[保护模式]]中一样,[[长模式]]中也无法使用BIOS功能。 不幸的是,没有[[虚拟8086模式]]来救援。 必须立即切换到[[实模式]],或模拟CPU并通过软件解释操作码。 后一种方法的所有必要信息都可以在Intel和AMD文档中找到。 ==Additional Information from the BIOS== 从BIOS中获得的大多数有用信息将来自调用BIOS函数。 然而,有一小部分 可以获取的附加信息的数量。 一些BIOS检测/状态结果存储在[[内存映射(x86)#BIOS数据区.28BDA.29 | BIOS数据区]]中。 Additional information is kept in the [[CMOS]] chip. == See Also == === Articles === * [[Real Mode OS Warning]] * [[DMI]] === 话题 === * [[Topic:23125|ASM example code about how to call BIOS function from Long Mode (by switching into RM and back again)]] === 外部链接 === * [[wikipedia:BIOS | BIOS on Wikipedia]] * [http://www.ctyme.com/intr/int.htm http://www.ctyme.com/intr/int.htm] * [http://classiccomputers.info/down/IBM_PS2/documents/PS2_and_PC_BIOS_Interface_Technical_Reference_Apr87.pdf 1987 IBM BIOS Technical Reference] [[Category:X86]] [[Category:BIOS]] [[Category:Firmware]] [[de:Basic Input Output System]]
返回至“
BIOS
”。
导航菜单
个人工具
登录
命名空间
页面
讨论
变体
已展开
已折叠
查看
阅读
查看源代码
查看历史
更多
已展开
已折叠
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
工具
链入页面
相关更改
特殊页面
页面信息