星期一, 六月 24, 2013

X86架构整理






CPU (Central Processing Unit)


L1 與 L2 Cache :
目前電腦內部以距離 CPU 核心的層數來分, 有 L1、L2 兩種 Cache:
L1 Cache 作為 CPU 內部指令集與資料的快取區
L2 Cache 則是 CPU 與記憶體之間的快取區

RAM, Random Access Memory

前端匯流排(FSB,Front Side Bus)是指中央處理器資料匯流排的專門術語,此匯流排負責中央處理器和北橋晶片間的資料傳遞。



Bridge = Hub
MCH - Memory Controller Hub
ICH - I/O Controller Hub
DMI - Direct Media Interface


AGP (Accelerated Graphics Port) is a special I/O port which is designed exclusively for video cards.

DIME (DIrect Memory Execute). This allows the video card memory to be extended using standard RAM on the motherboard. 

RAMDAC device is a chip on the video card which looks after the "translation" of digital data into analogue signals, when the card is connected to an analogue screen. 

ECC (Error Checking & Correction) ECC 稱為錯誤自動檢查與更正, 這也是一種資料檢查的技術, 可以檢查資料是否正確

PCI stands for Peripheral Component Interconnect. 





隨插即用(Plug and Play,簡稱PnP)是一種電腦硬體的一般術語,指在電腦上加上一個新的外部裝置時,能自動偵測與配置系統的資源,而不需要重新組態或手動安裝驅動程式。


Extended System Configuration Data (ESCD) This is a small data area which is stored in the motherboard's a nonvolatile storage. 




Interrupts

Software interrupts are used to call a large number of BIOS routines.
Hardware interrupts are what we are now going to discuss, because these are what the I/O devices use.


DMA stands for Direct Memory Access


Memory-mapped I/O 


通用序列匯流排(英語:Universal Serial Bus,縮寫USB)
USB版本 速率稱號頻寬 速度
USB 3.0超高速
SuperSpeed
5Gbps約500MB/s
(5000Mbit/s)
USB 2.0 高速
Hi-Speed
480Mbps約60MB/s
(60,000KB/s)
USB 1.1全速
Full Speed
12Mbps約1.5MB/s
(1,500KB/s)
USB 1.0 低速
Low Speed
1.5Mbps187.5KB/s
(192000B/s)


獨立磁碟冗餘陣列(RAID, Redundant Array of Independent Disks)
RAID 0RAID 1RAID 5



Serial ATA(SATA, Serial Advanced Technology Attachment),亦稱序列ATA,是串列SCSI(SAS:Serial Attached SCSI)的孿生兄弟,兩者的排線相容,SATA硬碟可接上SAS介面。它是一種電腦匯流排,主要功能是用作主機板和大量儲存裝置(如硬碟及光碟機)之間的數據傳輸之用。
SATA ports.jpg

SATA版本頻寬 速度
SATA 3.06Gb/s600MB/s
SATA 2.03Gb/s300MB/s
SATA 1.01.5Gb/s150MB/s
和Parallel ATA相比,新的Serial ATA使用差動信號系統(differential-signal-amplified-system)。這種系統能有效的將雜訊從正常訊號中濾除,良好的雜訊濾除能力使得SATA只要使用低電壓操作即可,和Parallel ATA高達5V的傳輸電壓相比,SATA只要0.5V(500mv) 的峰對峰值電壓即可操作於更高的速度之上。比較正確的說法是:峰對峰值『差模電壓』。

和Parallel ATA的5V驅動電壓相比,0.5V的SATA系統節省電力,其驅動IC的生產成本也較為便宜。

有種排線附有小金屬片可以卡住插座,比較不會發生不小心將排線拔出的問題。


CPU
Mode - real mode, big real mode (flat mode), protected mode.


要能夠使用 32bit 的 segment,首先需要進入保護模式,最簡單的方法是:

cli
mov eax,cr0
or al,1
mov cr0,eax
sti





CPU Registers
1.一般暫存器:AX、BX、CX、DX
2.索引暫存器:SI、DI
3.堆疊、基底暫存器:SP、BP
4.指位/指標暫存器(指位器):IP

5.節段或區段暫存區:CS、DS、ES、SS、FS、GS

  程式區段 CS:如 IP 所執行位址都是CS程式區段的內容

        資料區段 DS:如 mov ax,[bx] 間接定址法所指都是資料段的資料

  額外區段 ES:如 mov ax,es:[di] 利用間接定址法取其他區段記憶體資料時

        堆疊區段 SS:如 SP 堆疊資料,都是指在堆疊段的

  額外區段 FS:80386以上電腦新增區段暫存器

  額外區段 GS:80386以上電腦新增區段暫存器
6.旗標暫存器:FLAG





1514131211 1009080706050403020100
    OFDFIFTFSFZF  AF PF CF
AF:輔助進位旗標
CF:進位旗標
OF:溢位旗標
SF:符號(負號)旗標
PF:奇偶旗標
ZF:零值旗標
DF:方向旗標
IF:中斷旗標
TF:單步旗標


7.386以上電腦新增擴充之暫器

  EAX、ECX、EDX、EBX:為ax,bx,cx,dx的延伸,各為32位元

  ESI、EDI、ESP、EBP:為si,di,sp,bp的延伸,32位元

  EFLAG、EIP:為FLAG與IP之延伸,32位元
  FS、GS:新增的節段暫存器,16位元



Memory Map





DMA (8237A-5)




System Timer (8254-2)





Programmable Interrupts Controller (8259A)






1. 週邊設備通知8237(DREQ – DMA Request), 希望獲得DMA服務
2. 8237發出HRQ – Hold Request 通知CPU交出System BUS 的控制權, 以便執行DMA動作
3. CPU發出HLDA – Hold Acknowledge 通知8237, CPU已交出 System BUS 的控制權
4. 8237發出DACK – DMA Acknowledge 通知周邊已允許執行DMA傳送


Advanced Programmable Interrupt Controller (APIC)
高级可编程中断控制器.   
 APIC 是装置的扩充组合用来驱动 Interrupt 控制器。在目前的建置中,系统的每一个部份都是经由 APIC Bus 连接的。


NMI

Mask Off (Disable NMI) – port 70h, bit7 = 1.
Mask On (Enable NMI) – port 70h, bit7 = 0.
NMI is masked off at power on time.



KBC

CMOS

BDA - BIOS Data Area
EBDA - Extended BDA

PCI
PCI access, using CF8h and CFCh 10%:
1) Read word, Bus=2, Device=5, Function=3, Register=56h
2) Write Dwrod, Bus=1, Dvice=3, Function=2, Register24h. Data=12345678h
1.)
push dx

Mov dx, 0cf8h
mov eax, 80022b54h
out dx, eax
mov dx, 0cfch
in eax, dx
shr eax, 16 ;AX is output

pop dx

Or

push dx

Mov dx, 0cf8h
mov eax, 80022b56h
out dx, eax
mov dx, 0cfeh
in ax, dx ;AX is output

pop dx

2.)
push eax
push dx

mov eax, 80011a24h
mov dx, 0CF8h
out dx, eax
mov dx, 0cfch
mov eax, 12345678h
out dx, eax

pop dx
pop eax



PCIe




ACPI 相关(转)

收集] ACPI 入門相關資料

ACPI簡介

出處: http://frankuefi.blogspot.tw/2012/05/acpi.html

ACPI (Advanced Configuration and Power Interface),故名思義是對硬體的電源管理和設定的介面。它是由Intel、Microsoft、Phoenix、Toshiba等不同領域的製造商所訂定,它的目的就是讓OS可以對hardware做以上的動作。它的架構主要都在BIOS階段會建立起來,所以我們必須熟悉這本ACPI spec, 目前最新的版本是5.0a.

前六章是ACPI最基本的部分,要觀念清楚,一定要照著順序看,而且要熟讀它。後面章節可以跳著看,也就是當作工具書來查,如果懂得愈多,對未來處理ACPI的問題也就更容易解決! 當然,要支援ACPI除了hardware , OS也必須支援ACPI, 而在ACPI訂定之前有個APM,這裡指的legacy OS或legacy hardware就是指APM的OS或不支援ACPI的OS或hardware,它將不符合ACPI,所以不在這裡討論。


ACPI既不是軟體的spec,也不是硬體的spec,它包括了軟體和硬體的元素,目的上面也說過,它是讓OS可以對Hardware做電源管理和設定的介面。如圖紅色部分就是ACPI的範圍:




