對於軟體開發人員來說,乙個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 將控制權交給...