<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>http://wiki.foofun.cn//index.php?action=history&amp;feed=atom&amp;title=Memory_Map_%28x86%29</id>
	<title>Memory Map (x86) - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.foofun.cn//index.php?action=history&amp;feed=atom&amp;title=Memory_Map_%28x86%29"/>
	<link rel="alternate" type="text/html" href="http://wiki.foofun.cn//index.php?title=Memory_Map_(x86)&amp;action=history"/>
	<updated>2026-04-04T06:26:17Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>http://wiki.foofun.cn//index.php?title=Memory_Map_(x86)&amp;diff=969&amp;oldid=prev</id>
		<title>Zhang3：创建页面，内容为“本文描述BIOS跳转到自制bootloader代码时计算机物理内存的内容。（译者注：Bootloader可以翻译为引导加载程序，但是这样翻译很容易把前面的“引导”当作单个动词理解，引起误解，所以本文不再翻译了）  == 实模式地址空间 (&lt; 1 MiB)==  当一台典型的x86 PC启动时，它将处于实模式，带有一个活动的BIOS。 在CPU保持在实模式期间，IRQ0(时钟)将重…”</title>
		<link rel="alternate" type="text/html" href="http://wiki.foofun.cn//index.php?title=Memory_Map_(x86)&amp;diff=969&amp;oldid=prev"/>
		<updated>2022-03-22T06:45:52Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“本文描述BIOS跳转到自制bootloader代码时计算机物理内存的内容。（译者注：Bootloader可以翻译为引导加载程序，但是这样翻译很容易把前面的“引导”当作单个动词理解，引起误解，所以本文不再翻译了）  == 实模式地址空间 (&amp;lt; 1 MiB)==  当一台典型的x86 PC启动时，它将处于&lt;a href=&quot;/index.php?title=Real_Mode&quot; title=&quot;Real Mode&quot;&gt;实模式&lt;/a&gt;，带有一个活动的&lt;a href=&quot;/index.php?title=BIOS&quot; title=&quot;BIOS&quot;&gt;BIOS&lt;/a&gt;。 在CPU保持在实模式期间，IRQ0(时钟)将重…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;本文描述BIOS跳转到自制bootloader代码时计算机物理内存的内容。（译者注：Bootloader可以翻译为引导加载程序，但是这样翻译很容易把前面的“引导”当作单个动词理解，引起误解，所以本文不再翻译了）&lt;br /&gt;
