AMD64 體繫結構 學習筆記

來源:互聯網
上載者:User

關於Address-size

在64位元模式下,預設使用,64位定址空間,可以使用67H 的指令首碼, 重載為32位定址空間, 64位元模式下,不支援16位定址空間.

關於Operand-size

64位元模式下,預設使用32位運算元,使用REX首碼,重載為64為運算元.使用66H的首碼,重載為16位運算元. 一些使用到RSP的近跳轉的指令(CALL,Jcc,JMP,LOOP,LOOPcc,PUSH,POP), 預設使用64位的運算元,不需要加上REX首碼.

關於Call:
1, 段內call(near call), 將rIP壓入本進程的stack中.
2,段間call(far call, 同樣的保護級), 將rIP,CS壓入本進程的stack中.
3,切換保護級的call(far call,進入更高的保護.級), 從TSS中獲得新的程式的stack指標, 將舊的ss.,rSP,儲存到新的stack中,在相容模式下,將指定數量的參數從舊的stack中複製到新的stack中.long mode下,沒有這樣的複製動作,個人認為在long mode下,沒有程式碼片段分段的概念.將CS, rIP壓入新的stack中.

關於任務切換:
1,相容模式下, 將當前的進程狀態(各寄存器的值,頁表地址等資訊)儲存到當前的進程TSS中. 將新的進程的狀態資訊從新進程的TSS中,載入到處理器.
2.Long mode不在支援硬體進程切換.

關於syscall & sysret:
使用傳統的call, ret 處理器需要花費更多的操作,因為它是基於段的保護和特權檢查. 它不僅僅在與段寄存器的重新載入引起的段描述符的載入的花費, 也需要時間對對保護, 類型和特許可權制的檢查.
These instructions eliminate segment-based privilege checking by using predetermined target and return code segments and stack segments. The operating system sets up and maintains the predetermined segments using special registers within the processor, so the segment descriptors do not need to be fetched from memory when the instructions are used. The simplifications made to privilege checking allow SYSCALL and SYSRET to complete in far fewer processor clock cycles than CALL and RET.

這段只能意會,不能言傳,哈哈.基本上,作業系統使用CPU中的特殊處理,負責設定,維護將要用到的段.
SYSRET指令只能在CPL=0的程式中使用, CPL>0的應用程式不能使用,

SYSENTER & SYSEXIT , Long mode下不支援.

關於異常處理(exception):

分三種:

1,fault:  發生exception的邊界是被中斷的指令前, 當處理完exception的常式後,返回重新執行被中斷的指令. 頁異常(page exception)就是這種異常.

2,trap: 發生邊界是指令執行後, 在異常服務程式運行之前,引起異常的程式已經完成. 軟體中斷和用於debug的斷點異常就是這樣的類型.

3,Abouts: 是一個模糊不精確的異常, 不能恢複被中斷的程式繼續運行.

Long mode下, Interrupt & exception 的跳轉總要儲存舊的進程的SS.rSP, 而從中斷處理常式的TSS中載入新的SS,rSP.

Interrupt 返回: IRET, IRETD, and IRETQ 指令使CPU從中斷處理常式返回.如果中斷或者異常push了一個error code到stack種,在執行IRET前,中斷處理常式必須 將其pop出.

關於cache:
cache管理是將整個cache分成多個block,稱之為cache line, cache的填充和廢棄,都是以cache line 為單位的.
cache的汙染:
1, Temporal locality: 處理器假設最近訪問過的記憶體,再很短時間內將被再次訪問, 否則則認為cache被汙染.
2.Spatial locality: 處理器假設相鄰的記憶體,將再很短的時間內被訪問, 否則則認為cache被汙染.
3,stale data: 處理器假設很長時間沒有被訪問的記憶體,將短時間內不會被訪問. 認為cache'被汙染,

cache控制的指令:
1:PREFETCHlevel: 如果以無效的記憶體位址作為運算元執行此指令, 不會產生異常, 指令執行沒有效果. 如果運算元所指定的記憶體位址是non-cacheable或者是writecombining 類型的memory,指令執行也沒有效果.

2:PREFETCH: 以讀的方式load data到cache, 寫這個cache line會有額外的時間消耗用於改變cache line 的 modified標誌.
3.PREFETCHW: 以寫的方式load data到cache,load的時候就將cache line的modified標誌設定了.加快的執行速度.