ACPI可以做的事情很多,大致可分為十大類:

System power management: 整個系統的電源管理,ACPI定義了許多Sleep狀態,如S1、S3、S4、S5等,可以在Sleep狀態被Device喚醒,Sleep狀態數字愈高表示睡得越深、耗的電量越少,需要被喚醒的時間也越長。

Device power management: 週邊裝置的電源管理,ACPI定義D0、D1、D2、D3...,數字越大表示耗電量越少,D0表示週邊裝置運作中。ACPI Table也定義了週邊裝置的相關電源控制,可以在OS端透過AP將週邊裝置設定較省電的模式。

Processor power management: 處理器的電源管理,ACPI定義了當CPU不在Sleep狀態時且閒置時,可以進入low power 狀態,也就是C State,數字越大表示越省電,C0表示運作中。

Device and processor performance management: 週邊裝置和處理器的效能管理,ACPI定義為當CPU和設備在動作的時候(C0或D0),做改變效能的動作,這裡指的是P State,它的狀態改變會影響運作的效能,通常是降頻來動作,也可以達到省電的功能。

介紹完四個功能,發現了許多狀態,這是屬於Power State的部份,下面以G State圖表示可以看得更清楚。G0表示系統在工作中,G1為Sleeping, G2為soft off (S5), G3為Mech off(電源斷開).


Configuration / Plug and Play: 組態和隨插即用,ACPI提供了介面讓OSPM可以把資源在插入和移除之間做組態。這些組態將定義在DSDT和SSDT中,它將有一個ID來代表它的Device.

System Event: 糸統事件,ACPI定義了通用的事件模組,如Plug and Ply、Power management、Thermal 等。當系統事件發生時,core logic會設定一個bit在Status Register中來表示事件發生,如果對應的Bit在enable register 被設定,那麼會發出SCI來告訴OS. 當OS 收到SCI事件時,它會去找該事件所對應的control method. 這些control method會以AML的方式告訴OS做什麼事,我們則要用ASL來撰寫它。

Battery management: 電池管理,支援ACPI的電池裝置它是透過OS且以EC來控制,或者由電池的control method來控制。這邊的control method也是由ASL來實作它。

Thermal management: 熱的管理,對於Device的熱管理也是在ACPI定義的範圍,它提供了簡單的、可調整的模組來給OEM定義其Thermal zone、Thermal indicator和method for cooling thermal zones.

Embedded Controller: ACPI定義了標凖的硬體的和軟體的溝通介面給OS bus enumerator和EC之間來做溝通,也就是說可以由Driver來存取EC的資源,讓OEM可以提供platform features給OS的AP使用。

SMBus Controller: ACPI定義了標凖的硬體的和軟體的溝通介面給OS bus enumerator和SMBus Controller之間來做溝通,也就是說可以由Driver來存取SMBus device的資源,讓OEM可以提供platform features給OS的AP使用。



==============================================


ACPI Table 基本知識

出處:http://biosengineer.blogspot.tw/2007/10/acpi-table.html


ACPI Table基本知識(BIOS觀點):

1.包在BIOS ROM中 的 ASL Code 就是ACPI Table,而ACPI Table有分成不同類型的Table(RSDT/FADT/DSDT...etc.)。

2.像是我們比較常使用的DSDT Table就是放了一些event code,簡單說就是當某個H/W event 發生後,系統OS會去依照描述在這個DSDT Table中的ASL Code去執行,而這些Acpi Table包在BIOS ROM中的形式是AML Code (類似機器碼)。

3.BIOS在開機過程中會把包在BIOS ROM中的Acpi Table 載入到RAM 中,然後留下一些資訊給OS來找到他們,最簡單的例子就是RSDP Table會放在1M以下的某個位址(一般都是在E0000h~FFFFFh),然後OS就可以透過搜尋"Signature"(某個標記字)的方式來找到其他的Acpi Table entry point。

[勘誤] 應該是RSDP Structure 不是 RSDP Table ,打錯了 >.< ,感謝糾正! 這個Struct內的RSD PTR欄位會指向RSDT Table ,而如何找這個Struct的方式就是在1M以下的地方找"RSD PTR",有興趣的自己用Debug.com 找看看吧 ^^。 4. OS 需要有一個 AML 翻譯器去翻譯這些AML Code,然後執行他們。 5. 每個Platform 的Host Controller 的暫存器位址會不同,所以BIOS需要透過ACPI Table來告知OS這些暫存器的位址,這樣子做的好處是OS不需要知道你是在什麼Platform,因為他只單純看BIOS所提供的H/W 資訊。 6. ACPI Table還可以用來當作OS 啟動金鑰,例如SLIC Table就是一個例子,OS透過檢查包在BIOS ROM中的ACPI Table的內容來決定是不是一個台OEM 電腦。 其他詳細介紹請參閱ACPI Spec 3.0b 以及微軟網站介紹,下圖為參考微軟文件說明:



======================================================================


ACPI和APIC有什麽關系?[轉貼]
資料來源 : http://mlsx.xplore.cn/2006/01/12/what-difference-between-acpi-and-apic.html

很多人問道了什麽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和其他的電源管理方式一様,要想享受到上面這些功能,必須要有軟件和硬件的支持。在軟件方面,Windows 98及其後續産品和Windows 2000都對ACPI給予了全面的支持;而Linux的内核目前對此支持得并不是太理想。硬件方面比較麻煩,除了要求主板、顯卡和網卡等外設要支持 ACPI外,還需要機箱電源的配合。電源在提供5伏電壓給主板的同時,還必須使電流穩定在720毫安以上才可以,這様它才能够實現電腦的"睡眠"和"唤醒 "。
ACPI共有六種狀態,分別是S0到S5,它們代表的含義分別是:
S0–實際上這就是我們平常的工作狀態,所有設備全開,功耗一般會超過80W;
S1–也稱為POS(Power on Suspend),這時除了通過CPU時鐘控制器將CPU關閉之外,其他的部件仍然正常工作,這時的功耗一般在30W以下;(其實有些CPU降温軟件就是利用這種工作原理)
S2–這時CPU處於停止運作狀態,總線時鐘(Bus Clock)也被關閉,但其餘的設備仍然運轉;
S3–這就是我們熟悉的STR(Suspend to RAM),這時的功耗不超過10W;
S4–也稱為STD(Suspend to Disk),這時系統主電源關閉,但是硬碟仍然帶電並可以被唤醒 再進入系統時需重跑BIOS,如同WindowsXP的睡眠模式行為;
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應該是安裝上的。

=============================================

ACPI Overview

出處:http://blog.csdn.net/celiaqianhj/article/details/6740124


最近有些时间,重温了一下ACPI SPEC Rev4.0,发现之前无法理解的东西,现在也不是那么难懂了。现整理一下笔记。

先来明确两个概念:ACPI,OSPM
ACPI:Advanced Configuration and Power Interface 高级配置和电源接口
OSPM:Operation System directed configuration and Power Management 操作系统直接电源管理
在ACPI SPEC中,随处可见OSPM,那么OSPM到底是什么呢?
原来,在早期的电脑中,电源管理完全是由通过APM(Advanced Power Management)来实现的,OS对此一无所知也无从干预。这种管理方式存在很多的缺陷,且BIOS维护APM代码和功能需要非常大的精力。ACPI规范就是为了解决APM的缺陷而问世的,它允许操作系统来控制电源管理,从而解放了BIOS。但是ACPI只是一个接口规范,除了硬件Support、BIOS support之外,OS 也需要support。支持ACPI的OS就可以叫做OSPM。 OSPM的最低要求如下:
1). 在Intel架构的系统上使用system address map reporting interface来得到system address map
      a. INT15H,E820H
       b. EFI GetMemoryMap() Boot Service Function
2).Find and consume the ACPI System Description Tables.
3). 安装启用一个支持所有已定义的AML语法元素的AML interpreter(翻译器)。
4). 支持ACPI Event programming model,包含handing SCI interrupt,managing fixed events/general-propose events/embedded controller interrupt /dynamic device support.
5). 枚举和配置ACPI Namespace中描述的主板设备。
6). 实现以下ACPI devices的支持:Embedded Controller Device/GPE Block Device/Module Device。
7). 安装ACPI Thermal Model。
8). 支持acquisition(获得) and release(释放) Global Lock。
9).  支持OS-directed power management.(设备驱动负责维护device context)。

