小華的部落格: System Shutdown

搜尋此網誌

網頁

星期五, 7月 06, 2007

System Shutdown

有些人對作業系統關機很有興趣,我這邊就大概描述一下BIOS在關機的動作中做了什麼事情,以及如何利用軟體工具去撰寫一段關機的程式碼。

一般在NoteBook上面控制電源的部分都是EC BIOS所控制,而有時候我們會透過Send EC Cmd方式給EC BIOS來達到關機的目的(Power Off)。

像是某些BIOS中會使用到關機的地方就是在Setup Menu-->Exit-->Shutdown 選項,而這個地方的BIOS code 就可以利用EC Cmd或是PM Register來達到關機的目的。

另外在進入作業系統後我們也可以透過上面的方式來強制關閉系統,所使用的方式就是利用PM Control Register。

所以BIOS扮演的角色就是去設定PM Register IO Address Range & ACPI Table ,這樣說或許很多人搞不懂,簡單說就是BIOS提供一些資訊給OS,提供的方式是透過ACPI Table(放在記憶體中),OS自己會去記憶體中找到ACPI Table,然後得到BIOS所提供的資訊,其中這些資訊就包含PM Register的IO Address。

底下提供一個範例程式來做系統關機的動作,如果你是在DOS下可直接用Debug.com 執行
如果是在 Windows下請自行撰寫Ring 0 程式去對IO Access 或利用相關工具:

mov ax,3c00h <--請參考ICH 手冊上面的說明
mov dx,0404h <--PM Register I/O Address. (PMBase+04h)
out dx,ax

上面有提到PM Register IO Address 資訊是由BIOS所提供,因此不同的BIOS廠商所設定 PM Register 的IO Address range也會不同,所以如果想要強制關機就必須先找到這個位址,這樣才能對PM Register做Soft off (S5 satte)的動作。 一般比較常見的就是Port 0404h,所以如果你不知道BIOS工程師設定在哪個位址,那麼你可以利用ACPI Table查詢或是請教你們的BIOS工程師。

另外如果你自己在Windows下寫了一個Ring 0 層級的程式去做S5 state(Soft Off),你會發現系統會直接關機,也就是OS不會去通知Driver工作站要關機,而是直接(立即)由硬體那邊關閉系統。

Reference
ACPI Spec 3.0
ICH8 Spec

9 則留言:

匿名 提到...

Harrison, 我是BIOS新人,想请教你一个ACPI方面的问题,windows 下press power button会触发SCI出来,然后OS会通知ACPI driver去处理这个power button event,做shutdown或者s3/s4的动作(不知道我上述的理解是否正确),那么如果想disable掉上述动作,也就是说使得press power button后windows不做shutdown或者s3/s4的动作,都有什么办法可以做到呢?我发现windows下南桥(ICH7) PMBASE+02的bit 8(power button enable)会始终为1(Enable),当我用SE.EXE改成0后,过了一秒钟的样子,这个bit会被置为1。看样子好像windows下的driver还是什么会周期的去check这个bit.我本来想说把这个bit disable,这样有press power button的动作SCI也不会发出来,可这样看来不行。

小華的部落格 提到...

你可以參考ACPI Spec裡面有提到,在ASL code中我們會去建立Power Button 物件,而os在開機過程中會去參考FADT/DSDT Table中的描述去設定那些Enable bit,隻後進入到os中你就沒機會改變他 , 而有些Enable bit我們是透過SMI方式偷偷關閉掉,但是只針對某些設備有效,對於你的問題我想你只要檢查一下你的ASL code中的定義與宣告,就應該可以解決你的問題了!

如果不清楚用法可以參考ACPI Spec中我記得好像在第5章附近吧!有描述這部分的資訊~~~

匿名 提到...

我是一個剛入行的新人,想請問一下 如果我只會組語跟c語言,不知道我要去看哪一些書
謝謝 我的msn:kenjerry09130504@hotmail.com

小華的部落格 提到...

會組語跟C就很強了,直接從BIOS code開始看吧~ 或是先看一些工業標準的Spec...
PCI bus/SMBIOS/SMbus/ACPI....etc.

Joe 提到...
作者已經移除這則留言。
Joe 提到...

我在取得ICH6 的PMBase Address 後+4h 並送3C00h 並無法達到您提到的Power Off .
(ICH6 : Bus : 0,Device : 1F , Function 0, Device ID :2641)


不知道是否有其他的設定或Reg 須修改才能
達到您所說的Soft Off.

或者我取得的PMBase Address 是錯誤.
煩請您協助解惑!
感激!!

daigreenty 提到...

您好
文中提到:
另外如果你自己在Windows下寫了一個Ring 0 層級的程式去做S5 state(Soft Off),你會發現系統會直接關機,也就是OS不會去通知Driver工作站要關機,而是直接(立即)由硬體那邊關閉系統。

請問這的Driver工作站是指PMIC driver還是ACPI driver?

感謝~

Benson 提到...

您好
我想請教一下BIOS會在OS關機時候會去填PCH的Register


匿名 提到...

你好,想請教一個問題
我用ru.exe去看PMBase的值是0401,但為甚麼看到網路上的範例都還要再and FFFEh變成400h呢?