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 目录下是一些编译环境建立需要的一些文件
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 目录下是一些编译环境建立需要的一些文件