ACPI的结构
ACPI包含三个run-time Components:
1.       ACPI Tables
         主要描述一个Platform上的硬件界面资讯,这些描述包含了一些固定的寄存器的位置,或是说明一些Register Blocks,另外ACPI Tables还包含了一些OS可以执行的AML Code,OS会透过自己的AML Interpreter来执行这些AML Code。
2.       ACPI Registers
        在ACPI Register中是实体的硬件界面,这些寄存器就是被描述在ACPI Tables中的那些。
3.       ACPI BIOS
        符合ACPI规范的BIOS,典型情况下,他会做系统开关机的动作以及实做Sleep界面的支援(BIOS支援S3/S4/…)。

ACPI可以实现的功能

1. 系统电源管理 System Power Management
     Global Power State:
          G0: Working –S0
          G1: Sleeping --S1/S3/S4
          G2: Soft off –S5
          G3: Mechanical off        
       
2. 设备电源管理 Device Power Management
              PCI, PCI Express, CardBus, USB, IEEE 1394
       Device Power State:
           D0: fully on 设备可以完全回应,正常工作
           D1: 不同Device Class有不同规范,一般会节省一些电源
           D2: 不同Device Class有不同规范,但并非大多数设备都有支援,比D1更省电,通常会关闭一些设备上的功能来达到省电的目的。
           D3hot: 不同Device Class有不同规范,当要转到D0 状态是,OS SW要重新初始化该设备
           D3: off 电源完全从设备移除
3. 处理器电源管理 Processor Power Management
       在G0状态下,Processor Power State:C0, C1, C2, C3…
4. 设备和处理器性能管理 Device and Processor Performance Management
       在C0/D0状态下,Device/Processor Performance State: P0, P1, P2, P3…
5. 配置/即插即用 Configuration/Plug and Play
6. 系统事件 System Events
7. 电池管理 Battery Management
8. 温度管理 Thermal Management
9. 嵌入式控制器 Embedded Controller
10. SMBus控制器 SMBus Controller

 ==============================================================================

APM全称Advanced Power Management,中文名称高级电源管理,目前最新的APM标准是1.2,它是一种基于BIOS的系统电源管理方案,它提供了CPU和设备电源管理并通过设备工作超时设定来决定何时将设备转换到低耗能状态。
    1.由于基于APM的BIOS都有它自己的电源管理方案,使得计算机与计算机之间缺乏一致性,每个BIOS开发者必须精心维护自己的APM BIOS代码和功能。     2.系统进入挂起的原因无法知晓。用户是否按了进入睡眠按钮,还是BIOS认为系统已进入了空闲状态,或者电池电压过低,这些信息APM都无法知道,但是Windows必须要知道挂起的原因,即使系统没有进入空闲状态。     3.BIOS无法知道用户在干什么,只有通过监视中断和I/O端口来猜测用户的活动。有时,BIOS会使系统处于完全混乱的状态,当系统没有空闲时将系统挂起或者当系统处于空闲状态时,却不进入挂起状态。     4.早期版本的BIOS APM(1.0和1.1)不提供任何系统性能信息,系统是否支持睡眠状态就只有尝试将系统转入睡眠模式才知道。如果BIOS不支持睡眠模式,那将导致死机。BIOS APM 1.2解决了这个缺陷。     5.BIOS对USB设备、加插的电脑配件卡和IEEE1394设备全然不知,导致当以上设备没有进入空闲状态,而BIOS却认为系统已经进入空闲状态,从而发生冲突,使这些设备无法正常使用或系统死机。
    由于APM有以上不足,因此ACPI应运而生。
    ACPI全称Advanced Configuration Power Interface,中文名称高级配置电源界面,ACPI是为了解决APM的缺陷而问世的。它定义了许多新的规范:     1.ACPI将现有的电源管理BIOS代码、APM应用编程接口、PNP BIOS应用编程接口、多处理器规范表格等集合成一种新的电源管理和配置接口规范。     2.ACPI允许操作系统(不是BIOS)控制电源管理,这点与APM不相同。     3.ACPI标准定义了硬件寄存器、BIOS接口(包含配置表格、控制方法以及主板设备列举和配置)、系统和设备的电源状态和ACPI热模型。     4.BIOS支持的代码不是用汇编语言而是用AML(ACPI Machine Language,ACPI机器语言)编写的。BIOS不能决定用于电源管理或资源管理的策略或超时。     5.使用ACPI系统的所有设备可以互相通信来了解彼此的使用情况,并且都受操作系统的控制,操作系统对正在运行的系统状态了如指掌,所以操作系统处于执行电源管理的最佳位置。
    综上所述,ACPI与APM有着很多的优势,推荐使用ACPI来管理系统。
    下面通过WinXP关机问题来进一步探讨它们之间的区别与应用。有人问为什么在WinXP的控制面板→电源选项中没有高级电源管理选项页和启用高级电源管理支持选项,从而使系统无法正常关机。其实在2000年以后出现的主板BIOS大都支持ACPI管理,因此当Power Management Setup中的ACPI function设为Enabled时,WinXP已经接管和控制了电源管理。所以系统中不会出现APM的选项页,当然也就不会出现启用高级电源管理支持选项。大多数的WinXP是可以正常关机,如果不能关机,原因可能是ACPI存在兼容性问题,解决的方法是升级最新的BIOS文件。如果还是不行,就把Power Management Setup中的ACPI function设为Disabled,并将PM Control by APM设为Yes。然后重启进入WinXP就会发现在控制面板→电源选项中多出了高级电源管理选项页(APM)和启用高级电源管理支持选项,只要勾选启用高级电源管理支持,并且在注册表的HKEY_LOCAL_MACHINE/SOFTWARE /Microsoft/Windows NT/CurrentVersion/ Winlogon中找到PowerdownAfterShut- down,并将值设为1,再重启,通常问题就可解决。

========================================================================

ACPI Tables
出處:http://blog.csdn.net/celiaqianhj/article/details/6742852

ACPI SPEC定义了ACPI-compatible OS与BIOS之间的接口,ACPI Tables就是BIOS提供给OS的硬件配置数据,包括系统硬件的电源管理和配置管理。
BIOS在POST过程中,将RSDP存在0xE0000--0xFFFFF的内存空间中,然后Move RSDT/XSDT, FADT, DSDT到ACPI Recleam Area, Move FACS到ACPI NVS Area,最后填好表的Entry链接和Checksum。
控制权交给OS之后,由OS来开启ACPI Mode,首先在内存中搜寻ACPI Table,然后写ACPI_Enable到SMI_CMD,SCI_EN也会被HW置起来。
ACPI Tables根据存储的位置,可以分为:
1).  RSDP位于F段,用于OSPM搜索ACPI Table,RSDP可以定位其他所有ACPI Table
2).  FACS位于ACPI NVS内存,用于系统进行S3保存的恢复指针,内存为NV Store
3). 剩下所有ACPI Table都位于ACPI Reclaim内存,进入OS后,内存可以释放
ACPI Table根据版本又分为1.0B,2.0,3.0,4.0。
2.0以后,支持了64-bit的地址空间,因此几个重要的Table会不大一样,比如:RSDP,RSDT,FADT,FACS。简单的列举一下不同版本的ACPI Table:
1) ACPI 1.0B:RSDP1,RSDT,FADT1,FACS1,DSDT,MADT,SSDT,HPET,MCFG等
2) ACPI 3.0 :RSDP3,RSDT,XSDT,FADT3,FACS3,DSDT,MADT,HPET,MCFG,SSDT等
以系统支持ACPI3.0为例子,说明系统中ACPI table之间的关系如图:
 其中绿色代表在内存F段,蓝色是ACPI Reclaim内存,红色是NV store内存
RSDP:Root System Description Pointer
OSPM获得RSDP的方式:
a>. 在Legacy系统下,在Memory Space 0xE0000---0xFFFFF中 Search RSDP的signature: "RSD PTR "。
b>. 在UEFI系统下, 在EFI System Table里的EFI Configuration Table中Search RSDP的GUID。
1.       RSDT(Root System Description Table)              Signature: 'RSDT'
         为了兼容ACPI1.0而存在,XSDT取代了RSDT的功能。 如果XSDT存在,ACPI-compatible OS 必须使用XSDT。
