pmon编译过程分析

pmon源码分析:
2017年3月26日
张飞online


1.首先还是引入一下,以前学的是arm,对于x86也仅仅是8086,原本以为以后就是搞arm了,没想到 啊。哈哈:现在搞龙芯了,都一样,希望国产
cpu可以早日雄起! 好了:以前学习arm主要是用uboot来引导,现在我们的龙芯主要是用pmon,pmon功能也很强大,就像我们的bios,但是他是
有引导功能的,而且还有命令行。比如 devls  pcicfg 命令有很多,但是常用的不多!其实pmon的维护已经停止了,现在的pmon主要是龙芯自己修改
代码。


2.当然这些东西都不是什么重点,核心是pmon究竟干了什么?
 pmon的主要作用是硬件初始化,操作系统引导,硬件测试,程序调试
 
pmon的目录结构还是很清晰的。但是这里要重点提一下zloader.xxxx
这个东西我们看他其实就是一个软链接,而且还指向了zloader,但是要注意我们常说Linux下的软连接相当于Windows下的快捷方式
但是不一样的是,你打开Linux下的目录“快捷方式”,你会发现他的目录地址是用当前软连接命名的,我们这里也是用到了这个特点。
在Makefile.3a8780e里面用到了,上面我们通过getname来获取了目录文件地址3a8780e然后通过主Makefile来包含了Makefile.3a8780e,其实就是
通过软连接名实现了包含不同的makefile,进入编译不同的目标。
然后我们打开Makefile.3a8780e里面的内容如下:其实就是定义了几个变量,指明目标,然后用 include Makefile.inc把Makefile.inc来包含


  1 TARGET=Bonito3a8780e
  2 TARGETEL=Bonito
  3 START=start.o
  4 MEMSIZE=128
  5 ZLOADER_OPTIONS=-mips3
  6 include Makefile.inc
————————————————————
在Makefile.inc里面并不全部执行,因为我们用的命令是 make cfg,所以只执行cfg标签:


