本文共 1347 字,大约阅读时间需要 4 分钟。
A20地址线是PC兼容计算机中一个关键的硬件特性,用于解决在80286扩展后的寻址问题。本文将详细介绍A20地址线的工作原理及其在实模式和保护模式中的应用。
8086/8088系列CPU仅有20位地址总线,因此在实模式下,最大的寻址空间为0xFFFFF,即10FFEFH。为了向下兼容,系统采用段和偏移的组合方式进行内存寻址。当地址超过16位时(即达到100000H),系统需要采取取模处理,使得实际访问的物理内存地址为偏移量的低16位。
随着80286的推出,CPU地址总线扩展到了24位,理论上最大寻址为16M(0x1000000)。这意味着系统需要一种新的方法来处理低16位的高寻址空间,以确保向下兼容性。因而,第21位地址线(A20)被设计为控制门,用于允许或阻止对上述高寻址空间的访问。
A20门的作用相当于一个虚拟开关:
启用A20门:当A20门打开时,系统允许直接访问0x100000H到0x10FFEFH范围内的物理内存地址。这样,在实模式下,程序员可以访问较大的内存块,必要时进行操作。
禁用A20门:若A20门关闭,系统会将0x100000H到0x10FFEFH范围内的内存地址自动映射到0x000000H到0xFFFEFH。这意味着在实模式下,程序员无法直接访问超过0xFFFFFH的内存,必须进入保护模式才能访问高寻址空间。
在实际操作中,系统需要确保A20门处于正确状态。以下是启用A20门的典型流程:
检测A20当前状态:通过调用a20_test
函数检测A20门是否启用。这一函数利用段寄存器和堆栈指针,间接读取指定地址的内容来确认A20门的状态。
调用BIOS功能:执行INT 0x15, AX=0x2401
指令,请求BIOS尝试启用A20门。如果成功,A20门将被设置为启用状态。
尝试通过KBC启用:如果BIOS方法未成功,系统将通过键盘控制器(KBC)发送特定命令,强制启用A20门。例如,调用outb 0xDF, 0x60
命令,通过KBC控制585的输入端口写入启用A20的配置值。
启用快速方式:如果以上方法均未成功,系统将调用enable_a20_fast
函数,直接通过主板控制寄存器(如0x92端口)手动启用A20门。
在内核从实模式切换为保护模式的过程中,A20门的启用是至关重要的一步。系统需要确保在保护模式下,可以正确访问受保护的内存区域。例如,80380系列内核中的setup_idt
和setup_gdt
函数,利用启用A20门的信息,确保 segmentation单位表(GDT)和中断通常寄存器表(IDT)能够正确访问高寻址空间的内存。
此外,A20门的状态还被用作硬件检测的一部分。对技术人员来说,能够通过a20_test
函数检测到A20门的启用状态,是判断系统硬件兼容性和性能的重要步骤。
总结来说,A20地址线为x86兼容计算机提供了灵活的寻址方案,尽管在现代系统中,虚拟化技术和保护模式的优化使得对A20门的依赖已大幅减少,但其在计算机历史中的贡献不可忽视。理解A20地址线的工作原理,对于深入研究PC兼容计算机体系结构具有重要的理论价值和实际意义。
转载地址:http://wpeyk.baihongyu.com/