2.       XSDT(Extended System Description Table)      Signature: 'XSDT'
          一组64bit的物理指针,指明其他system description tables的Address。         
3.       FADT(Fixed ACPI Description Table)            Signature: 'FACP'
          FADT包含了OS直接管理ACPI Hardware Register Blocks所必须的Fixed Hardware ACPI information,比如PM1a_EVT_BLK, PM1b_EVT_BLK, PM1a_CNT_BLK, PM1b_CNT_BLK, PM2_CNT_BLK, PM_TMR_BLK, GPE0_BLK, and GPE1_BLK这些的base address。
          通过FADT可以找到FACS和DSDT。

4.       FACS(Firmware ACPI Control Structure)              Signature: 'FACS'
          The FACS contains the system's hardware signature at last boot, the firmware waking vector, and the Global Lock。
hardware signature:由BIOS搜集,当系统从S4唤醒的时候,OSPM通过比较当前的和已保存的hardware signature是否一致来确定系统能否恢复
firmware waking vector:在休眠之前,OSPM来填写这一项,在POST时,BIOS来确定这一项是否不为空,若不为空则通过jump到这个Address来把控制权交给OSPM。
5.       DSDT(Differentiated System Description Table)                 Signature: 'DSDT'
          DSDT包含了Differentiated Definition Block, 它们包含了整个系统的实现和配置信息。OS在系统启动的过程中将DSDT的information插入到ACPI Namespace, 而且从不会被移除。
6.       SSDT(Secondary System Description Table)                Signature: 'SSDT'
         SSDT是DSDT的继续。可以有多个SSDT存在。OSPM在Load DSDT 创建出ACPI Namespace之后,会去逐个Load SSDT。注意:附加的tables 只能add data, 而不能override data。
7.       MADT(Multiple APIC Description Table)              Signature: 'APIC'
        描述OS支持APIC/SAPIC所必须的information,比如IO-APIC address/Local-APIC address等等。
8.       SBST(Smart Battery Table)            Signature: 'SBST'
         如果系统支持符合Smart Battery Specification V1.0 1.1的电池,则SBST就会存在。主要用来指明:
               Warning Energy Level:Warning时的Energy Level
               Low Energy Level: OSPM即将进入Sleep状态时的Energy Level
              Critical Energy Level: OSPM将要执行紧急关机时的Energy Level
9.       MCFG(PCI-Memory Mapped Configuration table and sub-table)          Signature: 'MCFG'
         PCI Express memory mapped configuration space base address Description Table

================================================================================

ACPI NameSpace
出處:http://blog.csdn.net/celiaqianhj/article/details/6749801

ACPI NameSpace(命名空间)
概念
ACPI NameSpace是存在于OS-Controlled内存中的,包含命名对象(Named Objects)的,一个分层的树状结构。
1、 这些Objects包含:data objects, control method objects, bus/device package objects, 等等。
2、ACPI NameSpace中所有的信息都来自于DSDT(Differentiated System Description Table)。DSDT中包含有Differentiated Definition Block, and one or more other definition blocks. Definition Block包含着硬件实现和配置的详细信息。
3、在Runtime阶段,OS通过loading and/or unloading ACPI Tables中的definition blocks来动态的改变NameSpace的内容。
4、OS枚举主板上的设备,就是通过读ACPI NameSpace来寻找包含有HardwareIDs的Devices。
5、每个ACPI列举的device在ACPI NameSpace中都有一个ACPI-defined Object,它报告了这个device能够占用的Hardware Resource。
6、ACPI主要用来列举和配置没有其他硬件规范的MB Devices。例如,ACPI不会列举主板上的PCI Devices,这些设备的Plug and Play信息就不会包含在ACPI NameSpace中,但是他们的Power Managed的信息和insertion/removal控制信息仍会存在于NameSpace中。
命名规则
1、固定长度为32bits
2、第一个Byte包含'A'-'Z','_'  (0x41-0x5A,0x31--0x39,0x5F)
3、剩下三个Byte包含含'A'-'Z','0'--'9','_' (0x41-0x5A,0x31--0x39 ,0x5F)
4、若不足四个字符,AML编译器会自动在末尾补'_'
5、以'_'开头的名字是为这份Spec中保留的,Defination Blocks只能使用以'_'开头的名字
6、以'\'开头,后接name,说明这个name参考the root of the namespace。
7、以'^'开头,后接name,说明这个name参考the parent of current namespace。
预定义的Root Namespace

Pridefined Objects

System Configuration Object
_PIC Method


================================================================================

ACPI Hardware Specification

出處:http://blog.csdn.net/celiaqianhj/article/details/6752499

ACPI 定义了ACPI-Compatible OS控制和管理ACPI-Compatible Hardware平台的标准接口机制。 在这里,ACPI定义"Hardware"为一个programming model及其behavior。
ACPI Hardware分类
Fixed和Generic。Fixed类的Hardware符合ACPI Spec定义的Programming和Behavior;而Generic类的Hareware在实现上则更具灵活性。
ACPI Hardware Feature分类
Fixed Hardware Feature有如下规定:
1. 性能相关的feature
2. 唤醒过程中driver需要的feature
3. 允许从灾难性的OS软件失败恢复所需要的feature
Generic Hardware Feature是由ACPI Namespace中的ACPI Control method所控制的,比较灵活。
ACPI定义了实现Generic Hardware时可以使用的八种Address space:
1. System I/O
2. System Memory
3. PCI Configuration Space
4. Embedded Controller
5. SMBus
6. CMOS
7. PCI  Bar Target
8. IPMI(Intelligent Platform Management Interface)
ACPI Register Model
Fixed Hardware Register, 是实现ACPI-defined interface所必须的。在FADT中由OEM定义,是固定的,不能再改变。
                    
Generic Hardware Register,是Value-added Hardware 产生的events所必须的。


================================================================================
ACPI中ASL的简单介绍
ACPI(Advanced Configuration and Power Interface)中,一个特色是有自己专门的一个语言来编写ACPI的那些表。这个语言叫做:ASL(ACPI Source Language). ASL在经过编译器编译后,变成AML(ACPI Machine Language)。然后由OSPM(一般也就是OS)来执行。

AML是一种BYTECODE,类似JAVA BYTECODE。也就是说,他并不是直接在机器上执行的2进制代码,而是需要OS来解释后执行。这样做的好处是方便错误检查,减少由于代码没写好而带来的负面影响。

本文主要介绍下ASL,并把他和其他常见的编程语言,比如C,C++,JAVA,PERL之类的进行对比。适合初学者。另外,作者本人也是刚刚学ACPI, ASL,所以文中也许有不对的地方,欢迎大家指正。

在学ASL之前,我也学过一些编程语言,比如C,C++,JAVA,PERL之类。所以在开始学ASL的时候,有意无意的同这些以前学的语言进行比较。慢慢的,我发现ASL同前面提的这些语言差别还是很大的。下面简要介绍下ASL的特性和差别。


1、ACPI NAMESPACE与一般的常量,变量的区别。
一般的编程语言中操作的是常量和变量。这些变量之间一般没啥关系,可以说是一堆平行(有序或者随机排列的)的内存地址而已。而在ACPI中,这个发生了明显变化。ACPI引入了一个NAMESPACE的观念。也就是说所有的OBJECT之间是有等级关系的。类似一个文件或者注册表系统,各个ACPI OBJECT(类似常量)之间都存在于一个路径下面,其中的根目录就是以符号"\"来表示。然后上下级目录之间用"."来连接起来。

比如\_SB_. FOO.BAR 就表示根目录下的_SB_这个OBJECT下的FOO OBJECT下的BAR OBJECT.

因此,在ACPI中,很多操作都是作用在这个NAME SPACE 中的某个OBJECT上面。并由此引入了一系列相关概念。比如SCOPE。

为什么要这样设计呢?因为ACPI本身是一个针对性很强的规范,就是电源管理。因此把这些常用的OBJECT排列好,分类好。处理起来也方便。灵活性比一般的编程语言差了,但是简单,并且能满足设计要求。


2、ASL中有大量的OPERATOR(操作符)。
基本上看一段ASL代码,其中操作符占掉了大部分。比如ASL中很多都是如下形式:Device(PCI0)。一般在小括号前面的都是操作符,也就是预先定义好的。这也是因为ASL本身的目的就很简单,所以很多东西可以先定好。


参考资料:
ACPI SPEC 4.0, CHAPTER 5, 18.


=================================================================================