cfg:
129     #DO 
130     perl -i -ne 'print;exit if(/^# DO NOT DELETE/);' ../lib/libc/Makefile 
131     perl -i -ne 'print;exit if(/^# DO NOT DELETE/);' ../lib/libm/Makefile 
132     perl -i -ne 'print;exit if(/^# DO NOT DELETE/);' ../lib/libz/Makefile 
133     mkdir -p ../Targets/${TARGET}/compile
134     cd ../Targets/${TARGET}/conf/;pmoncfg ${TARGETEL}
135     make -C ../Targets/${TARGET}/compile/${TARGETEL}/ depend clean
136 recfg:
137     vi ../Targets/${TARGET}/conf/$(TARGETEL)
138     make cfg
139 
140 zlib_gzip: zlib_gzip.c
141     cd zlib_deflate/;gcc -I ../../include -c *.c
142     cd zlib_inflate/;gcc -I ../../include -c *.c
143     gcc -o zlib_gzip zlib_gzip.c zlib_deflate/*.o zlib_inflate/*.o                                                                                                  
~                                                                            
_______________________________________________________________
可以看出来:
上面最开始的时候是使用了Perl命令来执行了一些操作,其实就perl解释器来执行perl语言,详细不懂,大概是从各个酷的makefile中找输出,到了DO NOT DELETE/
就退出。然后创建了目录,切换到pmon-loongson3_0301_23_final/Targets/Bonito3a8780e/conf里面 执行 pmoncfg Bonito,
然后-C 大写,切换到指定目录再执行 make 过程,makefile 在这个指定目录里面。下面贴图。不再跟踪,没必要了










链接脚本:注意链接脚本的意义,链接脚本表明了程序运行到内存中的地址(也就是运行地址),这里的内存是严格意义上的内存,不是flash
是ram所以链接脚本的地址是程序在开机后内存初始化完毕,搬移到内存中的地址。链接脚本的地址是: 
/home/linux/pmon-loongson3_0301_23_final/Targets/Bonito3a8780e/conf/ld.scripts
里面的内容是:链接地址是:. = 0xffffffff8f010000;(64位高位补f)可以看出在程序搬移到内存中的地址是0x8f010000(虚拟地址)。我们在开机上电的时候
是运行在0xBFC0 0000(虚拟地址)相应的物理地址是0x1FC0 0000(这是硬件工程师的flash布线设计物理地址注意的,对于软件工程师无意义,由于mips不像x86
没有什么实模式,保护模式,一开机就是虚拟地址,所以我们没必要关系物理地址,当然这里还涉及到一个问题,那就是现在肯定没有开mmu
他是如何映射的,其实就是用了mips架构的特点,kseg1这个内存区间只需要高3位清0就是物理地址),这里应该是用了位置无关代码实现的.。其实这里就涉及到三个地址
对于软件工程师来时就是俩个地址。




对于pmon的编译流程其实远远没有那么简单》下图:
其实pmon在编译的时候开始在target目录里面进行,然后编译了./Targets/Bonito3a8780e/compile/Bonito/pmon生成
pmon.bin 然后压缩在转16进制放入pmon.bin.c数组,包含到zloader/zloader.c里面
然后再次编译链接生成gzrom。再转gzrom.bin






创建了目录






|-- Targets            目标结构相关代码,每个新结构在该目录下有一个子目录
|   `-- Bonito            Bonito是我们的北桥代号,里面是一些关于北桥的代码
|       |-- Bonito
|       |-- compile
|       |   `-- zboot
|       |       |-- images
|       |       |-- pmon
|       |       `-- utils
|       |-- conf
|       |-- dev
|       |-- include
|       `-- pci
|-- conf                    源代码编译所依赖的配置文件所在目录
|-- doc                        说明文档
|-- examples                一看就知道是样例,但我还不知道只面究竟写的是什么
|-- fb                            在frambuffer上做文字和图形显示的代码    
|-- include                    系统头文件
|-- lib
|   |-- libc                C库
|   `-- libz                zip压缩库
|-- pic                    开机启动图片(压缩后的)存放目录
|-- pmon                pmon主体代码
|   |-- arch                    平台相关代码
|   |   `-- mips                处理器相关的代码,比如Flush_Cache等
|   |-- cmds                    pmon shell 命令代码
|   |-- common                    各模块共同依赖的代码
|   |-- custom                        ??这个目录不知道干什么用的
|   |-- dev                        一些基本设备的驱动,比如Flash
|   |-- fs                        文件系统支持代码
|   |-- loaders                        二进制文件加载器代码
|   `-- netio                        网络命令以及tftp的实现
|-- sys                            pmon的较低层的代码
|   |-- arch                        处理器相关代码一些定义
|   |   `-- mips                    
|   |       `-- include
|   |-- dev                        各种设备的驱动程序
|   |   |-- ata
|   |   |-- fd
|   |   |-- ic
|   |   |-- microcode
|   |   |   `-- siop
|   |   |-- mii
|   |   |-- pci
|   |   `-- usb
|   |-- kern                        主要是一些系统调用的实现,比如malloc,time, signal, socket
|   |-- linux
|   |-- net                        实现网络协议
|   |-- netinet                        实现网络协议
|   |-- scsi                            Scsi协议的实现
|   |-- sys                        这个大目录的头文件存放区
|   `-- vm                        ??虚拟内存相关实现
|-- tools                        一些工具
|   |-- bmp_logo                    把bmp图转换成C数据的工具
|   |-- bootelf
|   |-- mk
|   |-- pmoncfg                        源代码配置工具
|   |-- scripts
|   `-- srecord
|-- x86emu                        x86显卡模拟器,主要是运行显卡的BIOS,初始化显卡
|   `-- int10
|       `-- x86emu
|           |-- include
|           |   `-- x86emu
|           `-- src
|               `-- x86emu
|                   `-- x86emu
`-- zloader                        zip格式加载启动代码


Targets目录的组成


每个结构一个目录,我们拿Bonito来为例子,主要有下列文件:


    start.S 位于Targets/Bonito/Bonito 目录下,是C环境建立之前的汇编代码,使整个BIOS运行的起点。
    tgt_machdep.c位于Targets/Bonito/Bonito 目录下,一些板子相关的函数。
    pci_machdep.c进行Targets/Bonito/pci 空间分配的一些函数
    Targets/Bonito/dev 目录下一些板子特殊的设备的驱动。
    Targets/Bonito/conf 目录下是一些编译环境建立需要的一些文件


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值