做網(wǎng)站的服務(wù)器要什么格式高端營銷型網(wǎng)站建設(shè)
提示:龍芯2K1000PMON相關(guān)記錄
文章目錄
- 1 PMON的發(fā)展和編譯環(huán)境
- PMON
- PMON2000
- 2 PMON2000的目錄結(jié)構(gòu)
- 3 Targets目錄的組成
- 4 PMON編譯環(huán)境的建立
- 5 PMON2000的框架
- 6 異常向量表
- 7 Pmon的空間分配
- 8 PMON的匯編部分(starto.S或sbdreset.S)的解讀
- Start.S
- C代碼部分
- dbginit
- 9 Bonito的空間分配
- 10 PCI的空間分配
- 開發(fā)時需要注意的問題
1 PMON的發(fā)展和編譯環(huán)境
PMON
- 科大那個PMON就是這個版本的。該版本的功能有:shell, net, load, debug。不支持硬盤,顯卡。并且擴展性不好。
- 該版本的編譯器是sde-gcc.
PMON2000
- 現(xiàn)在龍芯1和2用的BIOS, 在原來的PMON的基礎(chǔ)上添加了硬盤支持,文件系統(tǒng)ext2的支持,顯卡的支持。修復(fù)了debug功能,擴展性也得到提高。比較容易移植到新的系統(tǒng)。
- 編譯器為mips-elf-gcc
2 PMON2000的目錄結(jié)構(gòu)
3 Targets目錄的組成
每個系統(tǒng)一個目錄,我們拿Bonito來為例子,主要有下列文件:
- start.S 位于Targets/Bonito/Bonito目錄下,是C環(huán)境建立之前的匯編代碼,使整個BIOS運行的起點。
- tgt_machdep.c位于Targets/Bonito/Bonito目錄下,一些板子相關(guān)的函數(shù)。
- pci_machdep.c進行Targets/Bonito/pci空間分配的一些函數(shù)
- Targets/Bonito/dev目錄下一些板子特殊的設(shè)備的驅(qū)動。
- Targets/Bonito/conf目錄下是一些編譯環(huán)境建立需要的一些文件
4 PMON編譯環(huán)境的建立
- 將comp.tar.gz在/usr/local解開
- 將/usr/local/comp/mips-elf/gcc-2.95.3/bin加入到PATH目錄下
- 進入pmon2000的tools目錄下make,建立一些conf需要的工具。
- 進入pmon2000的Targets/Bonito/conf目錄中
- 編輯conf目錄下Bonito文件,選擇需要編譯的模塊
- tools/pmoncfg/pmoncfg Bonito(conf類型文件)。形成目標(biāo)主目錄下的compiler目錄
- 進入Targets/Bonito/compiler/Bonito的目錄,make形成pmon。
- Makefile是根據(jù)Targets/Bonito/conf/Makefile.Bonito文件形成的。
- 鏈接腳本是為Targets/Bonito/conf/ld.script。
5 PMON2000的框架
6 異常向量表
7 Pmon的空間分配
8 PMON的匯編部分(starto.S或sbdreset.S)的解讀
Start.S
當(dāng)整個板子起電后,CPU將從0xBFC00000取指令開始執(zhí)行,而ROM在系統(tǒng)中的地址就是從該地址開始的,所以其中的第一條指令就是整個CPU的第一個指令,在MIPS中,異常處理入口有兩套,通過CP0的STATUS寄存器位BEV來決定,當(dāng)BEV=1時,異常的入口地址為0xBFC00000開始的地址,而BEV=0,異常地址為0x80000000開始的地址,所以PMON程序段開始處是一些異常的調(diào)入口,需要跳過這段空間,程序通過一個跳轉(zhuǎn)bal指令跳到后面.
bal locate nopbal uncachednopbal locatenop
uncached:or ra, UNCACHED_MEMORY_ADDRj ranop
此處是可以從cache空間轉(zhuǎn)換到uncache的空間,ra中保留的是bal locate這條指令的地址,然后或上UNCACHED_MEMORY_ADDR,該地址就變成uncache的地址了.
la s0, start subu s0, ra, s0and s0, 0xffff0000
這段代碼是為了訪問數(shù)據(jù),因為這段匯編在Rom執(zhí)行,而編譯出來的數(shù)據(jù)段在0x8002xxxx,為了能夠訪問數(shù)據(jù)段的數(shù)據(jù),需要進行一個地址的修正,s0這是起到這種修正的目的。
- 初始化CPU內(nèi)的寄存器,清TLB.
- 初始化一些北橋的基本配置,以確保uart能夠正常工作.
- 初始化uart,主要是設(shè)置波特率.
- 初始化內(nèi)存(主要通過I2C協(xié)議從內(nèi)存的EEPROM讀取內(nèi)存參數(shù)來進行設(shè)置).
- 初始化cache.
拷貝pmon的代碼到內(nèi)存,然后通過
la v0, initmips
jalr v0
nop
從此代碼便到內(nèi)存中間去了,從這開始因為可以讀寫內(nèi)存,所以有了棧,故可以用C的代碼了,所以以后的程序便是C代碼了.
C代碼部分
Ram中運行,入口為initmips
在文件Targets/Boniton/Bonito/tgt_machdep.c中
void initmips(unsigned int memsz)
{…tgt_cpufreq();cpuinfotab[0] = &DBGREG;dbginit(NULL);bcopy(MipsException, (char *)TLB_MISS_EXC_VEC, MipsExceptionEnd - MipsException);bcopy(MipsException, (char *)GEN_EXC_VEC, MipsExceptionEnd - MipsException);CPU_FlushCache();CPU_SetSR(0, SR_BOOT_EXC_VEC);main();
}
主要初始化在dbginit函數(shù)中執(zhí)行。
dbginit
void dbginit (char *adr)
{__init(); /* Do all constructor initialisation */envinit (); tgt_devinit();
#ifdef INETinit_net (1);
#endif
#if NCMD_HIST > 0histinit ();
#endif
#if NMOD_SYMBOLS > 0syminit ();
#endif#ifdef DEMOdemoinit ();
#endif initial_sr |= tgt_enable (tgt_getmachtype ());
#ifdef SR_FRStatus = initial_sr & ~SR_FR; /* don't confuse naive clients */
#endifioctl(STDIN, TCGETA, &consterm);
...
...
...
}//gdbinit
__init();初始化一些數(shù)據(jù)結(jié)構(gòu).
Envinit ();初始化環(huán)境變量.
tgt_init();初始化與板級相關(guān)的過程,在我們系統(tǒng)中主要是初始化北橋和PCI.
inet_init();初始化網(wǎng)絡(luò).
Hisinit();初始化命令歷史記錄.
Ioctl(STDIN,TCGETA,&consterm);建立終端.
9 Bonito的空間分配
10 PCI的空間分配
tgt_devinit()
_pci_businit()
_pci_hwinit
pci_hwinit() 為Pmon主要初始化PCI在北橋的窗口的函數(shù) ,這個函數(shù)在Target/Ev64240/pci/pci_machdep.c中定義
pd = pmalloc(sizeof(struct pci_device));pb = pmalloc(sizeof(struct pci_bus)); pd->pa.pa_flags = PCI_FLAGS_IO_ENABLED | PCI_FLAGS_MEM_ENABLED;pd->pa.pa_iot = pmalloc(sizeof(bus_space_tag_t));pd->pa.pa_iot->bus_reverse = 1;pd->pa.pa_iot->bus_base = PCI0_IO_SPACE_BASE - PCI0P_IO_SPACE_BASE;pd->pa.pa_memt = pmalloc(sizeof(bus_space_tag_t));pd->pa.pa_memt->bus_reverse = 1;pd->pa.pa_memt->bus_base = 0;pd->pa.pa_dmat = &bus_dmamap_tag;pd->bridge.secbus = pb;_pci_head = pd;pb->minpcimemaddr = PCI0P_MEM_SPACE_BASE;pb->nextpcimemaddr = PCI0P_MEM_SPACE_BASE + PCI0_MEM_SPACE_SIZE;pb->minpciioaddr = PCI0P_IO_SPACE_BASE;pb->nextpciioaddr = PCI0P_IO_SPACE_BASE + PCI0_IO_SPACE_SIZE;pb->pci_mem_base = PCI0_MEM_SPACE_BASE;pb->pci_io_base = PCI0_IO_SPACE_BASE;
建立PCI的空間分配的數(shù)據(jù)結(jié)構(gòu).其中pci_mem_base為Memory空間的基地址,pci_io_base 為IO空間的基地址. minipciioaddr 為IO空間的最小可以分配地址, minipcimemaddr 為 Memory 空間的最小可以分配地址. nextpcimemaddr 為PCI的 Memory 空間的下一個分配地址, nextpciioaddr 為PCI的IO空間的下一個分配地址,在pmon的中地址分配是逆序分配的.
pb->max_lat = 255;
pb->fast_b2b = 1;
pb->prefetch = 1;
pb->bandwidth = 4000000;
pb->ndev = 1;
_pci_bushead = pb;
_pci_bus[_max_pci_bus++] = pd;
開發(fā)時需要注意的問題
- Debug的方法
– 在串口設(shè)備沒有初始化前, 利用邏輯分析儀進行測試。該方法debug很艱難,所以應(yīng)該盡早初始化串口。
– 串口工作后,可以利用串口進行類似printf的Debug方法。
– 初始化BIOS系統(tǒng)的Shell后,可以利用BIOS系統(tǒng)中的Debug系統(tǒng)進行測試。 - 地址空間是否正確,北橋上的窗口分配是否正確。
- 中斷問題。
- 充分利用Pmon所帶的調(diào)試手段。pmon>h可以看到pmon提供的命令,通過這些命令來檢查地址分配是否正確。