ACPI基礎 ASL語言

2021-07-26 13:23:54 字數 3944 閱讀 6993

asl的全稱是acpi source language。

在acpi基礎中已經有介紹過asl語言,它是用來描述硬體資訊以及相關硬體操作給os使用的表示式。

簡單來說,asl可以看成是類似c語言的計算機語言,不過它功能更加的單一。不過雖然功能單一,但是因為涉及到各種各樣的硬體,所以實際上需要記憶的東西會非常多,並且還在不斷的變多。

在編譯bios的時候,會使用iasl編譯器來編譯asl源**,下面是一些使用到的工具(也包含了iasl):

bios/uefi中也有相關的acpi操作的介面,它最終會將acpi相關的內容放到記憶體的某段空間中,並將指向該區域的指標傳遞給os。

os使用這裡的內容來操作獲取硬體資訊並操作相關的硬體。

這樣的好處是,os不需要直接去與底層硬體溝通,它只要直接操作這些asl生成的內容就可以了。

另乙個好處是,只要支援acpi,不管os是windows還是linux,都可以完成與硬體互動,也就是os independent。

上圖中的acpidump.exe可以用來列印上述提到的那段記憶體空間:

以上是截圖的一部分,實際上它包含很多的內容。

os就是要解析這些資訊,它們也是我們寫的asl最終成為的內容。

通過windows下的rw.exe工具,可以看到該機器下的asl語言:

基本上一般情況下我們很難看到多少asl語言的例項,所以這是我們能夠得到的很少的幾個學習素材之一。

asl語言中需要掌握的東西分為下面的幾個部分:

1. asl表示式。asl的表示式很簡單,就個句式,不像c語言那樣有有宣告變數、宣告函式啊等很多的形式;

2. 操作符。asl定義了很多的操作符,它像是c語言中的關鍵字和函式名的合體,需要記憶;

3. acpi預留的物件。這一部分是真正的難點,在acpi spec中,定義了對應各種硬體的物件,它們的命名大多以_開頭,且數量非常的多,需要很熟悉acpi規範以及各種硬體裝置才能真正了解這些預留物件。

asl的表示式,簡單來說就一句話:

operator fixedlist variablelist
operator是acpi中規定的操作符,在acpi6.1版本中一共有148個,spec中有專門的章節來介紹它們,下面是擷取的一角:

fixedlist是一組可選的變數,用()括起來。

variablelist也是一組可選的變數,用{}括起來。

當上述三個部分都存在的時候就很像c語言中的函式了。不過它跟函式還是有些不同的,事實上有乙個操作符method是用來定義acpi中的函式的,它比c語言中的函式更廣義。

另外需要說明asl表示式是部分大小寫的,無論大小寫在編譯時都被轉換成了大寫。

下面是乙個例子:

definitionblock ("dsdt.aml", "dsdt", 1, "intel ", "ovmf    ", 4) ) // working

name (\_s5, package () ) // soft off

// 後略

}

這裡definitionblock是乙個operator(事實上它是asl的入口),()裡面包含若干個變數,{}裡面也包含若干變數,這裡可以看到asl表示式是可以巢狀的。

name另乙個operator,它用來為物件命名,它不帶{}。

前面已經提到了操作符。它就是表示式的開始。

由於操作符太多,不可能在這裡一一介紹。

這裡選擇幾個比較常見的進行說明。

name

name (\_s0, package () ) // working
name的作用是定義乙個變數。

它帶兩個fixedlist,分別是(名稱,物件)。

這裡就是定義了乙個package,它的名字是_s0。

這裡有幾點需要說明:

1. 「\」是根命名空間。asl中有不同的命令空間,「\」是起始命名空間,有一些操作符會開闢新的命名空間;還有乙個符號「^」表示上一層命名空間;

2. asl中變數的名稱都是固定的4個位元組大小,不包括「\」,不滿4個位元組的,後面用「_」補全;

3.「_」開頭的是規範預留的名稱,雖然名稱是預留了,但是定義並沒有,我們寫asl的時候需要將它們補全(當然前提是我們需要用它);

4. 物件可以有不同的資料型別,asl下有很多的資料型別,它們通過不同的操作符建立,這裡就使用了package這個操作符來建立package型別的物件;

package

package ()
package用來定義一組資料。

它帶有乙個可選的fixedlist和乙個可選的variablelist(雖說可選但是一般都會用,不然資料怎麼定義),格式是(資料個數) 。

這裡需要注意幾點:

1. 資料個數如果是空的,則編譯器會通過計算後面的具體資料來得到值;

2. 具體資料可是實際的資料物件,也可以是物件引用——就是用name定義的物件的名稱;

這個太大了,就不在這裡講了。

前面的介紹中多次asl中的資料型別,這裡統一說明下。

asl中的資料型別大多通過操作符生成,但是像整數和字串這樣的也可以直接寫。

下面是asl中的所有型別:

1.未初始化

2.buffer:由操作符buffer建立;

3.buffer field:buffer中的成員,由操作符createbitfiled等一系列的create***filed操作符建立;

4.debug object:可以輸出到系統debug口的物件;

5.device:裝置或者匯流排物件,由操作符device建立;

6.event:時間同步物件,由操作符event建立;

7.field unit:在operation region中,使用filed等操作符建立,是位址空間的一部分(portion of an address space);

8.integer:整型;

9.integer constant:有如下的幾個:one(1),ones(全ff),zero(0),revision(版本號),它們本身就是操作符;

10.method:可執行的方法,由method操作符建立;

11.mutex:同步互斥鎖物件,由mutex操作符建立;

12.object reference:物件引用,就是name中的名稱;

14.package:asl物件集合,由package操作符建立;

15.power resource:power resource描述物件,由powerresource操作符建立;

16.processor:處理器描述物件,現在不再使用了,用device代替了;

17.string:字串;

18.thermal zone:溫度區域描述符,由thermalzone操作符建立;

BIOS入門基礎 ACPI

acpi這部分其實比較重要,因為它關係到了電源 功耗 效能。另外,與os關係比較大。1.對bios而言,acpi最直觀的就是電源功耗,從而影響到cpu效能,具體的設定,就在bios setup介面advanced選單下,高階電源管理這塊,會有許多設定選項。還有cpu的一些狀態設定,例如c state...

python語言基礎 Python語言基礎與應用

spcontent 本課基於主講教師在北京大學講授資料結構與演算法課 python版 的多年教學實踐經驗,面向零程式設計基礎的大學生和社會公眾,全面講授python語言基礎,培養學生計算思維的能力,並講解python語言中經典的擴充套件模組,讓學生能用python語言解決各種常見問題。課程團隊 課程...

C語言基礎 指標基礎

最小儲存單位 bit 即 0 1 基本儲存單位 byte 1byte 8bit 注 計算機訪問的資料是byte位數定義變數 分配儲存空間 引用變數 通過變數名引用變數的內容即變數空間的首位址 為常量,即 變數名 專門儲存位址常量的變數型別 變數名所有指標變數均分配4byte的儲存空間 與其他變數相同...