DSDT: DSDT 称做 Differentiated Definition Block,存在于 BIOS 中并与当前的硬件平台兼容的,提供了系统的硬件特性(例如某些设备的内部寄存器和存储器)的应用策略和配置,在系统初始化的时候,DSDT 被当前系统启动时初始化到名字空间中。
  
  FADT:FADT 中包含了 ACPI 的硬件寄存器组(GPE)的应用和配置(包含它们的硬件地址)也包括DSDT表的硬件地址。
  
  ACPI Namespace: 对于ACPI层来说,内存维持了一个目录形式的指向每个设备,以及 GPE 的名字空间,这个名字树是通过初始化的时候由 DSDT 创建的,名字树可以通过 loadtable 方法从 BIOS 中载入 DSDT 改变,而每个设备在 ACPI 层中都被描述成一个对象,包含有对这个设备特性和操作策略的描述列表,系统所有类型设备都是保存在同一个名字树下。在 ACPI OS 层上调用 _ADR 来获得 Namesapce 的设备名,Namespace 的例子见例 1-1:
  
  OSPM(OS-directed Power Management):OSPM 操作系统支持 ACPI 的一个部分,操作系统(OS)可以从操作系统下驱动程序的角度控制 ACPI 子模块,同时支持 ACPI 包括 SCI 中断,设备事件,系统事件模式,这些事件模式可以充分支持 Hot-plug 方式。
  
  SCI 中断:(System Control Interrupt) 系统控制中断,SCI 中断是一种源自 ACPI 兼容芯片系统中断,系统映射不同的 ACPI 事件中断向量以便共享此中断,当底层硬件产生 SCI 中断的时候(例如设备插入事件引发中断),根据通知 OSPM 层处理相对应的 ACPI 事件,OSPM 层会调用预先安装的中断句柄。
  
  GPE Block Device 和 GPE 事件:GPE Block Device 是平台设计者可按照 FADT(Fixed ACPI Descriptor Table) 描述表中响应 GPE 的寄存器组,GPE 的输入脚。作为 GPE 设备描述块中的地址存在于 FADT 中,每个 GPE Block Device 可以容纳 128 个 GPE 事件,ACPI 层上提供两个通用目标寄存器组–GPE0_BLK 和 GPE1_BLK,(也就是说可以响应 256 个 GPE 事件)每个寄存器组中包含两个等长度的寄存器 GPEx_STS,GPEx_EN,他们的系统地址(硬件地址)都保存在 FADT 中,作为 GPE Blocks 的行为(或者是操作)描述部分存在于 ACPI 名字空间中;用于指示当前的设备的事件,例如设备插入/拔除事件发生的时候,相关的状态位(GPEx_STS中的位,这个是在硬件设计的时候相关设备的事件信号会连接到这些状态位)会被外部的事件所置位,生成 SCI,让 OSPM 层运行相关的控制程方法通知 ACPI 层;GPEx_EN 表示每个事件的使能位,一般说来在南桥(ICH4)中有这几个寄存器,它们的硬件地址保存在 FADT 中。
  
  GPE 事件就是通过 GPE 寄存器组引发 SCI 中断后,通告 OSPM 层有关设备的事件,例如下面介绍 Hot-Plug 的时候会详细或者简略地介绍到总线枚举,设备检查,设备唤醒,设备弹出几个事件。
  
 
  ACPI" Source Language(ASL):ASL 语言是 ACPI 层用于描述特定的 ACPI 对象的 ACPI 专用语言,并且包括了 ACPI 对象的控制方法(Control method),OEM 厂商和 BIOS 设计者在 BIOS 中使用 ASL 定义所有的设备为 ACPI 对象,并且可以生成 ASL 格式的专门的控制方法,1-1 例就是关于 ASL 的例子:
  ASL 的语法规参看 ACPI Specification Revision 2.0
  AML 和 AML 分析器:AML 是 ACPI 控制方法的虚拟机器语言,AML 执行过程也就是 ACPI 核心驱动层,ACPI 控制方法使用 AML 来进行编写,但是通常而言对编写者来说是写成 ASL 的方式,通过 AML 翻译器进行翻译,AML 翻译器不但具备 ASL 的翻译的功能,而且可以执行 AML 方法,当用 ASL 编写的 DSDT 表被载入到名字空间的时候,将会被 AML 翻译器翻译成执行时候可以辨别的机器码,例如关键字 SCOPE 在进入 AML 编译器之前中是以一个 ACSII 编码保存在 DSDT 中,但 DSDT 被载入名字空间之后将变成 0×10 的单字节数值(AML 操作值为 ScopeOP)。对 AML 的编译过程和转换方式,ASL 中的关键字可以参看 ACPI Specification Revision 2.0 中 section 17 。

=======================================================================

Note: 淺談 _GPE of ACPI

出處:http://kunyichen.wordpress.com/2011/03/22/note-%E6%B7%BA%E8%AB%87-_gpe-of-acpi/


在ACPI 的 DSDT Table 會有一個 _GPE Object 是用來讓OSPM 做 General-Purpose Event Handling (see Section 5.6.4 in ACPI 4.0a spec.)的動作指引.

這裏是用 Thinkpad X60 當做解說材料, 對應到 ICH7 (Intel ICH7 datasheet), Dump ACPI的方法可以參考之前的 Note: Dump ACPI Tables , iasl 我現在用的是 Intel 20090730 版本

_GPE 是HW/SW共同建構的, 主要是用來辨識SCI發生後, 系統需要另外處理的事件, 在Intel platform 裡 ICH 會包含一個 ACPI 對應I/O Registers, ICH7 稱Power Management I/O Registers (see 10.8.3 in Datasheet), 而ICH7 負責GPE的, 是 GPE0_STS/GPE0_EN 兩個暫存器, 這個可以在 FADT/ACPI Table找到對應的 GPE0_BLK (Section 4.7.4 in ACPI 4.0a)

_GPE在Section 5.6.4.1 in ACPI 4.0a 說明了, Event 的種類會有 _Exx/_Lxx/_Qxx 三種, E是Edge的縮寫, L是Level, Q則是 Query (from Query commad 0×84 of EC, Q event 對應 SMBUS Device與EC), 在Intel Platform上用到的主要是L與 Q event

下面是X60 用的 _GPE 描述

Scope (\_GPE)
{
Method (_L18, 0, NotSerialized)
{
Store (\_SB.PCI0.LPC.EC.HWAK, Local0) // X60 的EC 透過 Read 這各 Byte 來清除 EC的 Wakeup event 處理, see coreboot patch
Store (Local0, \RRBF)
Sleep (0x0A)
If (And (Local0, 0×02)) {}
If (And (Local0, 0×04))
{
If (\W98F)
{
Notify (\_SB.SLPB, 0×02)
}
Else
{
Notify (\_SB.LID, 0×02)
}
}

If (And (Local0, 0×10))
{
And (Local0, 0xF7, Local0)
Notify (\_SB.SLPB, 0×02)
}

If (And (Local0, 0×08))
{
\_SB.GDCK.GGPE ()
Notify (\_SB.SLPB, 0×02)
}

If (And (Local0, 0×40)) {}
If (And (Local0, 0×80))
{
Notify (\_SB.SLPB, 0×02)
}
}

Method (_L09, 0, NotSerialized)
{
If (\_SB.PCI0.EXP0.PSP0)
{
Store (0×01, \_SB.PCI0.EXP0.PSP0)
Notify (\_SB.PCI0.EXP0, 0×02)
}

If (\_SB.PCI0.EXP1.PSP1)
{
Store (0×01, \_SB.PCI0.EXP1.PSP1)
Notify (\_SB.PCI0.EXP1, 0×02)
}

If (\_SB.PCI0.EXP2.PSP2)
{
Store (0×01, \_SB.PCI0.EXP2.PSP2)
Notify (\_SB.PCI0.EXP2, 0×02)
}

If (\_SB.PCI0.EXP3.PSP3)
{
Store (0×01, \_SB.PCI0.EXP3.PSP3)
Notify (\_SB.PCI0.EXP3, 0×02)
}
}

Method (_L01, 0, NotSerialized)
{
If (\_SB.PCI0.EXP2.HPCS)
{
Store (0×01, \_SB.PCI0.EXP2.HPCS)
If (\_SB.PCI0.EXP2.ABP)
{
Store (0×01, \_SB.PCI0.EXP2.ABP)
}

If (\_SB.PCI0.EXP2.PDC)
{
Store (0×01, \_SB.PCI0.EXP2.PDC)
Store (0×00, \_SB.PCI0.EXP2.XCPF)
Notify (\_SB.PCI0.EXP2, 0×00)
If (\_SB.PCI0.EXP2.PDS)
{
Store (0×01, \_SB.PCI0.EXP2.XCPF)
Sleep (0×64)
Notify (\_SB.PCI0.EXP2.EXUP, 0×01)
}
}
}
}

Method (_L02, 0, NotSerialized)
{
Store (0×00, \_SB.PCI0.LPC.SWGE)
If (\_SB.PCI0.LPC.EC.HKEY.DHKC)
{
If (DT02)
{
\_SB.PCI0.LPC.EC.HKEY.MHKQ (0×6022)
}
}

Notify (\_TZ.THM1, 0×80)
If (\OSPX)
{
Notify (\_PR.CPU0, 0×80)
If (\MPEN)
{
Notify (\_PR.CPU1, 0×80)
}
}
}
}

