ACPI和APIC具体的解释可以查看内核文档库的内核参数文件:
/usr/src/`uname -r`/Documents/kernel-parameters.txt
ACPI就是Advanced Configuration and Power Interface的缩写,意思是“高级配置与电源接口”。这是英特尔、微软和东芝共同开发的一种电源管理标准。
ACPI可实现以下功能:
1、用户可以使外设在指定时间开关;
2、使用笔记本电脑的用户可以指定计算机在低电压的情况下进入低功耗状态,以保证重要的应用程序运行;
3、操作系统可以在应用程序对时间要求不高的情况下降低时钟频率;
4、操作系统可以根据外设和主板的具体需求为它分配能源;
5、在无人使用计算机时可以使计算机进入休眠状态,但保证一些通信设备打开;
6、即插即用设备在插入时能够由ACPI来控制。
不过,ACPI和其他的电源管理方式一样,要想享受到上面这些功能,必须要有软件和硬件的支持。在软件方面,Linux、windows都对ACPI给予了全面的支持;硬件方面比较麻烦,除了要求主板、显卡和网卡等外设要支持 ACPI外,还需要机箱电源的配合。电源在提供5伏电压给主板的同时,还必须使电流稳定在720毫安以上才可以,这样它才能够实现电脑的“睡眠”和“唤醒”。
ACPI共有六种状态,分别是S0到S5,它们代表的含义分别是:
S0--实际上这就是我们平常的工作状态,所有设备全开,功耗一般会超过80W;
S1--也称为POS(Power on Suspend),这时除了通过CPU时钟控制器将CPU关闭之外,其他的部件仍然正常工作,这时的功耗一般在30W以下;(其实有些CPU降温软件就是利用这种工作原理)
S2--这时CPU处于停止运作状态,总线时钟也被关闭,但其余的设备仍然运转;
S3--这就是我们熟悉的STR(Suspend to RAM),这时的功耗不超过10W;
S4--也称为STD(Suspend to Disk),这时系统主电源关闭,但是硬盘仍然带电并可以被唤醒;
S5--这种状态是最干脆的,就是连电源在内的所有设备全部关闭,功耗为0。
我们最常用到的是S3状态,即Suspend to RAM(挂起到内存)状态,简称STR。顾名思义,STR就是把系统进入STR前的工作状态数据都存放到内存中去。在STR状态下,电源仍然继续为内存等最必要的设备供电,以确保数据不丢失,而其他设备均处于关闭状态,系统的耗电量极低。一旦我们按下Power按钮(主机电源开关),系统就被唤醒,马上从内存中读取数据并恢复到STR之前的工作状态。内存的读写速度极快,因此我们感到进入和离开STR状态所花费的时间不过是几秒钟而已;而S4状态,即 STD(挂起到硬盘)与STR的原理是完全一样的,只不过数据是保存在硬盘中。由于硬盘的读写速度比内存要慢得多,因此用起来也就没有STR那么快了。 STD的优点是只通过软件就能实现,比如Windows 2000就能在不支持STR的硬件上实现STD。
之前的电源管理是APM(Advanced Power Management),那么ACPI和APM相比有什么区别呢?
2、ACPI与APM比较
APM 1.0&1.1:由BIOS执行电源管理;
APM 1.2:操作系统定义电源管理时间,由BIOS负责执行;
ACPI:BIOS收集硬件信息,定义电源管理方案;由操作系统负责执行。
APM是一种软件解决方案,因此是与操作系统有关的, 而ACPI是工业标准,包括了软件和硬件方面的规范。
APIC (高级可编程中断控制器)对计算机来讲有两个作用,
一是管理IRQ的分配,可以把传统的16个IRQ扩展到24个(传统的管理方式叫PIC),以适应更多的设备。
二是管理多CPU。由于Nf2主板并不支持多CPU,所以,APIC关闭直接的影响是减少了可用的IRQ。
不过,如果板卡不是非常多的话,关闭 APIC对系统是没有什么影响的。
要实现SMP功能,我们使用的CPU必须具备以下要求:
CPU内部必须内置APIC单元。Intel 多处理规范的核心就是高级可编程中断控制器(Advanced Programmable Interrupt Controllers--APICs)的使用。CPU通过彼此发送中断来完成它们之间的通信。通过给中断附加动作(actions),不同的CPU可以在某种程度上彼此进行控制。每个CPU有自己的APIC(成为那个CPU的本地APIC),并且还有一个I/O APIC来处理由I/O设备引起的中断,这个I/O APIC是安装在主板上的,但每个CPU上的APIC则不可或缺,否则将无法处理多CPU之间的中断协调。
APIC可能遇到的问题,很多这类问题可以通过BIOS更新来解决。
下面的是通过更改HAL类型来解决:
CPU实际运行频率与BIOS设定频率不符
NF2的用户大约有10%的会出现CPU实际运行频率与BIOS设定频率不符的问题。我们称之为“频率不对”。
这种现象带来的直接后果就是在测试3dmark或跑3D游戏的时候,会感觉不流畅,也称之为“顿”。
一般在更改BIOS设置后、更新驱动后重启时,用测试软件如Aida32、MBM5等可以看到CPU的运行频率和你在BIOS里设置得不一样,而且差距很大。这个时候,用super pi测试CPU速度,会比平常花费时间长好几秒,用3dmark跑测试,会比平常低几百分甚至上千分。在3dmark中看到的CPU频率,也与BIOS设定不符合。
如果出现这种情况,则属于我们所讨论的“频率不对”的问题。
不过,不是所有的3D游戏“顿”都是这个原因。判断的方法是:如果你只有个别游戏“顿”,或者用上述软件测试频率正确,就不是此问题。
如果判断确实属此问题,解决的方法也很简单,经过网友讨论,只要关闭APIC功能即可。(注意,是APIC,不是ACPI)。
有一些服务器(比如IBM的,HP的),安装LINUX时,会给出内核的错误,导致无法安装,这个时候可以在安装的时候输入linux acpi=off noapic;
--------------------------------------
因为当时与次相关的两个核心参数(noapic,acpi=off)帮我解决了一个当时我觉得不可思议的问题。没有想到,我遇到很多奇怪的问题,基本都你觉得事情蹊跷的时候,一用这两个参数准行。
最早应该是CALIAS项目了,DC4.1安装在IBM X346(现在的X3650)上,配有Qlogic的光纤卡。单核心启动一切OK;多核心起来,光纤卡看上去驱动正常了,就是无法访问阵列柜。后来把机器扛到了公司,经过研发牛人的指点,算是搞定了,从那次起,知道了有这么一个参数。同样机器和配置,在另外一个项目中也遇到了这个情况,不过要惨一点,kernel panic。加上这两个参数后,问题解决。
如果没有记错的话,HP ML570机器,安装X86-64版本的DC5,到解压内核时,不动了,按键盘没有响应。重启后,加入这两个参数搞定。
IBM R52笔记本安装红旗桌面4.1plus,安装正常。启动时,到出现ACPI后,不再往下走,加上apci=off后,问题解决。
还有若干次安装普通X86 pc服务器时,出现内核错误,增加这两个参数启动后搞定。
普通台式机,非集成的RTL-8100B/8139D网卡,安装DC5后,网卡能驱动,就是ping不通网络,dmesg能看到
NETDEV WATCHDOG: eth0: transmit timed out
eth0: Transmit timeout, status 0c 0005 c07f media 00.
eth0: Tx queue start entry 4 dirty entry 0.
eth0: Tx descriptor 0 is 0008a03c. (queue head)
eth0: Tx descriptor 1 is 0008a03c.
eth0: Tx descriptor 2 is 0008a03c.
eth0: Tx descriptor 3 is 0008a03c.
eth0: link up, 100Mbps, full-duplex, lpa 0xC5E1
NETDEV WATCHDOG: eth0: transmit timed out
开始以为是驱动版本过低,但是想想这样的网卡对linux而言是多么的标准呀,百思不得其解中,加入这两个参数,问题解决。
我在MSI-9638主板上也碰到这样的问题,板载网卡82563EB,能正常驱动但不能收发数据包,试了一下,果然工作了!
给客户的联想机上装LINUX,老提示NO APIC,加入就OK了。
总之:如果你遇到了觉得不可思议的问题时,可以优先考虑增加apci=off noapic的核心参数,也许以为是大问题的事情就这么轻松的解决了。
------------------------------------
昨天去公安部解决qlogic 2312光纤卡加载后kernel panic的问题,很怪异,单核心加载没有问题,能正确识别到盘阵(IBM Total Storage DS4500),但是SMP核心会给出SCSI 命令超时的错误,30分钟后就会kernel panic。尝试加了apic=off的核心参数,依然不管用。只要想其他办法,比如更新驱动。但是无论怎么做,都是没有用。
后来查看了/proc/interrupts文件,发现qla2300驱动,单核心使用中断是XT-PIC,SMP核心也采用XT-PIC,而不是期望的 IO-APIC-level,觉得可能是驱动没有正确处理SMP核心。但是这样的卡不是第一次使用,其他地方都可以,难道是机器(IBM x346)和卡配合的问题?查看了一下内核参数文档,发现apic的禁用方式写的是noapic,反正是测试,于是重启机器使用noapic核心参数测试,结果发现成功了。
原来前面使用的apic=off是不正确的,但是显然禁止电源管理是采用acpi=off的参数形式。为什么参数接受方式要弄得不一样呢?这其中有什么不知道的秘密吗?
简单的原因是apic=...这个参数已经被用于设定APIC初始化的调试信息输出模式了:
apic= [APIC,i386] Change the output verbosity whilst booting
Format: { quiet (default) | verbose | debug }
Change the amount of debugging information output
when initialising the APIC and IO-APIC components.
真正的原因是:开源大杂烩的体现。没有谁规定该如何定义参数语法,规定了也不见得愿意遵守。特别是在内核空间。
阅读(1227) | 评论(1) | 转发(0) |