有些人對作業系統關機很有興趣,我這邊就大概描述一下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.
我在取得ICH6 的PMBase Address 後+4h 並送3C00h 並無法達到您提到的Power Off .
(ICH6 : Bus : 0,Device : 1F , Function 0, Device ID :2641)
不知道是否有其他的設定或Reg 須修改才能
達到您所說的Soft Off.
或者我取得的PMBase Address 是錯誤.
煩請您協助解惑!
感激!!
您好
文中提到:
另外如果你自己在Windows下寫了一個Ring 0 層級的程式去做S5 state(Soft Off),你會發現系統會直接關機,也就是OS不會去通知Driver工作站要關機,而是直接(立即)由硬體那邊關閉系統。
請問這的Driver工作站是指PMIC driver還是ACPI driver?
感謝~
您好
我想請教一下BIOS會在OS關機時候會去填PCH的Register
你好,想請教一個問題
我用ru.exe去看PMBase的值是0401,但為甚麼看到網路上的範例都還要再and FFFEh變成400h呢?
張貼留言