




已阅读5页,还剩138页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
starto.S这段代码放在地址0xbfc00000,即rom的起始地址,这段代码最长可达0x00400000start在此处首先定义了一个stack变量,用于说明pmon将来要用的栈的栈底,这个栈的位置在start程序段的起点下方0x4000处.即stack=start-0x4000.1.初始化CPU内的寄存器,清TLB.接下来执行一系列指令,先把cp0的状态寄存器清0,然后再把SR_BOOT_EXC_VEC载入cp0状态寄存器,即令BEV为1,进入bootstrap模式;然后在状态寄存器中开中断4,5,使系统可以响应中断级别4,5;把cp0的cause寄存器清0.再把全局变量stack的值赋给sp,即栈顶指针初始化为栈底位置.然后为全局变量指针gp赋值.然后把下一个要执行的pc值与上0xa0000000(实际上这一步通过子程序uncached实现).转换到uncached空间.然后执行locate子程序.locate首先通过 la s0, start subu s0, ra, s0 and s0, 0xffff0000得到当前代码相对于代码初始位置start的偏移量.然后调用CPU_TLBClear清空tlb,使用tlbwi指令将tlb中全部项都清0.接下来调用函数CPU_TLBInit,从0xc0000000开始递增的1G虚地址被映射到从0x0c000000开始递增的物理地址.每页大小16M.这64页的地址映射关系被装入TLB的32项中2.初始化北桥中的CPU接口寄存器返回到locate中执行下一条指令,把北桥中的PCI0,PCI1的IO,MEM0,MEM1,MEM2,MEM3的低地址译码寄存器都置为0x00000fff,把对应高低址译码寄存器清0,即使这些译码寄存器都无效.再给CPU跟PCI总线的接口译码寄存器赋值.PCI1的IO低地址寄存器和高地址寄存器赋值为0x00000101,PCI1的remap寄存器为0,即它的io地址限定为从0x10100000开始的1M空间.再初始化PCI1的CONFIGURATION_ADDRESS寄存器为0x80000004,即enable,并令要写的寄存器号为1;PCI_1CONFIGURATION_DATA_VIRTUAL寄存器的值为0x00000011.最后把PCI0,PCI1的仲裁控制寄存器最高位置1,即enable.接下来给北桥INTERNAL_SPACE_DECODE寄存器赋初值0x01000140,即令内部空间基址域为0x140,并初始化PCISwap域为1.然后开始初始化设备计时参数.设备控制器支持五个设备体,其中四个是设备体,另外一个是驱动设备,驱动设备的默认地址映射到MIPS CPU的驱动地址0x1fc00000,它的默认带宽会在启动时被采样.每个体的存储空间可以从1M512M,因此总设备空间可以达到2.5G.每个设备体都有自己的参数寄存器.它们的带宽可以设置为8,16,32bits.设备参数寄存器可以设置为不同的值来支持不同的设备类型.设备参数寄存器有下列域,TurnOff,定义从完成设备读到cpu开始重新驱动地址线中间的Tclk时钟间隔,这是为了防止读数据时设备总线出现拥塞,最小值是1;Acc2First,定义从ALE有效到取得第一个数据的Tclk时钟间隔,最小值是3;Acc2Next,定义读取第一个数据和读取下一个数据之间的时钟间隔,在burst访问时用,最小值是1;ALE2Wr,定义从ALE重新有效到WR有效中间的时钟间隔,最小值是3;WrLow,定义WR有效的时间长度;WrHigh定义了在burst write操作时两次数据写之间WR无效的间隔时间.具体怎样执行设备参数初始化见tgt_setpar125mhz和tgt_setpar100mhz,它们的实现过程很巧妙,值得看一下对于125MHZ总线的设备参数初始化如下:设备CS0-PLD TurnOff,Acc2First,Acc2Next,ALE2Wr,WrLow,WrHigh分别初始化为2,8,8,3,3,5,扩展位全部为0.设备带宽初始化为8bits.设备CS1RTCTurnOff,Acc2First,Acc2Next,ALE2Wr,WrLow,WrHigh分别初始化为2,13,13,5,7,5,扩展位全部为0.设备带宽初始化为8bits.设备CS2UARTTurnOff,Acc2First,Acc2Next,ALE2Wr,WrLow,WrHigh分别初始化为3,15,15,5,0,5,扩展位分别为0,0,0,0,1,0.设备带宽初始化为8bits.对于100MHZ总线的设备参数初始化如下:设备CS0-PLDTurnOff,Acc2First,Acc2Next,ALE2Wr,WrLow,WrHigh分别初始化为3,6,6,3,3,5,扩展位全部为0.设备带宽初始化为8bits.设备CS1RTCTurnOff,Acc2First,Acc2Next,ALE2Wr,WrLow,WrHigh分别初始化为3,10,10,5,6,5,扩展位全部为0.设备带宽初始化为8bits.设备CS2UARTTurnOff,Acc2First,Acc2Next,ALE2Wr,WrLow,WrHigh分别初始化为4,11,11,5,6,5,扩展位全部为0.设备带宽初始化为8bits.然后把CPU_CONFIG寄存器中的Stop Retry位置1.即不允许PCI传输自动重试再设置CPU对外设的接口译码器寄存器的值.CS0对应SRAM,它的低地址指向SRAM在物理内存中的基址,值为0x1c0(单位是M);它的高地址指向SRAM的顶端,值为0x1c7.CS1对应RTC设备,它的低地址为0x1c8,高地址为0x1cf.CS2对应UART设备,它的低地址为0x1d0,高地址为0x1df.CS3对应FLASH设备,它的低地址为0x1f0,高地址为0x1fb.然后再初始化rom的设备参数.首先检查设备驱动体的带宽,如果是8bits,那么就把rom带宽置为32bits,否则就置为8bits.同时把rom的TurnOff,Acc2First,Acc2Next,ALE2Wr,WrLow,WrHigh分别初始化为2,1,1,5,7,7,扩展位分别为0,1,1,0,0,0.3.调用initserial函数初始化串行IO用于诊断输出(先略)4.初始化SDRAM首先判断是否已经载入SDRAM,如果当前地址1,64M,128M-2,256M,512M-3.如果是快速访问SDRAM模式,则把对应域置1.接下来写北桥的CPU对内存的接口译码寄存器检查本插槽有1面还是有两面.若只有一面,检查它的SIZE是否0x10000000,若大于,输出错误信息.否则配置SCS0的译码器低地址为0,高地址为SIZE20-1.若为两面,则先检查它的SIZE是否0x20000000,若大于,输出错误信息,若SIZE21,SCS0的高地址为SIZE20,SCS1的高地址为SIZE20-1.若0x10000000=SIZE21,置SCS1低地址为HIGHMEM_BASE(即0x20000000),置SCS1高地址为(HIGHMEM_BASE+SIZE1)20-1.很明显这里空出了从0x10000000到0x20000000的一段空间.请注意最后用变量s1记录slot0内存到达的最高地址,下面会用到这一变量.对slot1的配置如下: 仅当slot0不为空时,slot1的配置与slot0不同,SIZE置为本slot1的SIZE1+s1,并执行以下操作.此时若是一面:若SIZE10x10000000,输出出错信息,否则1)若SIZE20,高地址为(s1+SIZE1)20;2)若0x1000000020,高地址等于(s1+SIZE1)20-1.显然这里只要当前的内存总SIZE大于0x10000000,那么即使slot0没有把0x00x10000000填满,也要把slot1的内存地址从0x20000000算起,当然若已经填满,则把slot1的内存地址从slot0的终结地址算起,这个地址已经在0x20000000以上了.此时若是两面且s1!=0:SIZE=s1+(SIZE11).即先处理slot1的前一半.根据SIZE值进入不同处理语句.1)若SIZE20,高地址为SIZE20-1;然后重置SIZE=s1+SIZE1,现在处理slot1的后一半,若SIZE0x10000000,转到4;否则令SCS3低地址为(s1+SIZE11)20,高地址为(s1+SIZE1)20-1,配置完成;2)到了此处后slot1的起始地址肯定要=0x20000000,若SIZE0x10000000,进而执行这些操作:若s1HIGHMEM_BASE,直接转到3,否则置s1为HIGHMEM_BASE,仍然接着执行3;3)先重置SIZE=SIZE11+s1,置SCS2的低地址为s120,置SCS3的低地址为SIZE20,SCS2的高地址为SIZE20-1,然后重新计算SIZE=SIZE1+s1,SCS3的高地址为SIZE20-1.配置完成;4)是从1跳转而来的,这种情况是slot1的前一半放在0x10000000以下,而后一半放在0x20000000以上.若s1HIGHMEM_BASE,转到5,否则,置s1=HIGHMEM_SIZE,仍转到5;5)SCS3的低地址为SIZE020,高地址为(SIZE11+s1)20-1;最后仍然把当前内存达到的最高地址赋给s1.然后执行函数do_dense来初始化SDRAM:若是快速访问SDRAM模式,CONFIGRATION寄存器置为0x00e0c200,否则为0x04e0c080;SDRAM_ADDRESS_DECODE寄存器初始化为2,SDRAM_OPERATION_MODE寄存器清0.若是快速访存模式,依次执行下列操作:OPERATION寄存器为3,地址0xa0000000处清0,等到OPERATION寄存器最高位被控制器写成1,再令OPERATION寄存器为3,然后再在地址0xa4000000处清0,最后再等待OPERATION寄存器最高位被控制器置1.再把OPERATION寄存器清0.然后输出SDRAM_CONFIGRATION,SDRAM_TIMING_PARAMETERS,SDRAM_BANKPARAMETERS,SCS_LOW_DECODE_ADDRESS,SCS_HIGH_DECODE_ADDRESS这些寄存器的值.从0xa0000000到0xa0000000+2*1024*1024这片空间被清0.因为CACHE的SIZE最大为2M.至此,SDRAM初始化完毕.5.初始化CACHE调用do_cache执行下列操作设置CP0的CONFIG来保证一致性,并disabled二级三级CACHE.首先分别用S3,S4,S5,S6存储一级ICACHE的SIZE,块SIZE,DCACHE的SIZE,块SIZE.S7,S8为二级,三级CACHE的SIZE,因为它们无效,因此置为0.这些参数以后会用.对于龙芯二的CACHE要调用godson2_cache_init执行下列操作首先获得icache_size,dcache_size.目前在龙芯二里ICACHE和DCACHE通常都是32K二路组相联.在DCACHE中把虚拟地址0x800000000x80000000+DCACHE_SIZE中从0x80000000开始每隔32个字节的前两个虚拟地址(若是四路组相联则为前四个地址),初始化它们对应的CACHE块的TAG位的物理地址为0,并置其它标志位为0.若ICACHE存在,则把虚拟地址0x800000000x80000000+ICACHE_SIZE中从0x8000000开始每隔32个字节的前两个地址(若是四路组相联则为前四个地址),把它们的CACHE块状态设为无效.最后若DCACHE存在则把它的块内容写回并置无效状态,即清空.若不是龙芯二则执行下列操作初始化:把状态寄存器BEV位置0,关掉中断,关掉校验和ECC.把TAGHI,TAGLO,ECC都置0.把二级三级CACHE都disable.初始化ICACHE:从虚拟地址CACHED_MEMORY_ADDR到CACHED_MEMORY_ADDR+ICACHE_SIZE把它们对应的ICACHE块的TAG的物理地址都填充为0.并把对应的物理内存中块载入ICACHE.最后再次填充TAG(应该是设置一些位的值).初始化DCACHE:从虚拟地址CACHED_MEMORY_ADDR到CACHED_MEMORY_ADDR+DCACHE_SIZE把它们对应的DCACHE块的TAG都填充为物理地址0.再把每块都填上对应的内存数据.最后再次填充TAG的其它位.没有初始化二级三级CACHE.6.拷贝pmon的代码到内存从0xbfc00000把pmon代码段拷贝到内存,并在内存中清空bss.更新CONFIG寄存器.7.把小于0x10000000的最大物理内存地址作为参数,调用initmips,进入内存执行void initmips(unsigned int memsz)这个函数执行了cpu进入RAM执行后的初始化操作.下面仔细进行分析.一.一些系统参数物理地址空间是这样分配的,0x000000000x0fffffff是cpu的mem空间,0x100000000x1fffffff是北桥需要的io和mem空间,第三部分空间通常视具体情况而定,若内存较大,这部分最开始的一部分地址应该也是内存.Memorysize表示在小于0x10000000的空间中,内存的最高可用地址是多少,一般情况下它是1M的整数倍.接下来确定并初始化cpu的流水线时钟频率和总线时钟频率.这两个频率通常分别默认为333M和133M.然后初始化cpu内部寄存器信息.二.dgbinit(NULL),它定义在main.c中,它的具体操作为1)_init(NULL)进行constructor初始化2)envinit ()初始化环境变量必需加入环境变量列表envvar的有”ethaddr”,”memsize”,”cpuclock”,”busclock”,”systype”,”I3cache”,”gtbase”这些基本的系统参数.再把标准环境变量的各变量stdenvtab加入环境变量列表envvar.3)tgt_devinit()执行了下列操作(定义在tgt_machdep.c)(1)开启cache,进行cache初始化配置,并检查内存是否有错,检查方法为逐字写入并读出比较(2)接下来驱动pci总线和设备_pci_businit()(定义在pciconf.c)a)先调用_pci_hwinit(定义在pci_machdep.c)初始化pci总线数据结构和地址寄存器.首先为pci总线分别定义描述符.并为总线的各个域赋值.其中主要是本总线的可分配空间起始地址.然后修改命令寄存器的状态.把存储器地址位和总线主设备为置1,使得译码时把pci总线上出现的地址译成pci设备上的存储器地址,并使pci设备可以作为主设备.然后为pci0,pci1的内部寄存器基址寄存器赋值.其中pci0的io空间是0x102000000x102fffff,它的mem空间是0x120000000x137fffff,pci1的io空间是0x101000000x101fffff,mem空间分为两段,可分配的是0x108000000x11ffffff,不可分配的是0x100000000x100fffff.再enable pci的10个基址寄存器,使得这10个BAR有效.然后将pci0,pci1的内部寄存器mem空间基址都置为0xf4000000再根据北桥内已经赋值(在前面汇编代码中得到的存储器和设备高低地址)寄存器值,为pci设备内部的译码寄存器赋值,包括2*9个基地址寄存器,2*9个SIZE寄存器,并把2*9个remap寄存器都清0.(2是两个pci总线,9包括SCS0:3,CS0:3,BOOTCS)最后enable仲裁控制寄存器.b)然后调用_pci_scan_dev(pciconf.c)和_setup_pcibuses(pciconf.c)初始化pci设备.每个总线可以挂32个设备,其中包括总线自身.在系统数据结构中,pci总线是挂在本总线上的设备的双亲.接下来遍历两个pci总线上的pci设备,为它们分配数据结构,把该设备的数据结构跟自己的双亲和兄弟数据结构连接起来形成跟实际一致的树状结构.根据设备配置寄存器的值为设备的域赋值.最后计算本设备所需要的空间大小,并把所得的空间大小通知给到双亲设备用来做以后的计算.这里实际上包含两种遍历方式,查询设备并建立数据结构是从上到下的,而获取所需空间大小是从下到上的.最后从上到下地为每个设备分配所需的空间窗口.4)网络驱动init_net ()(定义在init_main.c)/这段代码并没有执行,因为没有宏定义INET(1)首先用环境变量来确定当前系统优先级,从07为emerg,alert,crit,err,warning,notice,info,debug.(2)paraminit ()初始化系统日志要用的参数.(3)vminit()虚存初始化.取得一块长度为1M的虚存空间.并用变量记载它的基址.(4)kmeminit()为kernel内存中的每页建立数据结构(位图)并把它们存储在kernel内存中.同时确定kernel内存的基址,偏移量,上限等变量.(5)callouts初始化:在内存中为以后会出现的函数调用建立数据结构链表,这种数据结构的域包括函数名,参数,执行最大时间,next指针.(6)这一步是初始化mbuf,并用mbinit()更新中断优先级,分配一个页并插入到freelist中.(7)初始化网络设备和网络协议.tgt_devconfig()中,首先在北桥的以太网物理地址寄存器,路由寄存器,串行多元端口寄存器中写入物理地址.并初始化MPP4个控制寄存器的值;然后用_pci_devinit(1)检查pci设备并使它们可以正常工作;再用config_init()初始化自动配置的数据结构.把所有伪设备(用函数实现一些功能,相当于硬件设备)链中的设备函数都执行一遍.ifinit()进行网络接口初始化,包括watchdog计时器的执行.然后是domaininit()(8)init_proc()初始化进程表.在这里先初始化文件系统,然后再初始化进程描述符表的状态和符号表信息.并让进程描述符表的第一个元素指向当前进程.写入它的状态SNOTKERN,名字”pmon”,pid为1,文件信息和符号表信息.(9)根据程序要求看是否需要配置默认的以太网接口5)进程号初始化histno=16)syminit()符号表初始化,建立”Pmon”符号表,它对应的地址是pmon程序的入口,建立”start”符号表,它对应的地址是0x80100000.还定义了”_ftext”,”etext”两个符号表.7)建立控制台终端初始状态8)输出本程序和机器相关的版本和其它信息三.建立中断向量首先把tlb_miss,gen_exec两个中断向量载入系统中.然后清空cache.将status寄存器中的Bev位清0,表示进入正常模式.最后在main()中把godson_test.bin的内容拷贝给flash.vlog要想开发龙芯,首先要找点资料,学习好以后再去实践。目前就在找资料和看资料的过程,当拿到龙芯电脑时,就可以自己开发了。 龙芯2E用户手册.pdf /bbs/attachment.php?aid=236龙芯本 地编译工具链 /upfiles/toolchain-local.tar.gz本软件用于本地编译各种龙芯软件操作平台:LinuxPMON 源码 /upfiles/pmon-1215.tar.gzpmon是用于龙芯的,负责引导系统内核,目前用于龙芯税控机,龙梦电脑,视频监控等设 备上操作平台:Linuxgxemul 模拟器 /upfiles/能运行龙梦BIOS和内核的模拟器,版本操作平台:Win98/ME/2000/XP/Linux要开发龙芯,那么要先学习一下它的汇编。而它的汇编跟MIPS的相似,这样的话,就只能拿MIPS32的先来学习了。下面就是一些资料的连接。MIPS Assembly Language Programming/ellard/Courses/cs50-asm.pdfMIPS Assembly Language Programmers Guidehttp:/www.cs.unibo.it/solmi/te . LanguageProgDoc.pdfMIPS Assembly Languagehttp:/www.inf.uni-konstanz.de/d . /download/rs-05.pdf网页教程/homes/hosking/502/spim/node9.htmlhttp:/www.doc.ic.ac.uk/lab/secondyear/spim/node9.html.tr/baray/cs224/ref/node2.html.tr/baray/cs224/ref/spim.html/AssemblyTutorial/TutorialContents.html/cs354-1/ . L.instructions.html附件: MIPS32指令集.rar /bbs/attachment.php?aid=923对于一个新CPU,那就有很基本的问题要搞清楚的。现在把想到的问题列表如 下:1CPU指令是什么?答:MIPS 指令。2什么是 MIPS?答:MIPS 的名字为“Microcomputer without interlocked pipeline stages”的缩写。另外一个通常的非正式的说法是“Millions of instructions per second”。3编译工具是什 么?答:mips- elf-gcc。4龙芯电脑的 BIOS是什么?答:PMON。5龙芯电脑的操作 系统是什么?答:LINUX。6龙芯电脑的是 32位还是64位呢?答: 龙芯1是32位的,而龙芯2E是64位的。但MIPS的CPU有一个优点,就是32位的代码是可以不修改就在64位的CPU上运行。还有很多问题,以后再整理吧。要对龙芯电脑开发,也需要了解硬件的组成,这样才可以对它进行编写相应的驱动 程序和使用。现在就来了解一下龙芯电脑的主要芯片组成,下面先从网上的龙梦电脑的组成来入手。它的配置如下:福珑迷你电脑CPU龙芯2E CPU,主频600MHz-900MHz,支持DDR333内存总线,功耗2-4瓦北桥芯片ICT NB2E (ALTERA EP2C20F484)芯片,功耗0.1-0.3瓦南桥芯片VIA VT82C686B,33MHz 32-bit PCI接口显示芯片ATI RADEON 7000-M,33MHz 32-bit PCI接口,内部集成16MB DDR内 存,外接VGA显示输出和S-Video输出内存内存插槽200线PC2700-SODIMM槽一个,标配256MB内存,可扩展到512MB存储2.5英寸笔记本硬盘(容量未知)网络Realtek 8139D, 33MHz 32-bit PCI接口,外接RJ45接口音频芯片符合AC97规范,I/O接口一个PS/2接口、DB9型的COM口、一个红外遥控接收器接口、4个USB接口主板尺寸14cm宽x18cm电源输出接口一个12V笔记本电源输入接口,一个4-pin电源输 出接口(提供+12V,+5V电源输出)整机功耗15-20瓦报价1599元这里使用的主要芯片有:龙芯2E,ALTERA EP2C20F484,VIA VT82C686B,ATI RADEON 7000-M,Realtek 8139D,AC97规范。因此,就需要了解这些芯片的作用和功能,并且学习怎么样操作它,有什么样的寄存器,并且要知 道它们的接口方式。 龙芯软件开发(5)北桥南桥芯片的作用 收藏 北桥是基于Intel处理器的个人电脑主板芯片组两枚芯片中中的 一枚。北桥设计用来处理高速信号,通常处理CPU,RAM,AGP端口或PCI Express,还有南桥之间的通信。 北桥芯片(North Bridge)是主板芯片组中起主导作用的最重要的组成部分,也称为主桥(Host Bridge)。一般来说,芯片组的名称就是以北桥芯片的名称来命名的,例如英特尔 845E芯片组的北桥芯片是82845E,875P芯片组的北桥芯片是82875P等等。北桥芯片负责与CPU的联系并控制内存、AGP、PCI数据在北桥内部传输, 提供对CPU的类型和主频、系统的前端总线频率、内存的类型(SDRAM,DDR SDRAM以及RDRAM等等)和最大容量、ISA/PCI/AGP插槽、ECC纠错等支持,整合型芯片组的北桥芯片还集成了显示核心。北桥芯片就是主板上离CPU最近的芯片,这主要是考虑到北 桥芯片与处理器之间的通信最密切,为了提高通信性能而缩短传输距离。因为北桥芯片的数据处理量非常大,发热量也越来越大,所以现在的北桥芯片都覆盖着散热 片用来加强北桥芯片的散热,有些主板的北桥芯片还会配合风扇进行散热。因为北桥芯片的主要功能是控制内存,而内存标准与处理器一样变化比较频繁,所以不同 芯片组中北桥芯片是肯定不同的,当然这并不是说所采用的内存技术就完全不一样,而是不同的芯片组北桥芯片间肯定在一些地方有差别。 由于已经发布的AMD K8核心的CPU将内存控制器集成在了CPU内部,于是支持K8芯片组的北桥芯片变得简化多了,甚至还能采用单芯片芯片组结构。这也许将是一种大趋势,北 桥芯片的功能会逐渐单一化,为了简化主板结构、提高主板的集成度,也许以后主流的芯片组很有可能变成南北桥合一的单芯片形式(事实上SIS老早就发布了不 少单芯片芯片组)。 南桥是基于Intel处理器的个人电脑主板芯片组两枚芯片中中的一枚。 南桥设计用来处理低速信号,外设驱动的通信,通过北桥与输入/输出设备联系,可以处理PCI-E,PCI和输入设备之间的通信。/输出, LAN, Audio, USB, BIOS Hub 龙芯软件开发(6)CPU龙芯2E 收藏 在开发软件中,对于CPU的了解就是最重要的了。无论什么指令都需要CPU来执行。现在就来看看龙芯 2E的具有什么特征了。龙芯2号增强型处理 器(简称“龙芯2E”)是中国科学院计算技术研究所研制的、具有自主知识产权的64位高性能通用处理器,龙芯2E的最高主频率达到1GHz,最高双精度浮 点运算速度每秒39.93亿次,SPEC CPU2000性能测试达到500分,是目前全球除美日之外性能最高的通用处理器。 龙芯2E采用四发射的动态超标量超流水线结构,实现了先进的转移猜测、寄存器重命名、动态调度、以及非阻塞的高速缓存访问等乱序执行技术。 龙芯2E片内含64KB一级指令高速缓存、64KB一级数据高速缓存、以及512KB二级高速缓存,片内还集成有DDR内存控制器,在单处理器体系结构上 达到国际先进水平。 龙芯2E采用90纳米CMOS工艺,是大陆地区第一个采用90纳米设计技术的处理器。晶体管数量4700万个,面积35平方毫米,典型工作 频率750MHz下实测功耗为57瓦,适用于高端嵌入领域。上面就是龙芯2E的结构体系图。从这个图里可以看到CPU是怎么样工作,怎么 样把指令执行的。可以看到流水线级别,还有ALU的个数,在这里有四个ALU。龙芯软件开发(7)编译PMON指南 收藏 编译PMON指南蔡军生为了学习怎么样开发龙芯的BIOS,也就是PMON。经历好几天深夜的探索,遇到各种各样的问题,后来又上论坛问到kkmao,总算解决了,在 这里谢谢kkmao的帮忙。现在就把我的编译过程介绍一下。一、下 载SVN工具由于要下载PMON代码,就要使用SVN工具。目前,所有的代码都是按 版本控制形式保存在服务器上的,并且没有打包的代码,这样就需要使用SVN的工具来下载代码。如果在WINDOWS下,就要下载WINDOWS的SVN工 具。如果在LINUX下,就需要下载LINUX的GETIT工具。二、注 册帐号先到网站上面注册一个帐号,然后才能登录 进入开发网站,否则不能登录进去的,由于目前没有开通诺名功能。注册帐号后,就可以登录网站,然后通过SVN的工具下载/svn/pmon-lm2e/branches/kkmao/分 支的代码和文档。三、安 装交叉编译器当你从上下载完所有代码后,就可以到目录 /kkmao/tools/compiler下面找到交叉编译器,它的名称是mips-elf.tar.gz。这是一个压缩包,当然要解压后才能使用。那 么需要解压到那里呢?通常都是解压到目录/usr/local/下面,这样就形成目录:/usr/local/comp/。四、设 置交叉编译路径上面已经把交叉编译器安装好后,并不能直接在任何路径里就运行它。比如 到目录Targets/Bonito/compile/Bonito下,如果运行make就会出错,因为它找不到编译mips-elf-gcc。如果要找 到它,就需要把它所在的目录加到当前环境变量里,这样才可进行编译。而在LINUX下,设置环境变量,需要打很长的字符,为了不用每次都浪费这么多功夫, 就可以写一个bash的脚本文件go.sh,它的内容如下:#!/bin/shexport PMONBASE=$(pwd)export PATH=/usr/local/comp/mips-elf/gcc-2.95.3/bin/:$PMONBASE/bin:$PATH然后打开终端显示窗口,就可以用source go.sh来运行这个脚本,这样会把交叉编译器的路径添加到当前运行的路径里,这样就可以在任何地方找到交叉编译器了。五、生 成pmoncfg工具在我没有问kkmao之前,根本就不知道还需要这样的一个过程。因此, 就编译不通过。由于PMON是根据配置选择不同的源程序进行编译,所以就需要一个工具来分析那个配置文件,而这个工具就是pmoncfg。生成这个工具要 到目录tools/pmoncfg下面,然后运行make就会生成pmoncfg工具。六、配 置Bonito文件进入Targets/Bonito/conf目录,选择一个 Bonito配置文件。在目前龙芯里是选择Bonito.notebook配置文件,为了方便运行,就进行符号连接。再接着运行pmoncfg工具来生成 目标源程序的目录。执行下面的命令:ln -s Bonito.notebook Bonitotools/pmoncfg/pmoncfg Bonito这样就形成目标目录Bonito了。七、编 译PMON进入到上面生成的目录Targets/Bonito/compile /Bonito里,然后运行make,就会生成pmon.bin文件。接着再到zloader目录make,或者直接到zloader下面make,最后在zloader目录生成gzrom.bin文件,就可以烧到龙芯 的Flash存储器里,就可以进行主板初始化了。(模拟器也可以运行)八、模 拟器运行PMON解压gxemul-0.3.8-good.tar.gz源程序,然后进 入到目录里,运行./configure文 件,就会生成makefile文件。接着运行make文件就可以生成模拟器gxemul。如果把pmon.bin文件拷贝到这个目录下,就可以如下运行:./gxemul -Xe bonito 0xbfc00000:pmon.bin这样就可以运行PMON了,上面的命令行意思是输出到X窗口,而代码ROM开始地址是0xbfc00000,也就是从那里取第一条指令。在我的LINUX里可以编译通过gxemul-0.4.2.current.tar.gz,但运行它时,就不支持-X参数,这个问题我也没有搞清楚。 龙芯软件开发(8)理解龙芯2E寄存器和内存布局 收藏 对于软件开发人员来说,一个CPU 最重要的部分就是寄存器、内存布局和指令。龙芯2E逻辑上是有32个定点通用寄存器(其中0号固定为0),32个浮点寄存器,一个hi,一个lo,以及若干cp0控制寄存器,两个cp1控制寄存器。物理上是64个定 点,64个浮点,和若干控制寄存器。龙芯2E具有下面的逻辑寄存器:l 32个通用的64位寄存器l 1个PC寄存器l 2个保存乘除操作结果寄存器l 32个浮点64位寄存器l 32个CP0控制寄存器l 2个cp1控制寄存器一、32个通用的64位寄存器这32个通用寄存器,可以用作任何使用。但实际上由于编译器已经约定特定的使 用,所以还是要服从特定的约定,这样可以减少麻烦,减少开发出错机会。特定使用如下:l $0zero 值总是为0,可能主要用途是清空内存地址空间,以及做一些与或非的操作,访问速度快。l $1$AT是为编译器保留的寄存器l $2.$3 V0.V1保存函数返回值用l $4.$11 A0.A7函数调用时传递参数,可以 传递8个整型参数l $12.$15T0.T3临时寄存器,用于保存临时变量的值,也是用的最多的寄存器l $16.$23S0-S7 他们的值在过程调用的时候保持不变,可 以用于传递参数或者返回值l $24.$25T8.T9 临时寄存器,用于保存临时变量的值,也是 用的最多的寄存器l $26.$27K0.K1 保留给操作系统内核使用l $28 GP保存全局指针l $29 SP 保存堆栈指针l $30 FP或S8 保存帧指针,也可以和S0.S7一样使用l $31 RA保存返回地址二、专用寄存器HI和LO主要返回乘除结果,PC是指令 计数器。三、内存布局在32位下,程序地址空间划分为4个大区域。每个区 域有一个传统的名字。对于在这 些区域的地址,各自有不同的属性: kuseg: 0x000 0000 - 0x7FFF FFFF (低端2G):这些地址是用 户态可用的地址。在 有MMU的机器里,这些地址将一概被MMU作转换。除非MMU的设置被建立 好,这2G地址是不可用的。对 于没有MMU的机器,存取这2G地址的后依具体机器相关。你的CPU具体厂商提供的手册将会告诉你关于这方面的信息。如果想要你的代码在有或没有MMU的MIPS处理器之间有兼容性,尽量避免这块区域的存取。 kseg0: 0x8000 0000 - 0x9FFF FFFF(512M): 这些地址映射到物理地址简单的通过 把最高 位清零,然后把它们映射到物理地址低段512M(0x0000 0000 - 0x1FFF FFFF)。因为这种映射是很 简单的,通常称之为“非转换的“地址区域。几乎全 部的对这段地址的存取都会通过快速缓存(cache)。因此在cache设置好之前,不能随便使用这段地址。通常一个没有MMU的系统会使用 这段地址作为其绝大多数程序和数据的存放位置。对于有MMU的系统,操 作系统核心会存放在这个区域。 kseg1: 0xA000 0000 - 0xBFFF FFFF(512M): 这些地址通过把 最高3位清零的方法来映射到相应的物理地址上,与kseg0映射的 物理地址一样。但kseg1是非cache存取的。 kseg1是唯一的在系统重启时能正常工作的地址空间。这也是为什么重新 启动时的入口向量是0xBFC0 0000。这个向量相应的物理地址是0x1FC0 0000。将使用这段地址空间去存取你的初始化ROM。大多数人在这段空间使用I/O寄存器。kseg2: 0xC000 0000 - 0xFFFF FFFF (1G): 这段地址空间只能在核心态下使用并且要经过MMU的转换。在MMU设置好之 前,不能存取这段区域。除非你在写一个真正的操作系统,一般来说你不需要使用这段地址空间。龙芯软件开发(9)理解龙芯2E几个汇编问题 收藏 在以前的MIPS机器里,都需要进行如下处理:1.加载或保存到内存. 2.lw $9, 0($8); 从内存里加载一个值到$93.nop ; $9在这里还没有准备好,所以要跑多一条空指令来解决。4.addiu $10, $9 ; $9在这里已经从内存取值回来,可以使用了。5.分支和跳转. 6. jal myfunc ; 调用函数7. move a0, s0 ; 这条指令在跳转前执行8. addiu s0,s0,v0 ; 这条指令在跳转后执行。不知道龙芯是否也需要这样编程吗?现在的龙芯2E是不需要再在加载和保存指令 后面加NOP指令了。跳转连接指令后面,除了跳转指令外其它指令都可以加入去。龙芯软件开发(10)龙芯2E指令 收藏 每个CPU都有自己独特的指令,比如X86结构的CPU有INTEL的指令系 统,MIPS的CPU也有自己的指令系统,当然龙芯CPU也不例外,有自己的指令系统。指令是控制CPU怎么样工作的接口,每条指令都会让CPU做出响应 的。如果发送一条不是CPU的指令,就会导致CPU非法执行,并且会引起CPU异常。龙芯里,每条指令都是固定长度:32位,4个字节。因此,任何指令段 的代码长度,一定要是4字节的倍数,绝对不要出现不是4的倍数,否则就让CPU不能运行了。从龙芯的使用手册中可以看到,每条CPU指令都是一条32位的指令字, 这些指令都是字对齐的。指令集包含三种指令格式,如图 2-1所示,立即数指令(I-型),跳转指令(J-型)和寄存器指令(J-型)。使用简单几种指令格式可以简化指令译码,并且使得编译器根据这三种指令格式可以合成更多的复 杂操作(使用频率较低)和访存模式。op 6位操作码rs 5位用于确定源操作寄存器的域rt 5位用于确定目标(源/目的)操作寄存器或跳转条
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 后宫妃子考试题目及答案
- 国考题库附参考答案详解(达标题)
- 消防设施操作员国考题库及参考答案详解【模拟题】
- 国考题库文件下载附参考答案详解(轻巧夺冠)
- 消防初级国考理论题库含答案详解ab卷
- 航天常识国考题库及答案详解(易错题)
- 国考题库文件下载附答案详解【a卷】
- 许昌国考常识题库含完整答案详解【名校卷】
- 国考题库综合附完整答案详解(历年真题)
- 登高高处作业国考题库及参考答案详解【考试直接用】
- 中国高血压防治指南(2024年修订版)解读课件
- GB/T 19609-2024卷烟用常规分析用吸烟机测定总粒相物和焦油
- 2024年安徽省初中(八年级)学业水平考试初二会考生物+地理试卷真题
- 松江区乡镇地图课件上海市松江区行政区划可编辑高清模板
- 语言:轰隆隆来了
- 白云区五年级上学期语文期末试卷
- 报名统计表格
- 软件系统上线试运行申请表方(仅用于个人学习的参考模板)
- 特许经营管理手册范本(餐饮)
- 配电箱配电柜专项施工方案
- 大学生政协模拟提案范本
评论
0/150
提交评论