關於浮點數:

  Sign Exponent Fraction Bias
Single Precision 1 [31] 8 [30-23] 23 [22-00] 127
Double Precision 1 [63] 11 [62-52] 52 [51-00] 1023

浮點數的指數是以實際指數值加上Bias值,儲存在儲存位置的
因此實際的指數值=儲存的指數值-Bias

浮點數可表示的範圍:

  Denormalized Normalized Approximate Decimal
Single Precision ± 2-149 to (1-2-23)×2-126 ± 2-126 to (2-2-23)×2127 ± ~10-44.85 to ~1038.53
Double Precision ± 2-1074 to (1-2-52)×2-1022 ± 2-1022 to (2-2-52)×21023 ± ~10-323.3 to ~10

 根據規定的浮點數的範圍和指數計算方法,可以得知,規格化的非零的浮點數的指數部分的值,為1到254,之間.

浮點數分為:
1,規格化浮點數:指數部分為1-254
2.非規格化浮點數: 指數部分為0,尾數非0的數
3,正負0:指數部分為0,尾數0的數
4,正負無窮:指數部分為255,尾數0的數
5.NaN, 不合法的浮點數.
   QNan: :指數部分為255,尾數第一個有效位為1的數
QNan: :指數部分為255,尾數第一個有效位為0的非0數

Sign Exponent (e) Fraction (f) Value
0 00..00 00..00 +0
0 00..00 00..01
:
11..11
Positive Denormalized Real
0.f × 2(-b+1)
0 00..01
:
11..10
XX..XX Positive Normalized Real
1.f × 2(e-b)
0 11..11 00..00 +Infinity
0 11..11 00..01
:
01..11
SNaN
0 11..11 10..00
:
11..11
QNaN
1 00..00 00..00 -0
1 00..00 00..01
:
11..11
Negative Denormalized Real
-0.f × 2(-b+1)
1 00..01
:
11..10
XX..XX Negative Normalized Real
-1.f × 2(e-b)
1 11..11 00..00 -Infinity
1 11..11 00..01
:
01..11
SNaN
1 11..11 10..00
:
11.11
QNaN

128位多媒體指令:

1. Move 系列指令

    MOVD: 記憶體,通用寄存器和XMM寄存器之間傳遞32位或者64位元據, 如果要傳遞64位元據,需要REX指令首碼.

                傳遞到XMM寄存器,將回0擴充其餘的高位.

   MOVQ:  記憶體,通用寄存器和XMM寄存器之間傳遞64位元據,  傳遞到XMM寄存器,將回0擴充其餘的高位.

   MOVDQA: 記憶體,XMM寄存器和XMM寄存器之間傳遞128位元據,如果和記憶體之間傳遞資料,則需要記憶體位址對齊.

  MOVDQU: 記憶體,XMM寄存器和XMM寄存器之間傳遞128位元據,如果和記憶體之間傳遞資料,不需要記憶體位址對齊.

 MOVDQ2Q: 將XMM寄存器中的低64位傳遞到MMX寄存器中.

  MOVQ2DQ: 將MMX寄存器中的資料傳遞到XMM寄存器的低64位,被0擴充到128位.

2, 使用Non-Temporal方式傳遞資料,可以減少cache的汙染. 這些指令直接從記憶體中擷取資料,而不通過cache

   MOVNTDQ,  MASKMOVDQU

  PMOVMSKB:  將XMM寄存器中的每個位元組存到32位或者64位通用寄存器的低位,並且0擴充,

資料轉換: 從XMM寄存器,記憶體中的整數轉換成浮點數

  CVTDQ2PS:4個32位 有符號整數轉換成4個單精確度浮點數

   CVTDQ2PD:2個64位 有符號整數轉換成2個雙精確度浮點數

  轉換MMX寄存器或記憶體中中的整數為浮點數:

CVTPI2PS: 將2個DWORD寬度的整數轉換為2個單精確度浮點數到XMM的低64位,並且0擴充到128位

CVTPI2PD: 將2個DWORD寬度的整數轉換為2個雙精確度浮點數.
插段廣告

Linux文化T恤,淘寶銷售,有興趣的可以購買。

淘寶店面地址:

http://auction1.taobao.com/auction/item_detail-0db2-5ba9dd77b24e43b427e1d71d7b19a0d2.jhtml

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.