可以看到 _L18 是從EC讀 Wake-up event 產生的原因, 而 _L18 從 ICH7 的Datasheet (Section 10.8.3)看來應該是接到GPIO8



_L09, 則是對應 PCI Express 的PME Event,



_L01 則是PCI 相關的 HotPlug Event, _L02 則是SWGPE Event 看來是 Thermal 的對應策略!



在 Section 5.6.4 in ACPI 4.0a 有描述 OSPM 應該怎樣處理, 節錄於下

OSPM manages the bits in the GPEx blocks directly, although the source to those events is not directly
known and is connected into the system by control methods. When OSPM receives a general-purpose event
(the event is from a GPEx_BLK STS bit), OSPM does the following:
1. Disables the interrupt source (GPEx_BLK EN bit).
2. If an edge event, clears the status bit.
3. Performs one of the following:
 Dispatches to an ACPI-aware device driver.
 Queues the matching control method for execution.
 Manages a wake event using device _PRW objects.
4. If a level event, clears the status bit.
5. Enables the interrupt source.
For OSPM to manage the bits in the GPEx_BLK blocks directly:
 Enable bits must be read/write.
 Status bits must be latching.
 Status bits must be read/clear, and cleared by writing a "1" to the status bit.

星期六, 六月 22, 2013

DPL,RPL,CPL 之间的联系和区别(intel 手册)(转)

这篇文章写的太好了!!这是保护模式完整的权限检查,其实当今的操作系统也不会弄的这么复杂……

 

特权级是保护模式下一个重要的概念,CPL,RPL和DPL是其中的核心概念,查阅资料无数,总结如下:
     简单解释:

--------------------------------------------------------------------------------

     CPL是当前进程的权限级别(Current Privilege Level),是当前正在执行的代码所在的段的特权级,存在于cs寄存器的低两位。
     RPL说明的是进程对段访问的请求权限(Request Privilege Level),是对于段选择子而言的,每个段选择子有自己的RPL,它说明的是进程对段访问的请求权限,有点像函数参数。而且RPL对每个段来说不是固定的,两次访问同一段时的RPL可以不同。RPL可能会削弱CPL的作用,例如当前CPL=0的进程要访问一个数据段,它把段选择符中的RPL设为3,这样虽然它对该段仍然只有特权为3的访问权限。
    DPL存储在段描述符中,规定访问该段的权限级别(Descriptor Privilege Level),每个段的DPL固定。
当进程访问一个段时,需要进程特权级检查,一般要求DPL >= max {CPL, RPL}
    下面打一个比方,中国官员分为6级国家主席1、总理2、省长3、市长4、县长5、乡长6,假设我是当前进程,级别总理(CPL=2),我去聊城市(DPL=4)考察(呵呵),我用省长的级别(RPL=3 这样也能吓死他们:-))去访问,可以吧,如果我用县长的级别,人家就不理咱了(你看看电视上的微服私访,呵呵),明白了吧!为什么采用RPL,是考虑到安全的问题,就好像你明明对一个文件用有写权限,为什么用只读打开它呢,还不是为了安全!


     全面解释:
