PMON的解读和开发

上传人:cl****1 文档编号:568803020 上传时间:2024-07-26 格式:PPT 页数:25 大小:270.01KB
返回 下载 相关 举报
PMON的解读和开发_第1页
第1页 / 共25页
PMON的解读和开发_第2页
第2页 / 共25页
PMON的解读和开发_第3页
第3页 / 共25页
PMON的解读和开发_第4页
第4页 / 共25页
PMON的解读和开发_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《PMON的解读和开发》由会员分享,可在线阅读,更多相关《PMON的解读和开发(25页珍藏版)》请在金锄头文库上搜索。

1、PMON的解读和开发PMON的发展和编译环境nPMONnPMON的早期版本的功能有:shell, net, load, debug。不支持硬盘,显卡。并且扩展性不好,编译器是sde-gcc. PMON的发展和编译环境nPMON2000n现在龙芯1和2用的BIOS, 在原来的PMON的基础上添加了硬盘支持,文件系统ext2和fat的支持,显卡的支持等等。修复了debug功能,扩展性也得到提高。比较容易移植到新的系统。n编译器为mips-elf-gccPMON2000的目录结构Conf(配置目录)Target(每个系统在该目录下有一个子目录,进行新的系统支持的时候,只需要修改该目录下的文件)Sys

2、(pmon中的一些系统支持)GT64240BONITONB_GODSONPMON2000的框架Arch(处理器相关代码一些定义)Dev(设备的驱动程序,主要是IDE的ATA,北桥的网卡IC,和pci设备eepro100)Kern(主要是一些系统调用的实现,比如malloc,time, signal, socket)Net和netinet(实现网络协议)Scsi协议的实现Pmon(共有代码)Arch(处理器相关的代码,比如Flush_Cache等)PMON2000的框架Cmds(Pmon的shell中各个命令的实现)Dev(一些基本设备的驱动,比如Flash)Fs(文件系统)Load elf文件

