博客
关于我
A20地址线
阅读量:788 次
发布时间:2023-01-23

本文共 1347 字,大约阅读时间需要 4 分钟。

A20地址线是PC兼容计算机中一个关键的硬件特性,用于解决在80286扩展后的寻址问题。本文将详细介绍A20地址线的工作原理及其在实模式和保护模式中的应用。

A20地址线的历史背景

8086/8088系列CPU仅有20位地址总线,因此在实模式下,最大的寻址空间为0xFFFFF,即10FFEFH。为了向下兼容,系统采用段和偏移的组合方式进行内存寻址。当地址超过16位时(即达到100000H),系统需要采取取模处理,使得实际访问的物理内存地址为偏移量的低16位。

随着80286的推出,CPU地址总线扩展到了24位,理论上最大寻址为16M(0x1000000)。这意味着系统需要一种新的方法来处理低16位的高寻址空间,以确保向下兼容性。因而,第21位地址线(A20)被设计为控制门,用于允许或阻止对上述高寻址空间的访问。

A20门的功能

A20门的作用相当于一个虚拟开关:

  • 启用A20门:当A20门打开时,系统允许直接访问0x100000H到0x10FFEFH范围内的物理内存地址。这样,在实模式下,程序员可以访问较大的内存块,必要时进行操作。

  • 禁用A20门:若A20门关闭,系统会将0x100000H到0x10FFEFH范围内的内存地址自动映射到0x000000H到0xFFFEFH。这意味着在实模式下,程序员无法直接访问超过0xFFFFFH的内存,必须进入保护模式才能访问高寻址空间。

  • A20测试与启用流程

    在实际操作中,系统需要确保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启用的重要性

    在内核从实模式切换为保护模式的过程中,A20门的启用是至关重要的一步。系统需要确保在保护模式下,可以正确访问受保护的内存区域。例如,80380系列内核中的setup_idtsetup_gdt函数,利用启用A20门的信息,确保 segmentation单位表(GDT)和中断通常寄存器表(IDT)能够正确访问高寻址空间的内存。

    此外,A20门的状态还被用作硬件检测的一部分。对技术人员来说,能够通过a20_test函数检测到A20门的启用状态,是判断系统硬件兼容性和性能的重要步骤。

    总结来说,A20地址线为x86兼容计算机提供了灵活的寻址方案,尽管在现代系统中,虚拟化技术和保护模式的优化使得对A20门的依赖已大幅减少,但其在计算机历史中的贡献不可忽视。理解A20地址线的工作原理,对于深入研究PC兼容计算机体系结构具有重要的理论价值和实际意义。

    转载地址:http://wpeyk.baihongyu.com/

    你可能感兴趣的文章
    作为公共组软件工程师如何工作
    查看>>
    uni-app 微信支付
    查看>>
    编写xor_shellcode.py
    查看>>
    Echarts笔记
    查看>>
    Ubuntu 20.04 Docker 安装并配置
    查看>>
    [小技巧]新建txt菜单
    查看>>
    Java虚拟机详解(五)------JVM参数(持续更新)
    查看>>
    在 eclipse 中将 web 项目部署到 tomcat 服务器上
    查看>>
    iOS关于申请公司开发者账号缴费支付
    查看>>
    10-3 A1-4在产品表中找出库存数量大于50的产品的信息 (20 分)
    查看>>
    桜の木になろう
    查看>>
    Python 存储和读取ASCII码形式的byte数据
    查看>>
    Ajax学习笔记-错误的处理-7
    查看>>
    SparkStreaming利用队列生成测试数据源
    查看>>
    js——BOM操作知多少?
    查看>>
    划分子网与NAT的区别。。。
    查看>>
    信号量机制
    查看>>
    钻石操作符使用升级
    查看>>
    设置方法区大小与OOM
    查看>>
    对象的实例化内存布局与访问定位内容
    查看>>