ARM 與 MIPS 比較 (X86)

http://blog.163.com/tao198352__4232/blog/static/8502064520105984211236/?fromdm&fromSearch&isFromSearchEngine=yes

 

 

1.流水線結構 pipeline
    - MIPS 是最簡單的體系結構之一,所以使大學喜歡選擇 MIPS 體系結構來介紹計算體系結構課程。
    - ARM has barrel shifter
        shifter是兩面性的,一方面它可以提高數學邏輯運算速度,另一方面它也增加了硬件的複雜性。所以和可以完成同樣功能的adder/shift register相比,效率更高,但是也     佔用更多的芯片面積。
       
    - MIPS have "branch delay slot" and "load delay slot"
        MIPS使用編譯器來解決上面的兩個問題。因爲MIPS最初的設計思想就是使用簡單的RISC硬體,然後靠編譯器及其他軟體技術,來達成RISC的完整概念。

2.指令結構 instruction
    - MIPS have 32bit and 64bit architecture,but ARM only have 32bit architecture
       ARM11 局部64位
    - MIPS是開放式的架構,用戶可以在開發的內核中加入自己的指令,
    - ARM has 4-bit condition code in every instruction
      ARM 在這一點很像x86。MIPS在MIPS IV也加入"conditional move"指令,來提高pipeline的效率。
    - ARM has pre- and post-increment addressing modes
        auto-increment/decrement on load/store instructions
    - 在節省代碼空間方面,MIPS16 很類似ARM Thumb

3.寄存器 register
    -  由於MIPS內核中有32個註冊器(Register),而ARM只有16個,這種結構設計上的先天優勢,決定了在同等性能表現下,MIPS的芯片面積和功耗會更小。
    -  ARM 有一組特殊用途寄存器cp0-cp15,可以使用MCR,MRC等指令控制; 相對應的,MIPS也有cp0 0-30,使用mfc0,mtc0 指令控制。

    -  Register banking in ARM.  r8-r12 FIQ mode;r13:SP r14 R
       感覺不出banked register有什麼好處。

    -  MIPS has a hard-wired-to-zero register ,but ARM not
       MIPS use register $0 for Zero

4.地址空間 address space
    -  MIPS 起始地址是0xbfc00000,會有4Mbyte的大小限制,但一般MIPS芯片都會採取一些方法解決這個問題。
       ARM沒有這種問題。
       MIPS24K 起始地址改到了0xbf000000,現在有16Mbyte的空間了。

    -   MIPS don't have to turn paging on to enable the cache.
        MIPS have the address space for both cache and un-cache
        but ARM need enable/disable cache

5.功能 function
    -   Float point: MIPS64 has.
        ARM's support for FP is limited, and usually not included, and it is a 32 bit architecture
    -   ARM use JTAG,MIPS use EJTAG。Debug工具一般兩種都支持。使用起來感覺差不多。

6.性能 performance
    -  具體性能比較,因爲差異性太大,所以很難分出誰好誰壞。從個人經驗來講 MIPS4k和ARM9基本上是同一個級別的,但ARM9性能似乎要比MIPS4K好。
       同樣是32bit的MIPS24K性能上比MIPS4K有很大提升,也應該比ARM9要好些。
       因爲沒有用過ARM11和MIPS34K的芯片,沒法比較,但感覺這兩個似乎是一個級別的。

7.應用
    -  在1000MHz以上的應用,很難找到採用ARM架構的產品。
       MIPS架構用在200MHz或者是266MHz以下的應用比較少,而這恰恰是ARM的主攻市場。
    -  ARM 在手機等便攜式領域,MIPS 在住宅網關、線纜調制解調器、線纜機頂盒等
    -  ARM 採用硬核授權;MIPS 採用軟核授權,用戶可以自己配置,做自己的產品。

8.未來發展
    -  ARM的下一代走向多內核結構,而MIPS公司的下一代核心則轉向硬件多線程功能(multithreading)
       MIPS 的multithreading 很類似Intel 的 HyperThreading技術。從現在的發展來看,多內核佔上風。

 

 

 

 

 

