版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Pmon
TableofContents
1.pmon簡(jiǎn)介2
2.Pmon命令4
3.pmon目錄結(jié)構(gòu)9
4.pmon的編譯11
4.1pmon的酉己置11
4.2pmon的編譯13
5.pmon啟動(dòng)流程14
6.PMON終端顯示76
7.PMON中的系統(tǒng)調(diào)用80
8.PMON中的proc管理88
9.pmon中的socket和tcpip94
10.pmon網(wǎng)卡驅(qū)動(dòng)109
10.1pmon中的查詢機(jī)制109
10.2驅(qū)動(dòng)加載機(jī)制112
10.3網(wǎng)絡(luò)包的接收和發(fā)送112
10.4Rtl8139網(wǎng)卡配置和相關(guān)文件121
10.5網(wǎng)卡驅(qū)動(dòng)結(jié)構(gòu)124
11.pmon顯卡模擬130
X86模擬器包括幾個(gè)部分:130
vga_bios_init的流程130
12.PMON中的硬盤驅(qū)動(dòng)142
1.pmon簡(jiǎn)介
PMON是最常用的mipscpu的BIOS,功能十分強(qiáng)大。僅需要一個(gè)用口,512KBROM,128KBRAM就能
實(shí)現(xiàn)PMON的全部特性。它不僅支持BIOS啟動(dòng)配置,內(nèi)核加載,還支持程序調(diào)試,內(nèi)存寄存器顯示
和設(shè)置,內(nèi)存反匯編等等。
l)pmon起源
TheoriginalversionofthePMONprogramwaswrittenbyPhilBunceforLSI
LogicInc,whohavekindlymadethesourcesfreelyreusablewithoutroyalty.
ThePMONprogramincludessoftwaredevelopedbytheUniversityofCalifornia,
Berkeleyanditscontributors.Specifically,theethernetUDP/IPprotocolstack
anditssupportsoftwarecomefromtheBSD4.3/netsoftwarerelease.
摘自:PMONUsersManual,Algorithmics,Revision:1.4
目前龍芯pmon代碼來自于開源項(xiàng)目pmon2000(http://www.opsycon,se/pmonmain)□
支持的處理器:MIPSARMPowerPC.
License:BSDLicensed
代碼:C語言
PMON>vers
PMON:PM0N20002.1(Bonito)#57:2007081519:55:53UTC
2)pmon功能
我們又在上面增加了很多功能。
目前pmon的功能:
文件系統(tǒng):
ext2,ext3,fat32,ram
加載方式:
網(wǎng)絡(luò)tftp,硬盤,串口
環(huán)境變量:
emos中或flash中
更新:
網(wǎng)絡(luò)tftp,硬盤,串口在線更新flash
調(diào)試:
pmon本身集成了debuger,也可以通過模擬器gxemul結(jié)合gdb來調(diào)試
3)PMON啟動(dòng)
在默認(rèn)方式下,自動(dòng)引導(dǎo)從硬盤或者網(wǎng)絡(luò)TFTP裝載引導(dǎo)內(nèi)核;當(dāng)按住功能鍵(如空
格)的時(shí)候,進(jìn)入類似UNIX命令行式的顯示界面。
PMON在引導(dǎo)程序中對(duì)設(shè)備進(jìn)行配置,包括串口、鍵盤、顯卡、PCI設(shè)備地址分配。在命
令行界面上可以配置網(wǎng)卡,設(shè)置網(wǎng)卡地址。設(shè)置信息被保存在flash中。PMON能實(shí)現(xiàn)linux
內(nèi)核從硬盤、軟盤和網(wǎng)絡(luò)加載來引導(dǎo)操作系統(tǒng)。
下面是pmon的啟動(dòng)界面
:[[[[[[[[[[[[[[!
出叫E
[1[1[[[[[[r[[[[[[[:[[[[[[:[匚[[[[[[[[[[[
□Efit[E:E里木E
出E:EEE陽E
Er
EC[[[[[[[.[[[[[[[[工[[[二[[[[[[[[[[[[[
i[[[:[[EEE三至
[[[[[EEE[Eff土EE三MEEEEE二E
LC[[[[[[[[[[:[:[[[[tn[L工[[[::[[[[[[[r[[[[[[
EE[[[[[
EE出EE出EE的EEEf[CCJ和E出出」
2005:[etc[[[[[[[[[[[[[[[:[[[[[r[[[[[[[[[[[[[[[[[[[[r[[[[[[[[[
ConfigurationiBonito,EL,NET,IDE]
Version:PM0N20002.1(Bonito)唔9:SatJul3014:23:31CST2005.
SupportedloadersLsrec,elf,bin]
Supportedfilesystems[net,fs,disk,socket,Tty]
Thissoftwai-emayberedistributedundertheBSDcopyright.
Copyright2000-2002,OpsyconAB,Sweden.
Copyright2005,ICTCAS.
CPUGODSON2@200.00MHz/Bus@40.00MHz
Memorysize256MB(256MBLowmemory,0MBHighmemory).
PrimaryInstructioncachesizeIkb(32line,4way)
PrimaryDatacachesizeIkb(32line,4way)
Tertiarycachesize2018kb
BEV1
BEVO
BEVinSRsettozero.
PM0N>
2.Pmon命令
PMON的常用命令
l)h顯示幫助信息
PMON>h
BootandLoad
bootboot
omhostport
loadloadfile
MyCmds
pcsselectpcidevfunction
dldumpaddressbyte
alfworld
d4dumpaddressworld
oubleword
mlmodifyaddressbyte
halfworld
m4modifyaddressworld
doubleword
setvgasetvga_available
ble
initkbdkbd_initialize
phyaddr[-x]
tlbtesttlbsetviraddrphyaddr
more...
2)devls顯示設(shè)備信息
PMON>hdevls
devls[-an]listdevices
-ashowalldevicetypes
-nshownetworkdevices
PMON>devls
DevicenameType
wdODISK
rtlOIFNET
PMON>devls-a
DevicenameType
mainbusODULL
localbusODULL
pcibrODULL
pciODULL
pciideODULL
wdODISK
rtlOIFNET
3)load
PMON>hload
load[-beastifr][-ooffs]loadfile
-sdon,tclearoldsymbols
-bdon,tclearbreakpoints
-edon,tclearexceptionhandlers
-adon,taddoffsettosymbols
-tloadattopofmemory
-iignorechecksumerrors
-fflash_addr-oload_addroffsetr
-ndon,tloadsymbols
-yonlyloadsymbols
-vverbosemessages
-wreverseendianness
-kprepareforkernelsymbols
-o<offs>loadoffset
-rloadrawfile
3.1)從硬盤引導(dǎo)
1oad/dev/fs/ext2@wd0/boot/vmlinux
groot=/dev/hdal
3.2)從網(wǎng)絡(luò)引導(dǎo)
ifaddrfxpO192.168.0.159
loadtftp://192.168.0.128/vmlinux
groot=/dev/hdalconsole=tty
3.3)更新flash
從網(wǎng)絡(luò)更新
Load-fOxbfcOOOOO-rtftp://10.0.0.3/gzrom.bin
從磁盤更新
Load-fOxbfcOOOOO-r/dev/fs/ext2@wd0/boot/gzrom.bin
4)g命令
PM0N>hg
g[-s][-bbpadr]E_eadr][--args]startexecution(go)
-sdon'tsetclientsp
-e<adr>startaddress
-b<bptadr>temporarybreakpoint
一一<args>argstobepassedtoclient
PMON>groot=/dev/hdalconsole=tty
5)利用宏來簡(jiǎn)化操作
setL二〃load/dev/fs/ext2@wd0/boot/vmlinuxz,
$L
6)設(shè)置自動(dòng)引導(dǎo)
setifconfigfxpO:192.168.0.159
setaltftp://192.168.0.128/a
setappenduroot=/dev/hdalconsole=tty
7)pciscan命令列出pci設(shè)備信息
PMON>pciscan
?BUS0?
DevFunDevicedescription
160vendor/product:0xl0ec/0x8139(network,ethernet,interface:0x00,
revision:0x10)
0x0000420l:0xffffff01i/o@0x00004200,256bytes
0x04020000:0xffffff00mem@0x04020000,256bytes
0x00000000:0x00000000mem@0x00000000,0bytes
0x00000000:0x00000000mem@0x00000000,0bytes
0x00000000:0x00000000mem@0x00000000,0bytes
0x00000000:0x00000000mem@0x00000000,0bytes
8)set命令
Pmon中常見的環(huán)境變量
//inpmonsrc,searchfor"getenv”,thenwecangetthesetusefulforpmon.
setifconfigfxpO:192.168.0.159
setaltftp://192.168.0.128/a
setdev/dev/hdal
PM0N>hset
set[[-t]name[value]]display/setvariable
PMON>setal
al=/dev/fs/ext2@wd0/boot/vmlinux.strip
9)新增命令
pcs,dl,d2,d4,ml,m2,m4,disks
pmon中有幾個(gè)命令用來讀內(nèi)存和配置空間
dladdrcount字節(jié)讀地址
d2addrcount2字節(jié)讀地址
d4addrcount4字節(jié)讀地址
mladdrcount字節(jié)寫地址
m2addrcount2字節(jié)寫
m4addrcount4字節(jié)寫
上面命令中的地址的含義由pcs命令決定:
pcs-1為uncache讀物理地址
pcs-2為cache讀物理地址
pcs-3為直接讀64位cpu地址
pcsbusdevfunc為讀pci參數(shù)為bus,dev,func的配置空間
pcs設(shè)置后,可以多次使用dl—4,ml-4命令
如
pcs-1
dlOxlfcOOOOO100讀rom100個(gè)數(shù)
dl0OxbfcOOOOO
pcs-3
dl0x90000000IfcOOOOO100
dl0x980000001fcOOOOO100
pcs0140選擇pci卡bus=0,dev=14,func=0
d4010讀配置空間0開始10個(gè)4字節(jié)
PMON>pcs-1
selectnormalmemoryaccess
PMON>dlOxlfcOOOOO20
IfcOOOOO:00608040006880404000083c00608840.'.h.@
IfcOOOlO:0081Id3c
PMON>d2OxlfcOOOOO10
IfcOOOOO:600040806800408000403c0860004088.h.?
IfcOOOlO:81003cld
PMON>pcs0170
pciselectbus=0,dev=17,func=0
PMON>d4010
00000000:06861106021000070601002200800000”
00000010:00000000000000000000000000000000
00000020:0000000000000000
3.pmon目錄結(jié)構(gòu)
pmon的目錄結(jié)構(gòu):
|--Targets
|--conf
|一doc
|--examples
|—fb
|--include
|—lib
|一pmon
|一sys
|--tools
|--x86emu
|―zloader
|一zloader.2clm->zloader
|—zloader.2eCPCI->zloader
|--zloader.2ecard->zloader
|--zloader.2edev->zloader
|一zloader.2emcpu->zloader
|一zloader.2enc->zloader
|一zloader.cpci->zloader
--zloader.linuxpc->zloader
Targets目錄是板級(jí)相關(guān)的代碼
Targets/Bonito2edev/是開發(fā)板的目錄
IsTargets/Bonito2edev
Bonito/compile/conf/dev/include/pci/
Bonito/start.S啟動(dòng)代碼
Bonito/tgt_machdep.c啟動(dòng)c代碼,入口init_mips
conf是配置文件目錄
conf/Bonito是配置文件
conf/Makefile.Bonito2edev是開發(fā)板Makefile模版
dev/pflash_tgt.h開發(fā)板flash的頭文件
conf是pmon總的配置文件目錄
conf/files是配置文件
fb:framebuffer相關(guān)程序的目錄
include頭文件目錄
lib庫(kù)文件目錄,如libc等。
Pmon和sys中包含pmon的大部分文件.
驅(qū)動(dòng)程序一般放在Sys/dev中。
Tools中不是pmon代碼,而是配置pmon的工具程序源碼等,如pmoncfg.
X86emu中是顯卡模擬程序。
Zloader是pmon解壓縮程序.
4.pmon的編譯
4.1pmon的配置
1)配置文件
總的配置文件在:/usr/src/pmon-all/conf/files
開發(fā)板的配置文件:/usr/src/pmon-all/Target/Bonito2edev/conf/Bonito
其他配置文件還有/usr/src/pmon-al1/sys/dev/pci/files,pci
/usr/src/pmon-all/sys/dev/ata/files.ata
2)配置設(shè)置
我們這里最重要的是/usr/src/pmon-al1/Target/Bonito2edev/conf/Bonito文件
文件格式,#表示注釋
include〃conf/GENERIC_ALLl〃
#包含/usr/src/ict/pmorrall/conf/GENERIC_ALLI文件,其內(nèi)容如下
#
#Moduleselection.Selectspmonfeatures
#
selectmod_flash_amd#AMDflashdeviceprogramming
selectmod_flash_intel#intelflashdeviceprogramming
selectmod_flash_sst#intelflashdeviceprogramming
#目前pmon支持amd,inter和sst公司的flash的燒寫,有兩個(gè)作用,一是儲(chǔ)存環(huán)境變量,
二是在線更新bios
#
#Commandselection.Selectspmoncommands
#
#selectcmd_about#DisplayinfoaboutPMON
selectcmd_boot#Bootwrapper
selectcmd_cache#Cacheenabling
selectcmd__call#Callafunctioncommand
selectcmd_mycfg
selectcmddate#Timeofdaycommand
selectcmd_env#Fullblownenvironmentcommandset
selectcmd_flash#Flashprogrammingcmds
selectcmdhist#Commandhistory
selectcmd_ifaddr#Interfaceaddresscommand
selectcmd__l#Disassemble
selectcmd_mem#Memorymanipulationcommands
selectcmd_more#Morepaginator
selectcmd^rnt#Simplememorytestcommand
selectcmd_misc#Reboot&Flushetc.
selectcmd_set#Ascmd_envbutnotreq.cmd_hist
selectcmd_stty#TTYsetingscommand
selectcmd_tr#Hostport-throughcommand
selectcmd_devls#Devicelist
#
selectcmd_shell#Shellcommands,vers,help,eval
selectcmd_vers
selectemdhelp
selectcmd_eval
selectcmd_mycmd
selectemdnewmt#test86內(nèi)層檢測(cè)程序
selectcmd_setup#條棒式配置程序
上面這些選項(xiàng)選擇編譯那些命令到pmon中
optionC0NFIG_CACHE_64K_4WAY
#龍芯2e的cache設(shè)置4路,64k.
再返回到原配置文件中
#Platformoptions
#
optionBONITOEL#平臺(tái)北橋的類型,計(jì)算所binito結(jié)構(gòu)北橋
optionMIPS
optionINET
selectmod_uart_ns16550#StandardUARTdriver
optionCONS_BAUD=B115200
#串口的波特率設(shè)置
selectext2
selectiso9660
#pmon支持ext2,iso9660文件系統(tǒng),可以從網(wǎng)絡(luò)硬盤軟驅(qū)光驅(qū)引導(dǎo)內(nèi)核
selectmod_x86emu_int10
#顯卡rom模擬程序
selectmod_vgacon
#顯示器和鍵盤虛擬終端
optionAUTOLOAD
#pmon起動(dòng)后,自動(dòng)引導(dǎo)內(nèi)核
#Functionaloptions.
#
optionHAVE_T0D#Time-0f-Dayclock
#實(shí)時(shí)鐘
optionHAVE_NVENV#Platformhasnon-volatileenvmem
#環(huán)境變量支持
optionNVRAM_IN_FLASH
#打開這個(gè)選項(xiàng)環(huán)境變量存儲(chǔ)矗flash中,關(guān)閉環(huán)境變量存在emos中
#下面是pmon的設(shè)備樹的設(shè)置
#
#NowtheMachinespecification
#
mainbusOatroot
localbusOatmainbusO
fdOatmainbusO
#軟驅(qū)驅(qū)動(dòng)
pcibrOatmainbusO
pci*atpcibr?
#fxpnormallyonlyusedfordebugging(enable/disableboth)
fxpOatpci?dev?function?#Intel82559Device
inphy*atmii?phy?#Intel82555PHYs
#82559網(wǎng)卡驅(qū)動(dòng)
##########82546
#82546usealotofmemorysosetupNKMEMCLUSTERSasbellow
##defineNKMEMCLUSTERS(16*1024*1024/CLBYTES)/*0.5Mb*/
em*atpci?dev?function?#Intel82559Device
#82546網(wǎng)卡驅(qū)動(dòng)
####IDEcontrollers
pciide*atpci?dev?function?flags0x0000
####IDEharddrives
wd*atpciide?channel?drive?flags0x0000
#硬盤驅(qū)動(dòng)
ide_cd*atpciide?channel?drive?flags0x0001
#光誡驅(qū)動(dòng)
4.2pmon的編譯
1)準(zhǔn)備工作
cd/usr/src/pmon-a11/tools/pmoncfg/
make
cppmoncfg/usr/bin
exportMKDEP=makedepend
將exportMKDEP=makedepend加入~/.bashrc中
準(zhǔn)備工作只需做一次
2)開始編譯
Cd/usr/src/pmon-all/zloader.2edev
makecfg#根據(jù)配置文件重新產(chǎn)生makefile
makecleanall清除以前的編譯生成文件
maketgt=rom#生成rombin文件gzrom.bin
maketgt=ram#生成網(wǎng)絡(luò)加載文件gzram,通過網(wǎng)絡(luò)tftp重新加載pmon在調(diào)pmon程序的時(shí)
候很有用
3)pmon的燒制
a)通過網(wǎng)絡(luò)tftp燒flash
load-f0xbfc00000-rtftp://10.0.0.3/gzrom.bin
b)用編程器燒
如使用superpro/580編程器來燒。
5.pmon啟動(dòng)流程
下面介紹的pmon流程,基于龍芯2c,計(jì)算所的北橋。
Targets/Bonito是計(jì)算所北橋相關(guān)的代碼位置,起動(dòng)代碼為
Targets/Bonito/Bonito/start.S.
看代碼的時(shí)候要注意pmon中的一些宏是定義在頭文件中的,另一些則定義在Makefile,
通過gcc參數(shù)-D來定義。
5.1mipscpu基本知識(shí)
Mapped(kseg2)
OxCOOO0000
Unmappeduncached(ksegl)
OxAOOO0000
Unmappedcached(ksegO)
0x80000000
32-bituserspace(kuseg)
2GB
0x00000000
ksegO:0x80000000-0x9FFFFFFF(512M):只需要把最高位清零,這些地址就被轉(zhuǎn)換
(translate)為物理地址,
然后把它們連續(xù)地映射到物理內(nèi)存中512M大小的低字段(0x00000000-OxlFFFFFFF)
內(nèi)。這種轉(zhuǎn)換是很簡(jiǎn)單的,因此常常把這些地址稱為“無需轉(zhuǎn)換的“。一般情況下,都是通
過快速緩存(cache),對(duì)這段區(qū)域內(nèi)的地址進(jìn)行訪問。
因此在cache被正確地初始化之前,不要使用這些地址。通常,在沒有MMU的系統(tǒng)中,這段
區(qū)域用于存放大多數(shù)程序和數(shù)據(jù)。至于有MMU的系統(tǒng),操作系統(tǒng)的內(nèi)核會(huì)存放在這個(gè)區(qū)域。
ksegl:OxAOOO0000-OxBFFFFFFF(512M):通過將最高3位清零的方法,把這些地址
映射為相應(yīng)的物理地址,然后象ksegO一樣,再映射到物理內(nèi)存中512M大小的低字段。但
要注意,ksegl是不通過cache存取的(uncached)。ksegl是唯一的在系統(tǒng)重啟時(shí)能正常工
作的地址空間,這也是為什么重新啟動(dòng)時(shí)的入口向量OxBFCO0000會(huì)在這個(gè)區(qū)域內(nèi)。入口向
量對(duì)應(yīng)的物理地址是OxlFCO0000這個(gè)應(yīng)該告訴你的硬件工程師。
因此,你可以使用這段地址空間來訪問你的初始化程序的ROM。還有大多數(shù)人把它用來訪
問I/O寄存器。如果你的硬件工程師要把這些東西映射到非低段512M物理空間,那你應(yīng)該
試圖說服他們修改。
kseg2:OxCOOOOOOO-OxFFFFFFFF(1GB):這段地址空間只能在核心態(tài)下使用并且要經(jīng)過
MMU的轉(zhuǎn)換。在MMU設(shè)置好之前,不要對(duì)其進(jìn)行訪問。通常,除非你在寫一個(gè)真正的操作系
統(tǒng),否則都不必使用這段地址空間。
maped指的是要經(jīng)過TLB進(jìn)行虛擬內(nèi)存的翻譯。cached指先從cache取,未命中才從內(nèi)存中
取。
3.2代碼分析
總的來說:
1)啟動(dòng)位置位于cpu的啟動(dòng)地址是OxbfcOOOOO,這個(gè)地址對(duì)應(yīng)的物理地址是OxlfcOOOOO,北
橋?qū)⑦@一地址影射到flash的0地址上.
因此準(zhǔn)確的說pmon是從flash的0地址開設(shè)運(yùn)行。編譯的時(shí)候start,o正好是第一個(gè)被鏈
接的obj文件,因此start.S的第一條指令是cpu運(yùn)行的第一個(gè)指令,位于_start。
2)c代碼的第一個(gè)入口是initmips,位于tgt_machdep.c中。最后程序到main函數(shù)中運(yùn)行命
令循環(huán)。
3)pmon開始應(yīng)該是freebsd移植過來的,系統(tǒng)調(diào)用,設(shè)備驅(qū)動(dòng)是unix風(fēng)格的。
4)pmon中cpu運(yùn)行于32位模式下,是關(guān)中斷運(yùn)行。pmon完全靠查詢來完成整個(gè)系統(tǒng),技巧
是idle函數(shù)中調(diào)用scandevs來掃描設(shè)備驅(qū)動(dòng)程序。驅(qū)動(dòng)程序中的中斷也是通過被系統(tǒng)查
詢的時(shí)候不斷調(diào)用來實(shí)現(xiàn)的。
5)在cpu的狀態(tài)寄存器中有…個(gè)bev,設(shè)置異常向量從rom中取,還是從ram中取.
bcopy(MipsException,(char*)TLB_MISS_EXC_VEC,MipsExceptionEnd-
MipsException);
bcopy(MipsException,(char*)GEN_EXC_VEC,MipsExceptionEnd-
MipsException);
下面具體介紹啟動(dòng)流程:
start.S中
_start:
start:
.globlstack
stack=start-0x4000/*PlacePMONstackbelowPMONstartinRAM*/
/*NOTE!!Notmorethat16instructionshere!!!Rightnowit'sFULL!*/
mtcOzero,COP_O_STATUS_REG
mtcOzero,COP_O_CAUSE_REG
litO,SR_BOOT_EXC_VEC/*ExceptiontoBoostrapLocation*/
mtcOt0,COP?O_STATUS_REG
lasp,stack
lagp,_gp
baluncached/*Switchtouncachedaddressspace*/
nop
ballocate/*Getcurrentexecuteaddress*/
nop
從pmon中反匯編得到
(gdb)disassemble0xffffffff80010000
Dumpofassemblercodeforfunctionstart:
0xffffffff80010000<start>:mtcO$zero,$12
0xffffffff80010004<start+4>:mtcO$zero,$13
0xffffffff80010008<start+8>:lui$t0,0x40
0xffffffff8001000c<start+12>:mtcO$t0,$12
0xffffffff80010010<start+16>:lui$sp,0x8001
0xffffffff80010014<start+20>:daddiu$sp,$sp,-16384#0xffffc000
0xffffffff80010018<start+24>:lui$gp,0x8009
0xffffffff8001001c<start+28>:daddiu$gp,$gp,30800
0xffffffff80010020<start+32>:bal0x80010030
0xffffffff80010024<start+36>:nop
0xffffffff80010028<start+40>:bal0x80010638
0xffffffff8001002c<start+44>:nop
可以看出sp的指向的位置,并不是指向flash,因此開始的堆棧用的就是sdram
baluncached
nop
ballocate
nop
uncached:
orra,UNCACHED_MEMORY_ADDR
jra
nop
#machine/cpu.h
ttdefineUNCACHED_MEMORY_ADDROxaOOOOOOO
此處是可以從cache空間轉(zhuǎn)換到uncache的空間,ra中保留的是bal_locate這條指令的地
址,然后或上UNCACHED?MEMORY_ADDR,該地址就變成uncache的地址了.
為什么pmon的啟動(dòng)地址為OxbfcOOOOO,而Id生成代碼的text段的起始地址為0x80010000
應(yīng)該有從flash到ram的搬移過程
las0,start
subusO,ra,sO
andsO,OxffffOOOO
這段代碼是為了訪問數(shù)據(jù),因?yàn)檫@段匯編在Rom執(zhí)行,而編譯出來的數(shù)據(jù)段在
0x8002xxxx,為了能夠訪問數(shù)據(jù)段的數(shù)據(jù),需要進(jìn)行一個(gè)
地址的修正,s0這是起到這種修正的目的。
balIf
nop
BONITO_BIC(BONITO_BONPONCFG,BONITO_BONPONCFG_CPUBIGEND)
展開后變成
.word0x00000018|0x00000002,((OxlfeOOOOO+((0x100+0x00)))|
OxaOOOOOOO);.word(~(0x00004000)),(0)
后面的程序解析這些數(shù)據(jù)完成對(duì)應(yīng)的初始化操作
EXIT_INIT(O)
展開后變成
.word0x00000000,(0);.word0,0
這樣初始化數(shù)據(jù)定義完成
下面的程序
1:movea0,ra
因?yàn)榍懊鎎alIf,因此此時(shí)ra的值恰好就是定義的初始化數(shù)據(jù)的地址,下面的
reginit開始的
一段程序解析前面的數(shù)據(jù)來對(duì)寄存器進(jìn)行配置
reginit:/*localname*/
lwt3,Init_0p(aO)
lwtO,Init_A0(aO)
andt4,t3,OP_MASK
*EXIT(STATUS)
*/
bnet4,OP_EXIT,8f
nop
movevO,tO
b,done
nop
剩下的初始化寄存器的過程省略
.done:
/*Initialiseotherlow-levelI/Odevices*/
balinitserial
nop
PRINTSTRC\r\nPM0N2000MIPSInitializing.Standby...\r\nO
PRINTSTRCERRORPC=Z/)
mfcOaO,COP_O_ERROR_PC
balhexserial
nop
PRINTSTRCCONFIG二〃)
mfcOaO,COP_O_CONFIG
balhexserial
nop
PRINTSTR(〃\r\n〃)
PRINTSTR(,zPRID二〃)
mfcOaO,COP_O_PRID
balhexserial
nop
PRINTSTR("\r'n")
簡(jiǎn)單的打印一些寄存器的值
一些sdram的配置
1:swsdCfg,BONITO_SDCFG(bonito)
2:b3f
nop
3:
配置pci內(nèi)存影射
litl,0ttaccumulatepcimembasecfgsettings
/*setbarOmaskandtranslationtopointtoSDRAM*/
subtO,msize,1
nottO
srltO,BONITO_PCIMEMBASECFG_ASHIFT-
BONITO_PCIMEMBASECFG_MEMBASEO_MASK_SHIFT
andtO,BONITO_PCIMEMBASECFG_MEMBASEO_MASK
ortl,tO
litO,0x00000000
srltO,BONITO_PCIMEMBASECFG_ASHIFT-
BONITO_PCIMEMBASECFG_MEMBASEO_TRANS_SHIFT
andtO,BONITO_PCIMEMBASECFG_MEMBASEO_TRANS
ortl,tO
ortl,BONITO_PCIMEMBASECFG_MEMBASEO_CACHED
/*setbarltominimumsizetoconservePCIspace*/
litO,~0
srltO,BONITO_PCIMEMBASECFG_ASHIFT-
BONITO_PCIMEMBASECFG_MEMBASE1__MASK_SHIFT
andtO,BONITO_PCIMEMBASECFG_MEMBASE1_MASK
ortl,tO
litO,OxOOOOOOOO
srltO,BONITO_PCIMEMBASECFG_ASHIFT-
BONITO_PCIMEMBASECFG_MEMBASE1_TRANS_SHIFT
andtO,BONITO_PCIMEMBASECFG_MEMBASE1_TRANS
ortl,tO
ortl,BONITO_PCIMEMBASECFG_MEMBASE1_CACHED
swtl,BONITO_PCIMEMBASECFG(bonito)
/*enableconfigurationcyclesnow*/
IwtO,BONITO_BONPONCFG(bonito)
andtO,“B0NIT0_B0NP0NCFG_C0NFIG_DIS
swtO,BONITO_BONPONCFG(bonito)
PRINTSTR("InitSDRAMDone!\r\n");
地址譯碼的結(jié)果和bonito64的相兼容,為了實(shí)現(xiàn)對(duì)大容量(2GB)
存儲(chǔ)器的支持,將原來的0x8000_000(T0x:L0000_0000之間的2GB空間分配給了SDRAM,
為了保持軟件的兼容性,把2GB空間的低256MB和起始的256MB存儲(chǔ)空間重疊,對(duì)應(yīng)同
一塊存儲(chǔ)區(qū)。
<img5.=北橋設(shè)計(jì)文檔.pdf:北橋內(nèi)部地址空間分配》
初始化cache,將cache寄存器中填入內(nèi)容,并cache有效?
下面完成程序和數(shù)據(jù)從flash到內(nèi)存的拷貝
laa0,start
lial,OxbfcOOOOO
laa2,_edata
oraO,OxaOOOOOOO
ora2,OxaOOOOOOO
subu11,a2,aO
srltl,tl,2
movetO,aO
movetl,al
movet2,a2
/*copytextsection*/
1:andt3,tO,OxOOOOffff
bnezt3,2f
nop
moveaO,tO
balhexserial
nop
liaO,'\r'
baltgt_putchar
nop
2:Iwt3,0(tl)
nop
swt3,0(t0)
addutO,4
addutl,4
bnet2,tO,lb
nop
PRINTSTR(/z\ncopytextsectiondone.\r\n,z)
/*ClearBSS*/
laaO,_edata
laa2,_end
2:swzero,0(aO)
bnea2,aO,2b
adduaO,4
TTYDBG(zzCopyPMONtoexecutelocationdone.\r\n/z)
#if1
mfcOaO,COP_O_CONFIG
andaO,aO,0xfffffff8
oraO,aO,0x2
mtcOaO,COP_O_CONFIG
#endif
liaO,4096*1024
swaO,CpuTertiaryCacheSize/*SetL3cachesize*/
moveaO,msize
srlaO,20
lavO,initmips
jalrvO
nop
其中initmips是c代碼的入口,初始化過程結(jié)束
initmips傳入了memorysize,其中memorysize是start.S中的msize,是根據(jù)sdram內(nèi)存
條的信息計(jì)算出來的。
/home/dsm/pmon2003/src/Targets/Bonito/Bonito/tgt_machdep.c:
140void
141initmips(unsignedintmemsz)
142(
143/*
144*Setupmemoryaddressdecoderstomapentirememory.
145*Butfirstmoveawaybootrommaptohighmemory.
146*/
147#if0
148GT_WRITE(BOOTCS_LOW_DECODE_ADDRESS,BOOT_BASE?20);
149GT_WRITE(BOOTCS_HIGH_DECODE_ADDRESS,(BOOT_BASE-1+
BOOT_SIZE)?20);
150ttendif
151memorysize=(memsz&OxOOOOffff)<<20;//recovertooriginal
size:256M
152memorysize_high=((memsz&OxffffOOOO)?16)?20;//0
153
154/*
155*Probeclockfrequencyssodelayswillworkproperly.
156*/
157tgt_cpufreq();
,,
158SBD_DISPLAYCDONE>0);
159/*
160*InitPMONanddebug
161*/
162cpuinfotab[0]=&DBGREG;
163dbginit(NULL);
164
165/*
166*Setupexceptionvectors.
167*/
168SBD_DISPLAYCBEVr,0);
169bcopy(MipsException,(char*)TLB_MISS_EXC_VEC,MipsExceptionEnd
-MipsException);
170bcopy(MipsException,(char*)GEN_EXC_VEC,MipsExceptionEnd-
MipsException);
171
172CPU_FlushCache();
173
174CPU_SetSR(O,SR_BOOT_EXC_VEC);
175SBD_DISPLAYCBEVOZ,,0);
176
177printf(/ZBEVinSRsettozero.\nz,);
178
179#if0
180/*memtest*/
181addrtstl();
182addr_tst2();
183movinvl(2,0,~0);
184movinvl(2,0xaa5555aa,~0xaa5555aa);
185printf(/zmemtestdone\n〃);
186ttendif
187
188/*
189*Launch!
190*/
191main();
192)
其中很重要的是dbginit
/home/dsm/pmon2003/src/pmon/common/main,c:
284void
285dbginit(char*adr)
286(
287intmemsize,freq;
288charfs[10],*fp;
289char*s;
290
291Asplhigh();*/
292
293memsize=memorysize;
(gdb)
294
295SBD_DISPLAYCHKPNT_ENVI);
296init();/*Doallconstructorinitialisation*/
297
298
299SBD_DISPLAY(〃ENVI〃,CHKPNT_ENVI);
300envinit();
301
302#ifdefined(SMP)
303/*Turnoncachesunlessoptedout*/
(gdb)
304if(!getenv(〃nocache〃))
305md_cacheon();
306ttendif
307
308SBD_DISPLAY(〃DEVI〃,CHKPNT_SBDD);
309tgt_devinit();
310
311#ifdefINET
312SBD_DISPLAY(〃NETI〃,CHKPNT_NETI);
313init_net(1);
(gdb)
314ttendif
315
316#ifNCMDJHST>0
317SBDDISPLAYCHKPNTJISTI);
318histinit();
319ttendif
320
321#ifNM0D_SYMB0LS>0
322SBDDISPLAYCHKPNT_SYMI);
323syminit();
(gdb)
324#endif
325
326SifdefDEMO
327SBDDISPLAY(〃DEM0〃,CHKPNTDEMO);
328demoinit();
329#endif
330
331SBD_DISPLAY(〃SBDE〃,CHKPNT_SBDE);
332initial_sr|=tgt_enable(tgt_getmachtype0);
333
(gdb)
334ftifdefSRFR
335Status=initial_sr&?SR_FR;/*don'tconfusenaiveclients*/
336#endif
337/*Setupinitialconsoleterminalstate*/
338ioctl(STDIN,TCGETA,feconsterm);
339
340ttifdefHAVE_LOGO
341tgt_logo();
342#else
343printf(〃\n*PM0N2000Professional*〃);
(gdb)
344Sendif
345printfC\nConfiguration[%s,%sz,,TARGETNAME,
346BYTE_ORDER==BIG_ENDIAN?〃EB〃:〃EL〃);
347#ifdefINET
348printf(〃,NET");
349#endif
350#ifNSD>0
351printf(〃,SCSI");
352#endif
353#ifNWD>0
(gdb)
354printf(〃,IDE〃);
355#endif
356printf(/z]\nVersion:%s.\n/z,vers);
357printf("Supportedloaders[%s]\n?,,getExecStringO);
358printf("Supportedfilesystems[%s]\n,z,getFSStringO);
359printf("Thissoftwaremay
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 云南師范大學(xué)《大學(xué)信息技術(shù)基礎(chǔ)》2023-2024學(xué)年第一學(xué)期期末試卷
- 保險(xiǎn)業(yè)商務(wù)禮儀培訓(xùn)模板
- 辦公室設(shè)計(jì)講解模板
- 房地產(chǎn)經(jīng)紀(jì)操作實(shí)務(wù)-《房地產(chǎn)經(jīng)紀(jì)操作實(shí)務(wù)》點(diǎn)睛提分卷1
- 小10班圣誕晚會(huì)主持稿
- 新娘父親發(fā)言稿
- 二零二五年石油供應(yīng)合同數(shù)量和價(jià)格波動(dòng)調(diào)整條款2篇
- 四川省南充市西充中學(xué)2024-2025學(xué)年高三上學(xué)期適應(yīng)性考試生物試題(含答案)
- 二零二五年度股權(quán)并購(gòu)重組與回購(gòu)操作指南協(xié)議3篇
- 延邊大學(xué)《電子科學(xué)與技術(shù)專業(yè)創(chuàng)新課程》2023-2024學(xué)年第一學(xué)期期末試卷
- 工程款支付報(bào)審表
- 《項(xiàng)目施工組織設(shè)計(jì)開題報(bào)告(含提綱)3000字》
- ICU常見藥物課件
- CNAS實(shí)驗(yàn)室評(píng)審不符合項(xiàng)整改報(bào)告
- 農(nóng)民工考勤表(模板)
- 承臺(tái)混凝土施工技術(shù)交底
- 臥床患者更換床單-軸線翻身
- 計(jì)量基礎(chǔ)知識(shí)培訓(xùn)教材201309
- 中考英語 短文填詞、選詞填空練習(xí)
- 阿特拉斯基本擰緊技術(shù)ppt課件
- 新課程理念下的班主任工作藝術(shù)
評(píng)論
0/150
提交評(píng)論