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

2021-08-22 06:32:25 字數 2334 閱讀 6490

上一次說到怎麼樣執行起來,現在接著上次再進行分析下去。在

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,cop_0_cause_reg

.set noreorder

li bonito,phys_to_uncached(bonito_reg_base) …

bal 1f

nop/* bonito endianess */

bonito_bic(bonito_bonponcfg,bonito_bonponcfg_cpubigend)

bonito_bic(bonito_bongencfg,bonito_bongencfg_byteswap|bonito_bongencfg_mstrbyteswap)

bonito_bis(bonito_bonponcfg, bonito_bonponcfg_is_arbiter) …

exit_init(0)

#define init_op 0

#define init_a0 4

#define init_a1 8

#define init_a2 12

#define init_size16

1:move a0,ra

reginit: /* local name */

lwt3, init_op(a0)

lwt0, init_a0(a0)

and t4,t3,op_mask

/* * exit(status) */

bne t4, op_exit, 8f

nopmove v0,t0

b .done

nop …

跳到locate裡執行的,首先計算跳轉時**的長度,儲存s0。接著把實體地址儲存到bonito暫存器,後面又通過bal 1f跳到後面的1標號地方執行。

在1標號的地方,取跳轉時壓入的ra暫存器的值,然後通過暫存器相對定址的方式,取得跳轉指令後面儲存的引數,並儲存到t3,t0暫存器。後面就執行

bne t4, op_exit, 8f

這句了,在這裡作是否初始化暫存器完成的判斷,如果沒有完成,就會跳到後面8標號處執行,然後經歷一系列的設定後,直到op_exit標誌出現。看到前面有一行exit_init(0),這裡就是說這個資料結構已經結構了,它的巨集定義如下:

#define exit_init(status) /

.wordop_exit,(status);/

.word0,0

所以在最後一項的資料記錄讀取後,總是能退出這個初始化迴圈的,接著就會跳到.done這個標號裡執行。

接著看一下這段**又有什麼事情好做,**如下:

.done:

bal superio_init

nop

bal initserial

nopprintstr("/r/npmon2000 mips initializing. standby.../r/n")

printstr("errorpc=")

mfc0 a0, cop_0_error_pc

bal hexserial

nopprintstr(" config=")

mfc0 a0, cop_0_config

bal hexserial

nopprintstr("/r/n")

printstr(" prid=")

mfc0 a0, cop_0_prid

bal hexserial

nopprintstr("/r/n")

/* 蔡軍生 2006-12-29 於深圳*/

在這段程式裡,主要做了兩件大事情,一是初始化南橋晶元via686b,一是初始化串列埠輸出。初始化via686b是呼叫子函式

superio_init

實現的。初始化串列埠是呼叫子函式initserial實現的。為了盡快地從串列埠輸出除錯資訊,所以要先初始化via686b晶元,才能輸出資訊出來。由於via686b晶元包括所有外面介面的功能,比如串列埠,ps2,usb,並口,還有軟盤等等。只能從串列埠輸出字元,就已經是成功的第一步了。在嵌入式的軟體開發中,除錯軟體是最難的,只能根據晶元的管腳電平,或者串列埠發些調資訊出來。使用管腳除錯,最簡單的辦法,就是加乙個指示燈,這也叫「點燈**」。只要串列埠能輸出字串後,使用串列埠除錯就成為基本的方法了。後面,輸出三個cp0暫存器的值,第乙個暫存器是出錯資訊,第二個暫存器是cp0配置資訊,第三個暫存器是cp0處理器的id資訊。

下一次再分析怎麼麼樣初始化via686b和串列埠。

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

對於軟體開發人員來說,乙個cpu最重要的部分就是暫存器 記憶體布局和指令。龍芯2e 邏輯上是有 32個定點通用暫存器 其中 0號固定為0 32個浮點暫存器,乙個 hi,乙個 lo,以及若干 cp0控制暫存器,兩個 cp1控制暫存器。物理上是 64個定點,64個浮點,和若干控制暫存器。龍芯2e具有下面...

龍芯軟體開發 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 將控制權交給...