&lt;br /&gt;
== 实模式地址空间 (&amp;lt; 1 MiB)==&lt;br /&gt;
&lt;br /&gt;
当一台典型的x86 PC启动时，它将处于[[Real Mode|实模式]]，带有一个活动的[[BIOS]]。 在CPU保持在实模式期间，IRQ0(时钟)将重复触发，用于引导PC的硬件(软盘、硬盘、CD、网卡、USB)也将生成IRQ。&lt;br /&gt;
这意味着在PC引导过程中，必须仔细保留实模式IVT (中断向量表，见下文)，因为它正在使用中。&lt;br /&gt;
&lt;br /&gt;
当[[IVT]]被[[IRQ]]激活时，它将调用BIOS例程来处理IRQ。&lt;br /&gt;
Bootloader还将访问[[BIOS#BIOS功能|BIOS功能]]。 这意味着BIOS使用的两个内存工作区 (BDA和EBDA) 在引导过程中也必须小心保存。 此外，每次BIOS处理IRQ0（每秒18次），BDA中的几个字节都会被BIOS覆盖&lt;br /&gt;
--因此，当IRQ在实模式下处于活动状态时，请勿尝试在那里存储任何内容。&lt;br /&gt;
&lt;br /&gt;
在需要的BIOS功能被调用之后，并且你的内核已被加载到某个地方的内存中时，bootloader或内核可能会永远退出实模式 (通常是进入32位 [[Protected Mode|保护模式]])。 如果内核不再使用实模式，那么PC中的第一个0x500字节内存可能会被重用和覆盖。 (但是，为了更改[[HOW_DO_I_SET_a_GRAPHICS_MODE|视频显示模式]]，临时返回实模式是非常常见的。)&lt;br /&gt;
&lt;br /&gt;
当CPU处于保护模式时，[[System Management Mode|系统管理模式]] (SMM) 仍然处于无形状态，并且无法关闭。 SMM似乎也在使用EBDA。 因此，EBDA存储区&amp;lt;b&amp;gt;永远&amp;lt;/b&amp;gt;不应被覆盖。&lt;br /&gt;
&lt;br /&gt;
注意: EBDA是一个可变大小的内存区域 (在不同的BIOS上)。 如果它存在，它在内存中总是低于0xA0000。&lt;br /&gt;
它的大小绝对保证不超过128 KiB。 较旧的计算机通常使用0x9fc00-0x9ffff中的1 KiB，现代固件能使用的更多一些。&lt;br /&gt;
你可以通过使用BIOS功能[[Detecting Memory (x86)#检测内存不足|INT 12h]]或通过检查BDA中0x413处的word来确定EBDA的大小（见下文）。&lt;br /&gt;
这两种方法都会告诉你在EBDA之前有多少常规内存可用。&lt;br /&gt;
&lt;br /&gt;
还应注意，你的bootloader代码会被加载并在物理地址0x7C00到0x7DFF的内存中运行。 因此，在执行转移到第二阶段Bootloader或内核之前，那块内存区域可能也无法使用。&lt;br /&gt;
&lt;br /&gt;
===概述===&lt;br /&gt;
&lt;br /&gt;
{| {{wikitable}}&lt;br /&gt;
|-&lt;br /&gt;
!开始&lt;br /&gt;
! 结束&lt;br /&gt;
! 大小&lt;br /&gt;
! 描述&lt;br /&gt;
! colspan=2 | type&lt;br /&gt;
|-&lt;br /&gt;
! colspan=6 | 实模式地址空间(第一个MiB)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000&lt;br /&gt;
| 0x000003FF&lt;br /&gt;
| 1 KiB&lt;br /&gt;
| 实模IVT (中断向量表)&lt;br /&gt;
| rowspan=2 |在实模式下无法使用&lt;br /&gt;
| rowspan=6 | 640 KiB内存(“下层内存-Low memory”)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000400&lt;br /&gt;
| 0x000004FF&lt;br /&gt;
| 256 bytes&lt;br /&gt;
| BDA (BIOS数据区-BIOS data area)&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000500&lt;br /&gt;
| 0x00007BFF&lt;br /&gt;
| 差不多30KiB&lt;br /&gt;
| 常规内存&lt;br /&gt;
| rowspan=3 | 可用内存&lt;br /&gt;
|-&lt;br /&gt;
| 0x00007C00&lt;br /&gt;
| 0x00007DFF&lt;br /&gt;
| 512 bytes&lt;br /&gt;
| 你的OS引导扇区&lt;br /&gt;
|-&lt;br /&gt;
| 0x00007E00&lt;br /&gt;
| 0x0007FFFF&lt;br /&gt;
| 480.5 KiB&lt;br /&gt;
| 常规内存&lt;br /&gt;
|-&lt;br /&gt;
| 0x00080000&lt;br /&gt;
| 0x0009FFFF&lt;br /&gt;
| 128 KiB&lt;br /&gt;
| EBDA (扩展BIOS数据区-Extended BIOS Data Area)&lt;br /&gt;
| 部分由EBDA使用&lt;br /&gt;
|-&lt;br /&gt;
| 0x000A0000&lt;br /&gt;
| 0x000BFFFF&lt;br /&gt;
| 128 KiB&lt;br /&gt;
| 视频显示内存&lt;br /&gt;
| 硬件映射&lt;br /&gt;
| rowspan=4 | 384 KiB系统/预留（“上层内存-Upper Memory”）&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C0000&lt;br /&gt;
| 0x000C7FFF&lt;br /&gt;
| 32 KiB (typically)&lt;br /&gt;
| Video BIOS&lt;br /&gt;
| rowspan=3 |ROM和硬件映射/Shadow RAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C8000&lt;br /&gt;
| 0x000EFFFF&lt;br /&gt;
| 160 KiB (typically)&lt;br /&gt;
| BIOS扩展（BIOS Expansions）&lt;br /&gt;
|-&lt;br /&gt;
| 0x000F0000&lt;br /&gt;
| 0x000FFFFF&lt;br /&gt;
| 64 KiB&lt;br /&gt;
|主板BIOS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===BIOS数据区（BDA）===&lt;br /&gt;
&lt;br /&gt;
BDA只有部分被标准化，主要与实模式BIOS操作相关。&lt;br /&gt;
以下是部分列表。 有关更多详细信息，请参阅下面的外部链接参考。&lt;br /&gt;
&lt;br /&gt;
{| {{wikitable}}&lt;br /&gt;
|-&lt;br /&gt;
! 地址(大小)&lt;br /&gt;
! 描述&lt;br /&gt;
|-&lt;br /&gt;
| 0x0400 (4 words)&lt;br /&gt;
| COM1-COM4串行的IO端口（每个地址为1个字，如果没有则为零）&lt;br /&gt;
|-&lt;br /&gt;
| 0x0408 (3 words)&lt;br /&gt;
| LPT1-LPT3并行IO口(每个地址为1个字，无地址为零)&lt;br /&gt;
|-&lt;br /&gt;
| 0x040E (word)&lt;br /&gt;
| EBDA基地址&amp;gt;&amp;gt;4(&amp;lt;b&amp;gt;通常！&amp;lt;/b&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0410 (word)&lt;br /&gt;
| 检测到的硬件的打包位标志&lt;br /&gt;
|-&lt;br /&gt;
| 0x0413 (word)&lt;br /&gt;
|EBDA/不可用内存之前的千字节数&lt;br /&gt;
|- &lt;br /&gt;
| 0x0417 (word)&lt;br /&gt;
|键盘状态标志&lt;br /&gt;
|-&lt;br /&gt;
| 0x041E (32 bytes)&lt;br /&gt;
| 键盘缓冲区&lt;br /&gt;
|-&lt;br /&gt;
| 0x0449 (byte)&lt;br /&gt;
|显示模式&lt;br /&gt;
|-&lt;br /&gt;
| 0x044A (word)&lt;br /&gt;
|文本模式列数&lt;br /&gt;
|-&lt;br /&gt;
| 0x0463 (2 bytes, taken as a word)&lt;br /&gt;
| 视频基本输入输出端口&lt;br /&gt;
|-&lt;br /&gt;
| 0x046C (word)&lt;br /&gt;
| 自启动以来的IRQ0定时器tick次数&lt;br /&gt;
|-&lt;br /&gt;
| 0x0475 (byte)&lt;br /&gt;
| 检测到的硬盘数量&lt;br /&gt;
|-&lt;br /&gt;
| 0x0480 (word)&lt;br /&gt;
| 键盘缓冲区开始&lt;br /&gt;
|-&lt;br /&gt;
| 0x0482 (word)&lt;br /&gt;
| 键盘缓冲端&lt;br /&gt;
|-&lt;br /&gt;
| 0x0497 (byte)&lt;br /&gt;
| 最近键盘LED/Shift键状态&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 扩展BIOS数据区 (EBDA)===&lt;br /&gt;
&lt;br /&gt;
如果你在网上搜索，你可能会看到EBDA的“映射”。 但是，这些映射是针对原始IBM BIOS EBDA的。 当前的BIOS可能使用不同的映射。 EBDA区域没有标准化。&lt;br /&gt;
&lt;br /&gt;
==扩展内存(&amp;gt;1 MiB)==&lt;br /&gt;
&lt;br /&gt;
1 MiB以上的RAM区域不是标准化的、定义明确的或连续的。 其中可能有包含内存映射硬件的区域，只有设备驱动程序才能访问这些区域。 其中可能有包含你的初始化代码可能希望读取的ACPI表区域，然后可以覆盖和重用这些表。&lt;br /&gt;
有些ACPI区域则不能这样 “回收”。 计算机的一些RAM可能会扩展于4 GiB以上。&lt;br /&gt;
&lt;br /&gt;
使用BIOS函数[[Detecting Memory (x86)#BIOS功能：INT 0x15，EAX=0xE820|INT 15h, EAX=0xE820]]获得可靠的扩展内存映射。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| {{wikitable}}&lt;br /&gt;
|-&lt;br /&gt;
!开始&lt;br /&gt;
! 结束&lt;br /&gt;
! 大小&lt;br /&gt;
! 区域/异常&lt;br /&gt;
! 描述&lt;br /&gt;
|-&lt;br /&gt;
! colspan=5 | High Memory&lt;br /&gt;
|-&lt;br /&gt;
| 0x00100000&lt;br /&gt;
| 0x00EFFFFF&lt;br /&gt;
| 0x00E00000 (14 MiB)&lt;br /&gt;
| RAM -- 自由使用 (如果存在)&lt;br /&gt;
| 扩展内存&amp;lt;sup&amp;gt;1,2&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 0x00F00000&lt;br /&gt;
| 0x00FFFFFF&lt;br /&gt;
| 0x00100000 (1 MiB)&lt;br /&gt;
| 可能的内存映射硬件&lt;br /&gt;
| ISA Memory Hole 15-16mb &amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 0x01000000&lt;br /&gt;
| ????????&lt;br /&gt;
|???????? (不管是否存在)&lt;br /&gt;
| RAM —— 自由使用&lt;br /&gt;
| 更多扩展内存&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0000000 (有时，取决于主板和设备)&lt;br /&gt;
| 0xFFFFFFFF&lt;br /&gt;
| 0x40000000 (1 GiB)&lt;br /&gt;
| 不定（通常为内存映射设备保留）&lt;br /&gt;
| 内存映射PCI设备、PnP NVRAM？、IO APIC/s、本地APIC/s、BIOS.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0000000100000000 (4 GiB以上的可能内存)&lt;br /&gt;
| ????????????????&lt;br /&gt;
|???????? (不管是否存在)&lt;br /&gt;
| RAM —— 自由使用（PAE/64位）&lt;br /&gt;
| 更多扩展内存&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ????????????????&lt;br /&gt;
| ????????????????&lt;br /&gt;
| ????????????????&lt;br /&gt;
| 可能的内存映射硬件&lt;br /&gt;
|可用于现代硬件中的内存映射PCI设备（但由于向后兼容性，通常不可用）&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;: 不同的计算机具有不同的内存容量，因此你可能会发现扩展内存的大小有所不同，可能是“无”(例如，旧的80386系统)到“很多”。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;: 自由使用，除了你的Bootloader (即GRUB) 可能已经在这里加载了你的 “模块”，并且你不想覆盖这些模块。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;: “ISA Memory Hole”（从0x00F00000到0x00FFFFFF）用于内存映射ISA设备（例如视频卡）。 现代计算机不需要这个孔，但一些芯片组仍然支持它(作为可选功能)，一些主板可能仍然允许使用BIOS选项来启用它，因此它可能存在于没有ISA设备的现代计算机中。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 另见 ==&lt;br /&gt;
* [[Detecting Memory (x86)]]&lt;br /&gt;
&lt;br /&gt;
===外部链接===&lt;br /&gt;
* https://web.archive.org/web/20120130052813/http://www.nondot.org/sabre/os/files/Booting/BIOS_SEG.txt --详细的BIOS数据区域映射&lt;br /&gt;
* http://www.bioscentral.com/misc/bda.htm -- 另一个详细的BIOS数据区域映射&lt;br /&gt;
* [http://files.osdev.org/mirrors/geezer/osd/ram/index.htm#layout Geezer的内存布局描述]&lt;br /&gt;
* http://stanislavs.org/helppc/bios_data_area.html&lt;br /&gt;
&lt;br /&gt;
[[Category:X86]]&lt;/div&gt;</summary>
		<author><name>Zhang3</name></author>
	</entry>
</feed>