http://ydragongfly.blog.sohu.com/116425075.htm

 

1. MIPS 與 X86 的 TLB 差別

其在於對 TLB 不命中時的處理上:

MIPS 會觸發TLB Refill 異常,內核的 tlb_refill_handler 會以 pgd_current 爲當前進程的 PGD 基址,索引獲得轉換失敗的虛址對應的 PTE,並將其填入 TLB,完了CPU 把剛剛轉換失敗的虛地址再走一下 TLB 就OK了。

而 X86 在 TLB 不命中時,是由硬件 MMU 以 CR3 爲當前進程的 PGD 基址,索引獲得 PFN 後,直接輸出 PA。同時 MMU 會填充 TLB 以加快下次轉換的速度。

另外轉換失敗的虛址,MIPS 使用 BadVAddr 寄存器存放,X86 使用 CR2 存放。


2. 關於 MIPS32 頁表的大小問題,系統每 fork 一個進程或者 clone 一個進程沒有CLONE_VM標誌,內核都會調用 __get_free_pages 爲新進程分配一個頁給頁目錄表,前512項初始化都指向invalid_pte_table(空頁表,共有 PAGE_SIZE/sizeof(pte_t) 項),後面的都從 init 進程繼承。而後內核會根據新進程所需的存儲空間大小,爲其分配頁表(大小爲一個頁),分配內存頁,設置相應的頁表項,設置對應的頁目錄表項。

可以看到,只要進程數目固定頁目錄表所需的空間是固定的,每個進程頁目錄表爲一個頁大小;而進程總頁表的大小要依賴於進程代碼、數據的大小。

一個典型的 MIPS32 系統,頁大小爲4KB,單用戶模式,僅有bash進程,其頁表大小爲 48KB 左右(cat /proc/meminfo|grep PageTables);頁目錄的大小可由下式計算:

PGD_SIZE = NR_PROCESS(exclude kernel thread) * PAGE_SIZE


3. MIPS TLB 的每項的主要數據有: | G | ASID | VPN | PFN | ,其中 VPN 爲 virtual page number, PFN 爲 physical frame number。 項與項之間沒有次序,CPU 轉換時是直接匹配的。不能稱爲 Page Table 。

而 Page Table 當年設計成 數組結構,以數組的下標作爲虛頁號是經過考慮的,即使今天看來,我們依然能夠體會它的巧妙。


4. 內核在從彙編語言跳到C語言中時,其棧的棧頂是在哪裏設置的?

內核在進入 start_kernel 前,將 esp 指向了 init_thread_union + THREAD_SIZE, init_thread_union 位於 .data.init_task 節,是個 union 結構,其大小爲 THREAD_SIZE,定義的比較巧妙:

union thread_union {
struct thread_info thread_info;
unsigned long stack[THREAD_SIZE/sizeof(long)];
};


5. 內核態線程、內核線程以及進程的內核棧問題

linux 下線程庫的實現,以常用的 Linuxthread 或者 NPTL 爲例,這些庫創建線程是使用這些標誌 CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND 調用 clone() 來實現的,就是一個輕量級進程。


在使用 fork, vfork, clone 這些函數創建進程或者輕量級進程時,內核都會調用 alloc_task_struct() 爲其分配一個 task_struct;調用 alloc_thread_info() ,表面上看好像是分配 thread_info 結構,實際上:

#define alloc_thread_info(tsk) kmalloc(THREAD_SIZE, GFP_KERNEL)

分配了 THREAD_SIZE 的空間,底端爲 thread_info ,指向它的指針保存於 task_struct->thread_info 中。可以看到,task_struct->thread_info + THREAD_SIZE 即爲進程或者輕量級進程的內核棧棧底。

無論是使用 clone 生成輕量級進程,還是使用 kernel_thread 創建內核線程,他們都會進入 do_fork,進而調用 alloc_thread_info(),因此他們都有內核棧,大小爲 THREAD_SIZE,底端爲 thread_info 。

因此linux 下,每個線程都會有一個內核棧,這個當線程數目很大時是個問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章