網頁

星期五, 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 則留言:

  1. 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也不会发出来,可这样看来不行。

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

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

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

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

    回覆刪除
  5. 作者已經移除這則留言。

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


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

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

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

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

    感謝~

    回覆刪除
  8. 您好
    我想請教一下BIOS會在OS關機時候會去填PCH的Register


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

    回覆刪除