龍芯軟體開發 8 理解龍芯2E暫存器和記憶體布局

2021-04-12 15:18:26 字數 2407 閱讀 3279

對於軟體開發人員來說,乙個cpu最重要的部分就是暫存器、記憶體布局和指令。龍芯2e

邏輯上是有

32個定點通用暫存器(其中

0號固定為0),

32個浮點暫存器,乙個

hi,乙個

lo,以及若干

cp0控制暫存器,兩個

cp1控制暫存器。物理上是

64個定點,

64個浮點,和若干控制暫存器。

龍芯2e具有下面的邏輯暫存器: l

32個通用的64位暫存器 l

1個pc暫存器 l

2個儲存乘除操作結果暫存器 l

32個浮點64位暫存器 l

32個cp0控制暫存器 l

2個cp1控制暫存器

一、32個通用的64位暫存器

這32個通用暫存器,可以用作任何使用。但實際上由於編譯器已經約定特定的使用,所以還是要服從特定的約定,這樣可以減少麻煩,減少開發出錯機會。特定使用如下: l

$0      zero   

值總是為

0,可能主要用途是清空記憶體位址空間,以及做一些與或非的操作,訪問速度快。 l

$1      $at

是為編譯器保留的暫存器 l

$2..$3    v0..v1

儲存函式返回值用 l

$4..$11   a0..a7

函式呼叫時傳遞引數,可以傳遞

8個整型引數 l

$12..$15 t0..t3 

臨時暫存器,用於儲存臨時變數的值,也是用的最多的暫存器 l

$16..$23 s0-s7    

他們的值在過程呼叫的時候保持不變,可以用於傳遞引數或者返回值 l

$24..$25 t8..t9  

臨時暫存器,用於儲存臨時變數的值,也是用的最多的暫存器 l

$26..$27 k0..k1    

保留給作業系統核心使用 l

$28   gp 

儲存全域性指標 l

$29   sp  

儲存堆疊指標 l

$30   fp

或s8  

儲存幀指標,也可以和

s0..s7

一樣使用 l

$31   ra 

儲存返回位址 二、

專用暫存器hi和

lo主要返回乘除結果,

pc是指令計數器。

三、記憶體布局 在

32位下,程式位址空間劃分為

4個大區域。每個區域有乙個傳統的名字。對於在這

kuseg: 0x000 0000 - 0x7fff ffff (

低端2g)有

mmu的機器裡,這些位址將一概被

mmu作轉換。除非

mmu的設定被建立好,這

2g位址是不可用的。

對於沒有

mmu的機器,訪問這

2gcpu

具體廠商提供的

手冊將會告訴你關於這方面的資訊。如果想要你的**在有或沒有

mmu的

mips

處理器之間有相容性,盡量避免這塊區域的訪問。

kseg0: 0x8000 0000 - 0x9fff ffff(512m):

這些位址對映到實體地址簡單的通過

把最高位清零,然後把它們對映到實體地址低段

512m

(0x0000 0000 - 0x1fff ffff)

。因為這種對映是很簡單的,通常稱之為

「非轉換的

「位址區域。

幾乎全部的對這段位址的訪問都會通過快速快取

(cache)

。因此在

cache

設定好之前,不能隨便使用這段位址。通常乙個沒有

mmu的系統會使用這段位址作為其絕大多數程

序和資料的存放位置。對於有

mmu的系統,作業系統核心會存放在這個區域。

kseg1: 0xa000 0000 - 0xbfff ffff(512m):

這些位址通過把最高

3位清零的方法來

對映到相應的實體地址上,與

kseg0

對映的實體地址一樣。但

kseg1

是非cache

訪問的。

kseg1

是唯一的在系統重啟時能正常工作的位址空間。這也是為什麼重新啟動時的入口向量是

0xbfc0 0000

。這個向量相應的實體地址是

0x1fc0 0000

。將使用這段位址空間去訪問你的初始化

rom。大多數人在這段空間使用

i/o暫存器。

kseg2: 0xc000 0000 - 0xffff ffff (1g):

這段位址空間只能在核心態下使用並且要經過

mmu的轉換。在

mmu設定好之前,不能訪問這段區域。除非你在寫乙個真正的作業系統,一般來說你不需要使用這段位址空間。

龍芯軟體開發 12 龍芯2E摸索前行

上一次說到怎麼樣執行起來,現在接著上次再進行分析下去。在 locate的程式,如下 locate la s0,start subu s0,ra,s0 ands0,0xffff0000 li t0,sr boot exc vec mtc0 t0,cop 0 status reg mtc0 zero,c...

龍芯軟體開發 11 龍芯2E執行的第一行程式

天生萬物,萬物始於天。同樣,龍芯2e要執行起來,那麼就少不了程式。那麼龍芯2e的盤古開天是從那裡開始呢?追源尋根,才能了解事物的來龍去脈,才能把握住未來的方向。現在就去尋找龍芯電腦執行的第一行程式,去看看龍芯的初始化階段都做了些什麼事情,有沒有做壞事情呢?哈哈,這個很難說的。如果有bug的出現,就會...

關閉龍芯2E 之 cache

發表日期 2006 11 01 19 50 pmon 載入kernel 時,是載入到 kseg0 的 通過在 arch mips makefile 中 load config godsonev2e 0x80100000 指定 該位址空間是 unmaped cached 的,當 pmon 將控制權交給...