--------------------------------------------------------------------------------

     RPL是段选择子里面的bit 0和bit 1位组合所得的值,但这里要首先搞清楚什么是段选择子,根据Intel 的文件(IA-32 IntelR Architecture Software Developer's Manual, Volume 3System Programming Guide)它是一个16Bit identifier (原文:A segment selector is a 16-bit identifier for a segment). 但 identifier 又是什么. identifier 可以是一个变数的名字( An identifier is a name for variables), 简单的说它可以就是一般意义的变数. 这里 16-bit identifier for a segment 可以就是一个一般意义的16bit变数但同时要求对它的值解释的时候必须跟据Intel定下的规则---也就是bit 0和bit 1位的组合值就是RPL等等… 因此在程序里如果有需要的话你可以声明一个或者多个变数来代表这些段选择子,这样的话你的程序在某一时刻就可以有很多段选择子,当然有那么多段选择子就有那么多RPL.可以这样说程序有多少个是RPL是你怎样看待你自己声明的变数. |
     程序的CPL(CS.RPL)是CS register 里bit 0和bit 1 位组合所得的值.在某一时刻就只有这个值唯一的代表程序的CPL. 
  
     而DPL是段描述符中的特权级, 它的本意是用来代表它所描述的段的特权级. 一个程序可以使用很多段(Data,Code,Stack)也可以只用一个code段等.在正常的情况下当程序的环境建立好后,段描述符都不需要改变-----当然DPL也不需要改变. 


   一、对数据段和堆栈段访问时的特权级控制:

     要求访问数据段或堆栈段的程序的CPL≤待访问的数据段或堆栈段的DPL,同时选择子的RPL≤待访问的数据段或堆栈段的DPL,即程序访问数据段或堆栈段要遵循一个准则:只有相同或更高特权级的代码才能访问相应的数据段。这里,RPL可能会削弱CPL的作用,访问数据段或堆栈段时,默认用CPU和RPL中的最小特权级去访问数据段,所以max {CPL, RPL} ≤ DPL,否则访问失败。


   二、对代码段访问的特权级控制(代码执行权的特权转移):

     让我们先来记一些“定律”:
    所有的程序转跳,CPU都不会把段选择子的RPL赋给转跳后程序的CS.RPL. .

     转跳后程序的CPL(CS.RPL)只会有下面的俩种可能
     转跳后程序的CPL(CS.RPL) = 转跳前程序的CPL(CS.RPL) 
     或
     转跳后程序的CPL(CS.RPL) = 转跳后程序的CodeDescriptor.DPL

     以 Call 为例(只能跳到等于当前特权级或比当前特权级更高的段):
     怎样决定这两种选择,这就要首先知道转跳后程序的段是一致代码段还是非一致代码段.其实也很简单,规则如下:
     如果能成功转跳到一致代码段, 转跳后程序的CPL(CS.RPL) = 转跳前程序的CPL(CS.RPL),(转跳后程序的CPL继承了转跳前程序的CPL)
     如果能成功转跳到非一致代码段, 转跳后程序的CPL(CS.RPL) =转跳后程序的Descriptor.DPL。(转跳后程序的CPL变成了该代码段的特权级.我在前面提到DPL是段描述符中的特权级, 它的本意是用来代表它所描述的段的特权级)怎样才能成功转跳啦?

     这里有四个重要的概念:

     1).段的保护观念是高特权级不找低特权级办事,低特权级找高特权级帮忙,相同的一定没问题.(这样想逻辑是没错,事实对不对就不知道.)也就是县长不找乡长,乡长不求农民,反过来农民求乡长,乡长找县长.这个概念是最重要的。
     2) 一致代码段的意义: 让客人很方便的利用主人(一致代码段)的东西为自己办事.但客人这身份没有改变NewCS.RPL=OldCS.RPL所以只能帮自己办事。比方说乡长有一头牛,农民可以借来帮自己种田,但不能种别人的田.但是如果你是乡长当然可以种乡里所有的田。
     3) 非一致代码段的意义:主人(非一致代码段)可以帮客人但一定是用自己的身份NewCS.RPL= DestinationDescriptorCode.DPL这里可能有安全的问题, 搞不好很容易农民变县长。主人太顽固了一定要坚持自己的身份,有什么方法变通一下,来个妥协好不好。好的,它就是RPL的用处。
     4) RPL: 它让程序有需要的时候可以表示一个特权级更低的身份Max(RPL,CPL)而不会失去本身的特权级CPL(CS.RPL),有需要的时候是指要检查身份的时候。事实上RPL跟段本身的特权级DPL和当前特权级CPL没有什么关系,因为RPL的值在成功转跳后并不赋给转跳后的CS.RPL。
     还是要问怎样才能成功转跳啦?这里分两种情况:

     普通转跳(没有经过Gate 这东西):即JMP或Call后跟着48位全指针(16位段选择子+32位地址偏移),且其中的段选择子指向代码段描述符,这样的跳转称为直接(普通)跳转。普通跳转不能使特权级发生跃迁,即不会引起CPL的变化,看下面的详细描述:


         目标是一致代码段:
              要求:CPL(CS.RPL)>=DestinationDescriptorCode.DPL ,其他RPL是不检查的。
              转跳后程序的CPL(NewCS.RPL) = 转跳前程序的CPL( OldCS.RPL)
              上面的安排就是概念1,2的意思,此时,CPL没有发生变化,纵使它执行了特权级(DPL)较高的代码。若访问时不满足要求,则发生异常。
         目标是非一致代码段:
              要求:CPL(CS.RPL)=DestinationDescriptorCode.DPL AND RPL≤CPL(CS.RPL)
              转跳后程序的CPL(NewCS.RPL) = DestinationDescriptorCode.DPL
              上面的安排就是概念3的意思和部分1的意思----主人(一致代码段)只帮相同特权级的帮客人做事。因为前提是CPL=DPL,所以转跳后程序的CPL(NewCS.RPL) = DestinationDescriptorCode.DPL不会改变CPL的值,特权级(CPL)也没有发生变化。如果访问时不满足前提CPL=DPL,则引发异常。


     通过调用门的跳转:当段间转移指令JMP和段间转移指令CALL后跟着的目标段选择子指向一个调用门描述符时,该跳转就是利用调用门的跳转。这时如果选择子后跟着32位的地址偏移,也不会被cpu使用,因为调用门描述符已经记录了目标代码的偏移。使用调门进行的跳转比普通跳转多一个步骤,即在访问调用门描述符时要将描述符当作一个数据段来检查访问权限,要求指示调用门的选择子的RPL≤门描述符DPL,同时当前代码段CPL≤门描述符DPL,就如同访问数据段一样,要求访问数据段的程序的CPL≤待访问的数据段的DPL,同时选择子的RPL≤待访问的数据段或堆栈段的DPL。只有满足了以上条件,CPU才会进一步从调用门描述符中读取目标代码段的选择子和地址偏移,进行下一步的操作。
     从调用门中读取到目标代码的段选择子和地址偏移后,我们当前掌握的信息又回到了先前,和普通跳转站在了同一条起跑线上(普通跳转一开始就得到了目标代码的段选择子和地址偏移),有所不同的是,此时,CPU会将读到的目标代码段选择子中的RPL清0,即忽略了调用门中代码段选择子的RPL的作用。完成这一步后,CPU开始对当前程序的CPL,目标代码段选择子的RPL(事实上它被清0后总能满足要求)以及由目标代码选择子指示的目标代码段描述符中的DPL进行特权级检查,并根据情况进行跳转,具体情况如下:


         目标是一致代码段:
              要求:CPL(CS.RPL)≥DestinationDescriptorCode.DPL ,RPL不检查,因为RPL被清0,所以事实上永远满足RPL≤DPL,这一点与普通跳转一致,适用于JMP和CALL。
              转跳后程序的CPL(NewCS.RPL) = 转跳前程序的CPL( OldCS.RPL),因此特权级没有发生跃迁。
              
         目标是非一致代码段:
                当用JMP指令跳转时:
                     要求:CPL(CS.RPL)=DestinationDescriptorCode.DPL AND RPL<= CPL(CS.RPL)(事实上因为RPL被清0,所以RPL≤CPL总能满足,因此RPL与CPL的关系在此不检查)。若不满足要求则程序引起异常。
                     转跳后程序的CPL(NewCS.RPL) = DestinationDescriptorCode.DPL
                     因为前提是CPL=DPL,所以转跳后程序的CPL(NewCS.RPL) = DestinationDescriptorCode.DPL不会改变CPL的值,特权级也没有发生变化。如果访问时不满足前提CPL=DPL,则引发异常。
                当用CALL指令跳转时:
                     要求:CPL(CS.RPL)≥DestinationDescriptorCode.DPL(RPL被清0,不检查),若不满足要求则程序引起异常。
                     转跳后程序的CPL(NewCS.RPL) = DestinationDescriptorCode.DPL
                     当条件CPL=DPL时,程序跳转后CPL=DPL,特权级不发生跃迁;当CPL>DPL时,程序跳转后CPL=DPL,特权级发生跃迁,这是我们当目前位置唯一见到的使程序当前执行忧先级(CPL)发生变化的跳转方法,即用CALL指令+调用门方式跳转,且目标代码段是非一致代码段。


     总结:以上介绍了两种情况的跳转,分别是普通跳转和使用调用门的跳转,其中又可细分为JMP跳转和CALL跳转,跳转成功已否是由CPL,RPL和DPL综合决定的。所有跳转都是从低特权级代码向同级或更高特权级(DPL)跳转,但保持当前执行特权级(CPL)不变,这里有点难于区别为什么说向高特权级跳转,又说特权级没变,这里“高特权级”是指目标代码段描述符的DPL,它规定了可以跳转到该段代码的最高特权级;而后面的CPL不变才真正说明了特权级未发生跃迁。我们可以看到,只有用CALL指令+调用门方式跳转,且目标代码段是非一致代码段时,才会引起CPL的变化,即引起代码执行特权级的跃迁,这是目前得知的改变执行特权级的唯一办法,如果各位读者还知道其他方法请留言告诉我。


     以上解释参考了OldLinux BBS的帖子http://www.oldlinux.org/cgi-bin/ ... topic=73&show=0


注:CS.RPL代表CS寄存器中的Register Privilege Level,并不是一般所说的Request Privilege Level. 

李一男2003年在港湾给开发人员培训时的语录(转)

【1】好好规划自己的路,不要跟着感觉走!根据个人的理想决策安排,绝大部分人并不指望成为什么院士或教授,而是希望活得滋润一些,爽一些。那么,就需要慎重安排自己的轨迹。从哪个行业入手,逐渐对该行业深入了解,不要频繁跳槽,特别是不要为了一点工资而转移阵地,从长远看,这点钱根本不算什么,当你对一个行业有那么几年的体会,以后钱根本不是问题。频繁地动荡不是上策,最后你对哪个行业都没有摸透,永远是新手!

【2】可以做技术,切不可沉湎于技术。千万不可一门心思钻研技术!给自己很大压力,如果你的心思全部放在这上面,那么注定你将成为孔乙己一类的人物!适可而止为之,因为技术只不过是你今后前途的支柱之一,而且还不是最大的支柱,除非你只愿意到老还是个工程师!

【3】不要去做技术高手,只去做综合素质高手!在企业里混,我们时常瞧不起某人,说他"什么都不懂,凭啥拿那么多钱,凭啥升官!"这是普遍的典型的工程师的迂腐之言。8051很牛吗?人家能上去必然有他的本事,而且是你没有的本事。你想想,老板搞经营那么多年,难道见识不如你这个新兵?人家或许善于管理,善于领会老板意图,善于部门协调等等。因此务必培养自己多方面的能力,包括管理,亲和力,察言观色能力,攻关能力等,要成为综合素质的高手,则前途无量,否则只能躲在角落看示波器!技术以外的技能才是更重要的本事!!从古到今,美国日本,一律如此!

【4】多交社会三教九流的朋友!不要只和工程师交往,认为有共同语言,其实更重要的是和其他类人物交往,如果你希望有朝一日当老板或高层管理,那么你整日面对的就是这些人。了解他们的经历,思维习惯,爱好,学习他们处理问题的模式,了解社会各个角落的现象和问题,这是以后发展的巨大的本钱,没有这些以后就会笨手笨脚,跌跌撞撞,遇到重重困难,交不少学费,成功的概率大大降低!

【5】知识涉猎不一定专,但一定要广!多看看其他方面的书,金融,财会,进出口,税务,法律等等,为以后做一些积累,以后的用处会更大!会少交许多学费!!

