A20 Line: Difference between revisions

From OSDev.wiki
Jump to navigation Jump to search
[unchecked revision][unchecked revision]
Content added Content deleted
m (Spelling corrections, (Someone made up words lol..))
No edit summary
Line 7: Line 7:
For an operating system developer (or [[Bootloader]] developer) this means the A20 line has to be enabled so that all memory can be accessed. This started off as a simple hack but as simpler methods were added to do it, it became harder to program code that would definitely enable it.
For an operating system developer (or [[Bootloader]] developer) this means the A20 line has to be enabled so that all memory can be accessed. This started off as a simple hack but as simpler methods were added to do it, it became harder to program code that would definitely enable it.


==#A20 Pin==
==A20 Pin==
On most modern systems the A20 pin allows automatic enabling of the A20 line. Unfortunately this was not implemented until recent processors so it is necessary to check whether the A20 line is enabled and try alternate methods if it is not.
On most modern systems the A20 pin allows automatic enabling of the A20 line. Unfortunately this was not implemented until recent processors so it is necessary to check whether the A20 line is enabled and try alternate methods if it is not.


Line 14: Line 14:


When your PC boots, the A20 gate is always disabled, but some BIOSes do enable it for you, as do some high-memory managers (HIMEM.SYS) or bootloaders ([[GRUB]]).
When your PC boots, the A20 gate is always disabled, but some BIOSes do enable it for you, as do some high-memory managers (HIMEM.SYS) or bootloaders ([[GRUB]]).

==Enabling==
===Pre Pentium===
To enable the A20 line, some hardware IO using the Keyboard Controller chip (8042 chip) is necessary.
<pre>
void init_A20(void)
{
UCHAR a;

disable_ints();

kyb_wait_until_done();
kyb_send_command(0xAD); // disable keyboard

kyb_wait_until_done();
kyb_send_command(0xD0); // Read from input

kyb_wait_until_done();
a=kyb_get_data();

kyb_wait_until_done();
kyb_send_command(0xD1); // Write to output

kyb_wait_until_done();
kyb_send_data(a|2);

kyb_wait_until_done();
kyb_send_command(0xAE); // enable keyboard

enable_ints();
}
</pre>
===Post-pentium===
With the Pentium onwards, the processor has a FAST A20 option that bypasses the A20 line altogether. To set the A20 line, there is no need for delay loops or polling, just 3 simple instructions.

in al, 0x92
or al, 2
out 0x92, al

However, this is not supported everywhere and there is no reliable way to tell if it will have some effect or not on a given system. Even worse, on some systems, it may actually do something else like blanking the screen, so it shoud be used only after the [[BIOS]] has reported that FAST A20 is available and code is still necessary for systems lacking FAST A20 support.


==See Also==
==See Also==

Revision as of 09:15, 24 December 2006

This page is a stub.
You can help the wiki by accurately adding more contents to it.

The A20 Address Line is the physical representation of the 20th bit of any memory access. When the IBM-AT (Intel 286) was introduced, it was able to access up to sixteen megabytes of memory (instead of the 1 MByte of the IBM-XT). But to remain compatible with the IBM-XT, a quirk in the XT architecture (memory wraparound) had to be duplicated in the AT. To achieve this, the 20th line on the address bus (A20) was disabled by default.

The wraparound was caused by the fact XT computers could only access 1 megabyte of memory but because of there segmented memory access method they could effectively address up to 1 megabyte and 63 and a bit kilobytes. Not looking toward the future as always, Intel decided to wrap around address above the 1 megabyte mark to the beginning of memory. Therefore in order to support XT era programs on there new architectures, this wraparound was set by default on later processors.

For an operating system developer (or Bootloader developer) this means the A20 line has to be enabled so that all memory can be accessed. This started off as a simple hack but as simpler methods were added to do it, it became harder to program code that would definitely enable it.

A20 Pin

On most modern systems the A20 pin allows automatic enabling of the A20 line. Unfortunately this was not implemented until recent processors so it is necessary to check whether the A20 line is enabled and try alternate methods if it is not.

Keyboard Controller

The traditional method for A20 line enabling is to directly probe the keyboard controller. The reason for this is that Intel's 8042 keyboard controller had a spare pin which they decided to route the A20 line through. This seems fullish now given there unrelated nature but at the time computers weren't quite so standardized. Keyboard controllers are usually derivatives of the 8042 chip. By programming that chip accurately, you can either enable or disable bit #20 on the address bus.

When your PC boots, the A20 gate is always disabled, but some BIOSes do enable it for you, as do some high-memory managers (HIMEM.SYS) or bootloaders (GRUB).

Enabling

Pre Pentium

To enable the A20 line, some hardware IO using the Keyboard Controller chip (8042 chip) is necessary.

void init_A20(void)
{
   UCHAR   a;

   disable_ints();

   kyb_wait_until_done();
   kyb_send_command(0xAD);         // disable keyboard

   kyb_wait_until_done();
   kyb_send_command(0xD0);         // Read from input

   kyb_wait_until_done();
   a=kyb_get_data();

   kyb_wait_until_done();
   kyb_send_command(0xD1);         // Write to output

   kyb_wait_until_done();
   kyb_send_data(a|2);

   kyb_wait_until_done();
   kyb_send_command(0xAE);         // enable keyboard

   enable_ints();
}

Post-pentium

With the Pentium onwards, the processor has a FAST A20 option that bypasses the A20 line altogether. To set the A20 line, there is no need for delay loops or polling, just 3 simple instructions.

in al, 0x92
or al, 2
out 0x92, al

However, this is not supported everywhere and there is no reliable way to tell if it will have some effect or not on a given system. Even worse, on some systems, it may actually do something else like blanking the screen, so it shoud be used only after the BIOS has reported that FAST A20 is available and code is still necessary for systems lacking FAST A20 support.

See Also

External links