Chances are that you stumbled onto this page because Linux is freezing, crashing, and randomly rebooting on you, and you can’t figure out why. There is a strong chance that the reason this is happening is because the ACPI (Advanced Configuration and Power Interface) and APIC (Advanced Programmable Interrupt Controller) implementation on your motherboard is buggy, and Linux can not properly communicate with them. On any modern PC, ACPI and APIC are standard, and most have no way to shut them off in the BIOS. To make matters worse, many implementations of these by BIOS manufacturers are buggy and do not meet the specifications properly.
What is ACPI and APIC?
Most of my readers who have found this page already know what these are and what they do, they just want a solution to fixing the problem. I won’t write a detailed explanation about what ACPI and APIC do, rather I will point you to some resources for you to get a better explanation:
http://en.wikipedia.org/wiki/Advanced_Configuration_and_Power_Interface – An explanation of ACPI
http://en.wikipedia.org/wiki/Advanced_Programmable_Interrupt_Controller – An Explanation of APIC
http://support.novell.com/techcenter/sdb/en/2002/10/81_acpi.html – Linux Kernel boot parameters for ACPI and APIC
If your Linux box is freezing, crashing, or rebooting because of ACPI or APIC, this isn’t the fault of Linux. As far as I can tell from my research Linux properly implements ACPI and APIC, and the implementation on your BIOS is buggy. Of course, in Windows these buggy implementations are often accounted for, leaving the BIOS manufacturers with little reason to correct their errors. This is where we run into problem in Linux
So how can you fix the problem?
The first thing you should do to correct the problem is to check the maker of your PC or Laptop and see if there is a BIOS update. If there is an updated BIOS try this first and see if it fixes your problem. I have read where this helped some people. Personally though I have never been this lucky
A BIOS update did not work, now what?
If you have the latest BIOS, or the BIOS update did not fix the problem, your only other option is to disable ACPI and APIC from loading during the Linux boot. This is not the ideal as APIC and APIC, when working, are very beneficial to your computer. However using a computer that freezes, reboots, and crashes is even worse.
What you have to do to turn off ACPI and APIC in Linux is pass kernel boot parameters to the Kernel at boot time. This is done by modifing your boot loader GRUB or LILO. This article will not get into detail on how to modify your GRUB or LILO configuration, however I will explain which parameters to pass to your Linux kernel.
The four Kernel parameter options you will be concerned with are:
- noapic – Turn of the System APIC
- lapic – Turn on Local APIC
- nolapic – Turn off Local APIC
- acpi=[off | ht ] – Turn off ACPI completely by using acpi=off, or partially shut off ACPI leaving on your processors Hyperthreading on by using acpi=ht
On single processor machines you can fully disable ACPI and APIC by passing kernel boot parameters:
- noapic nolapic acpi=ht
The above parameters tell Linux to not load the APIC and Local APIC kernel modules, and only load ACPI so that it enables the Hyperthreading on your processor
On a dual core, quad core, or multiprocessor machine, you want to make sure you enable Local APIC. Local APIC has some kind of control over your Multiprocessor machine. If you shut off Local APIC on an multi-core or multiprocessor machine, you will only see one processor available. Use the following Kernel parameters:
- noapic lapic acpi=ht
Well that’s about the best I can explain it. Hopefully this helps you, or at the very least gets you some starting point to fixing your Linux problems.