上一次說到怎麼樣執行起來,現在接著上次再進行分析下去。在
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 將控制權交給...