3、的实现网络命令以及tftp的实现Lib(pmon的lib库,实现了memcpy,memset,printf基本函数)X86emu(x86的Emulator,主要是运行显卡的BIOS,初始化显卡Targets目录的组成n每个系统一个目录,我们拿Bonito来为例子,主要有下列文件:nstart.S 位于Targets/Bonito/Bonito目录下,是C环境建立之前的汇编代码,使整个BIOS运行的起点。ntgt_machdep.c位于Targets/Bonito/Bonito目录下,一些板子相关的函数。npci_machdep.c进行Targets/Bonito/pci空间分配的一些函数nTa

4、rgets/Bonito/dev目录下一些板子特殊的设备的驱动。nTargets/Bonito/conf目录下是一些编译环境建立需要的一些文件PMON编译环境的建立n将comp.tar.gz在/usr/local解开n将/usr/local/comp/mips-elf/gcc-2.95.3/bin加入到PATH目录下n进入pmon2000的tools目录下make,建立一些conf需要的工具。n进入pmon2000的Targets/Bonito/conf目录中n编辑conf目录下Bonito文件,选择需要编译的模块ntools/pmoncfg/pmoncfg Bonito(conf类型文件)。

5、形成目标主目录下的compiler目录n进入Targets/Bonito/compiler/Bonito的目录,make形成pmon。PMON编译环境的建立nMakefile是根据Targets/Bonito/conf/Makefile.Bonito文件形成的。n链接脚本是为Targets/Bonito/conf/ld.script。PMON2000的框架CPU Reset EntryJump over the beginning of romInitial Serial DeviceInitial MemoryCopy codes from Rom to RamInitial North B

6、ridge Initial South BridgeInitial VGA CardInitial ShellWait CommandInitail tlb&cacheInitail C environmentAssemblyCOther PCI DeviceSetup the traps, BEV=0异常向量表 异常类型异常类型进入点进入点SR(BEV)=0SR(BEV)=1程序地址程序地址物理地址物理地址程序地址程序地址物理地址物理地址Reset(启动启动)NMI(不可屏蔽中不可屏蔽中断断)0xBFC000000x1FC00000TLB替换(替换(32位)位)0x800000000x00x

7、BFC002000x1FC00200XTLB替换(替换(64位)位)0x800000800x800xBFC002800x1FC00280Cache错错0xA00000000x1000xBFC003000x1FC00300普通中断普通中断0x800001800x1800xBFC003800x1FC00380Pmon的空间分配异常向量表Pmon自身栈空间Pmon的代码段和数据段用户程序代码段和数据段用户的堆和栈0x800000000x800200000x801000000x8fffffff0x8001c000PMON的汇编部分(starto.S或sbdreset.S)的解读CPU Reset En

8、tryJump over the beginning of romInitial Serial DeviceInitial MemoryCopy codes from Rom to RamInitial North Bridge Initial South BridgeInitial VGA CardInitial ShellWait CommandInitail tlb&cacheInitail C environmentAssemblyCOther PCI DeviceStarto.S的工作,Rom中执行Start.Sn1.当整个板子起电后,CPU将从0xBFC00000取指令开始执行,而

9、ROM在系统中的地址就是从该地址开始的,所以其中的第一条指令就是整个CPU的第一个指令,在MIPS中,异常处理入口有两套,通过CP0的STATUS寄存器位BEV来决定,当BEV=1时,异常的入口地址为0xBFC00000开始的地址,而BEV=0,异常地址为0x80000000开始的地址,所以PMON程序段开始处是一些异常的调入口,需要跳过这段空间,程序通过一个跳转bal指令跳到后面. bal locate nopStart.Sbaluncachednopballocatenopuncached:orra,UNCACHED_MEMORY_ADDRjranop此处是可以从cache空间转换到unc

10、ache的空间,ra中保留的是ballocate这条指令的地址,然后或上UNCACHED_MEMORY_ADDR,该地址就变成uncache的地址了.Start.Snlas0,startsubus0,ra,s0ands0,0xffff0000 这段代码是为了访问数据,因为这段汇编在Rom执行,而编译出来的数据段在0x8002xxxx,为了能够访问数据段的数据,需要进行一个地址的修正,s0这是起到这种修正的目的。Start.S初始化CPU内的寄存器,清TLB.初始化一些北桥的基本配置,以确保uart能够正常工作.初始化uart,主要是设置波特率.初始化内存(主要通过I2C协议从内存的EEPROM

11、读取内存参数来进行设置).初始化cache.拷贝pmon的代码到内存,然后通过lav0,initmipsjalrv0nop从此代码便到内存中间去了,从这开始因为可以读写内存,所以有了栈,故可以用C的代码了,所以以后的程序便是C代码了.C代码部分nRam中运行,入口为initmips在文件Targets/Boniton/Bonito/tgt_machdep.c中voidinitmips(unsignedintmemsz)tgt_cpufreq();cpuinfotab0=&DBGREG;dbginit(NULL);bcopy(MipsException,(char*)TLB_MISS_EXC_V

12、EC,MipsExceptionEnd-MipsException);bcopy(MipsException,(char*)GEN_EXC_VEC,MipsExceptionEnd-MipsException);CPU_FlushCache();CPU_SetSR(0,SR_BOOT_EXC_VEC);main();主要初始化在dbginit函数中执行。dbginitvoiddbginit(char*adr)_init();/*Doallconstructorinitialisation*/envinit();tgt_devinit();#ifdefINETinit_net(1);#endif

13、#ifNCMD_HIST0histinit();#endif#ifNMOD_SYMBOLS0syminit();#endif#ifdefDEMOdemoinit();#endifinitial_sr|=tgt_enable(tgt_getmachtype();#ifdefSR_FRStatus=initial_sr&SR_FR;/*dontconfusenaiveclients*/#endifioctl(STDIN,TCGETA,&consterm);./gdbinitdbginit_init();初始化一些数据结构.Envinit();初始化环境变量.tgt_init();初始化与板级相关的

14、过程,在我们系统中主要是初始化北桥和PCI.inet_init();初始化网络.Hisinit();初始化命令历史记录.Ioctl(STDIN,TCGETA,&consterm);建立终端.Bonito的空间分配PCI的空间分配ntgt_devinit()_pci_businit()_pci_hwinitnpci_hwinit()为Pmon主要初始化PCI在北桥的窗口的函数,这个函数在Target/Ev64240/pci/pci_machdep.c中定义pd=pmalloc(sizeof(structpci_device);pb=pmalloc(sizeof(structpci_bus);pd

15、-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_dma

16、t=&bus_dmamap_tag;pd-bridge.secbus=pb;_pci_head=pd;PCI空间分配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=PC

17、I0_IO_SPACE_BASE;建立PCI的空间分配的数据结构.其中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;开发时需要注意的问题nDebug的方法n在串口设备没有初始化前, 利用逻辑分析仪进行测试。该方法debug很艰难,所以应该尽早初始化串口。n串口工作后,可以利用串口进行类似printf的Debug方法。n初始化BIOS系统的Shell后,可以利用BIOS系统中的Debug系统进行测试。开发时需要注意的问题n地址空间是否正确,北桥上的窗口分配是否正确。n中断问题。n充分利用Pmon所带的调试手段。pmonh可以看到pmon提供的命令,通过这些命令来检查地址分配是否正确。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号