【6】抓住时机向技术管理或市场销售方面的转变!要想有前途就不能一直搞开发,适当时候要转变为管理或销售,前途会更大,以前搞技术也没有白搞,以后还用得着。搞管理可以培养自己的领导能力,搞销售可以培养自己的市场概念和思维,同时为自己以后发展积累庞大的人 脉!应该说这才是前途的真正支柱。。?

【7】逐渐克服自己的心里弱点和性格缺陷!多疑,敏感,天真(贬义,并不可爱),犹豫不决,胆怯,多虑,脸皮太薄,心不够黑,教条式思维。。。这些工程师普遍存在的性格弱点必须改变!很难吗?只在床上想一想当然不可能,去帮朋友守一个月地摊,包准有效果,去实践,而不要只想!不克服这些缺点,一切不可能,甚至连项目经理都当不好--尽管你可能技术不错!

【8】工作的同时要为以后做准备!建立自己的工作环境!及早为自己配置一个工作环境,装备电脑,示波器(可以买个二手的),仿真器,编程器等,业余可以接点活,一方面接触市场,培养市场感觉,同时也积累资金,更重要的是准备自己的产品,咱搞技术的没有钱,只有技术,技术的代表不是学历和证书,而是产品,拿出象样的产品,就可技术转让或与人合作搞企业!先把东西准备好,等待机会,否则,有了机会也抓不住!

【9】要学会善于推销自己!不仅要能干,还要能说,能写,善于利用一切机会推销自己,树立自己的品牌形象,很必要!要创造条件让别人了解自己,不然老板怎么知道你能干?外面的投资人怎么相信你?提早把自己推销出去,机会自然会来找你!搞个个人主页是个好注意!!特别是培养自己在行业的名气,有了名气,高薪机会自不在话下,更重要的是有合作的机会...

星期一, 六月 03, 2013

SMBIOS 介绍2(转-史丹利)

符合SMBIOS規範的電腦系統訊息獲取方法

符合SMBIOS規範的電腦系統訊息獲取方法
作者:ramble(如需轉載請注明作者)
SMBIOS (System Management BIOS, SMBIOS),它是一種定出主機板及系統廠商如何以標準的格式顯示產品管理資訊的規格。
SMBIOS 及 DMI(Desktop Management Interface)規格兩者皆是由 Desktop Management Task Force (DMTF) 所草擬的,它是一個由業界所領導,實行技術規格以確認開放性標準的組織。
符合SMBIOS規範的電腦,可以通過訪問SMBIOS的結構獲得系統息,共有兩種辦法可以訪問:

1.通過即插即用功能接口訪問SMBIOS結構,這個在SMBIOS2.0標准裏定義了,從SMBIOS2.1開始這個訪問方法不再被推薦使用。
2.基表結構的方法,表内容是tableentry point的數據,這個訪問方法從SMBIOS2.1以後開始被使用,從2.1開始,以後的版本都推薦使用這種訪問方式。在2.1版本中允許支這兩種方法中的任意一種和兩種都支,但在2.2已經以後的版本,必須支方法2

市場上計算機已經均支SMBIOS2.3標准,所以只考慮方法2,基表結構的訪問方式。
表結構訪問SMBIOS的過程是先找到EntryPoint StructureEPS)表,然後通過EntryPoint StructureEPS)表的數據找到SMBIOS數據表。
訪問SMBIOSEPS表的操作過程如下:
1.從物理内存0xF0000-0xFFFFF間尋找關鍵字"_SM_"
2.找到後再向後16個字節,看後面5BYTE是否是關鍵字"_DMI_",如果是,EPS表即找到。
注:按照SMBIOS規範説明,找到關鍵字"_SM_"後就可以確定此處就是EPS表結構,但我在實際操作中發現有為數不少的電腦的指定64K内存中有不只一個"_SM_",所以不能用找到"_SM_"來確定,需要繼續判斷16個字節後是否是"_DMI_"
SMBIOSEPS表結構如下:
位置名稱 長度描述
00H 關鍵字4 byte 固定是"_SM_"
04HCheck Sum 1 byte用於檢查數據
05H表結構長度 1 byteEntry Point Structure表的長度
06HMajor版本號碼 1 byte用於判斷SMBIOS版本
07HMinor版本號碼 1 byte用於判斷SMBIOS版本
08H表結構大小 2 byte用於即插即用接口方法獲得數據表結構長度
0AHEPS修正 1 byte
0B-0FH格式區域 5 byte存放解釋EPS修正的訊息
10H關鍵字 5 byte固定為"_DMI_"
15HCheck Sum 1 byteIntermediate Entry Point Structure(IEPS)Check Sum
16H數據表長度 2 byteSMBIOS數據表長度
18H數據表位址 4 byteSMBIOS數據表的真實內存位置
1CH數據表結構數目 2 byteSMBIOS數據表的結構數目
1EHSMBIOS BCD修正 1 byte
通過EPS表結構中的12H以及14H處,得出數據表長度和數據表地址,即可通過地址訪問結構表。從EPS表中的1CH處可得知結構表結構的總數,其中TYPE0結構就是BIOSinformationTYPE1結構就是SYSTEMInformation
每個結構的頭部是相同的,格式如下:
位置名稱 長度描述
00HType number 1 byte結構的type number
01H長度 1 byte本結的長度,就此type number的結構而言
02HHandle 2 byte用於獲得SMBIOS結構,使用方法未知
每個結構都分為格式區域和字符串區域,格式區域就是一些本結構的信息,字符串區域是緊隨在格式區域後的一個區域。結構01H處標識的結構長度僅是格式區域的長度,字符串區域的長度是不固定的。
下面以TYPE0BIOSinformation)為例説明格式區域和字符串區域的關系

TYPE0BIOSinformation)格式區域如下:
位置名稱 長度描述
00HType number 1 byte結構的type number,此處是0
01H長度 1 byteType 0格式區域的長度,一般為14H,也有13H
02HHandle 2 byte一般為0000H
04HBIOS廠商訊息 1 byte此處是BIOS賣方的訊息,可能是OEM廠商名,一般為01H,代表緊隨格式區域後的字串區域的第一個字串
05HBIOS版本 1 byteBIOS版本號,一般為02H,代表字串區域的第二個字串
06HBIOS開始位址段 2 byte用於計算常駐BIOS鏡像大小的計算,方法為(10000H-BIOS開始位址段)*16
08HBIOS發佈日期 1 byte一般為04H,表示字串區第三個字串
09HBIOS ROM Size 1 byte計算方法為(n+1)*64Kn為此處讀出的數值
0AHBIOS特徵 8 byteBIOS的功能支援特徵,如PCI,PCMCIA,FLASH等等
12HBIOS特徵擴展 不定
緊隨TYPE0BIOSinformation)結構區域之後的就是TYPE0BIOSinformation)字符串區域,如下所示:
db'System BIOS Vendor Name',0 ; 字符串以零結尾,第一個字符串:賣方
db'4.04',0 ; 第二個:BIOS版本
db'00/00/0000',0 ; 第三個:發布日期
db0 ; 0為整個字符區域的結尾,所以要找下一個TYPE,只要在字符區域找到連續的0000H即可
注:當有EPS表中得到結構表的開始地址後,可以直接按結構來尋找相應的TYPE號,找到後直接讀取就是該TYPE對應的結構的格式區域息,然後向後移動結構區域長度(構區域長度由該結構的01H處讀出)個BYTE,即是該TYPE機構的字符串區域。


由上面介紹可知,獲得BIOS息的辦法就是:

1.通過EPS表的12H14H數據找到TYPE結構表,然後找到TYPE0的内存地址。(不一定是首個)
2.由TYPE0結構區域中得出相應BIOS息是否存在(存在則是上面所述的 01H,02H,03H依次排布,不存在則是相應的位置上為00H)。
3.如存在息,則從字符串區域中讀取對應BIOS息。
獲得SYSTEM信息方法同上,只是TYPE結構區域有所不同,請參照SMBIOSReference Specification

在Linux環境裏可以使用dmidecode這支程式去dump SMBIOS的資料
dmidecode主要功能:
桌面管理介面提供標準化的電腦硬體描述,包括硬體的特性,比如 BIOS 的序號、與硬體連接線。dmidecode 提供由 BIOS 輸出 DMI 的資料,通常被其他硬體偵測程式當作後端工具使用。

張貼者: 於 下午9:05