pmon使用介绍

目录

Pmon介绍

Pmon特点:

支持的架构

pmon目录介绍

uboot和pmon的区别

uboot和pmon优缺点

U-Boot的优点:

U-Boot的缺点:

Pmon的优点:

Pmon的缺点:

pmon目录架构

pmon指令

        h -帮助指令

        devls -显示设备信息

        fdisk -显示存储器分区信息

        读写寄存器

        ifconfig/ifaddr

        set  -查看或增改pmon环境变量

        unset       -删除pmon环境变量

        load  -加载一个elf文件到内存

        fload       -固件烧录

          bl           -读取boot.cfg

          fdt          -设备树

        date              -读取时间 

        pciscan -扫描并输出 PCI 总线上的所有设备

        env -查看环境变量命令

        vers -pmon 版本号命令

      reboot -重启

在 pmon 里面添加命令

pmon 的启动流程

makefile.inc 内容

Pmon 下的 makefile.inc 文件分析


Pmon介绍

PMON(Processor Monitor)是一个开源的、具备BIOS和bootloader功能的监控程序,主要用于嵌入式系统。它由中国科学院计算技术研究所的中科龙梦团队开发,并在国内得到了广泛的应用和推广。

Pmon特点:

  1. 多平台支持:PMON支持MIPS、ARM、PowerPC等多种处理器架构,这使得它能够适用于不同类型的嵌入式设备。
  2. 文件系统支持:PMON支持ext2、fat32等文件系统,可以引导操作系统,并支持网络引导(tftp)、磁盘引导和flash引导等方式。
  3. 内建调试功能:PMON提供了强大的调试功能,方便开发者对内核进行调试。
  4. USB 2.0 Mass Storage支持:它可以作为USB存储设备,方便数据的传输和存储。
  5. 网络功能:PMON支持网络协议,如TCP/IP,可以进行网络通信和配置。
  6. 环境变量和命令行接口:PMON提供了环境变量设置和命令行接口,用户可以通过命令行发送控制指令,查看系统信息和进行系统配置。
  7. 图形界面:PMON还提供了一个图形用户界面,方便用户进行系统管理和监控。
  8. 开源和BSD许可:PMON的源代码是开放的,遵循BSD许可协议,这有利于社区的参与和贡献。

支持的架构

MIPSARMPowerPC等重点是支持龙芯自产的loongarch架构

pmon目录介绍

我们从目录就可以看出pmonuboot差距还是很大的

对比一下

ubootpmon的区别

  • U-Boot是一个广泛使用的、开放源码的嵌入式操作系统引导加载程序。它支持许多不同类型的处理器和硬件平台,并提供了许多功能,如串行控制台接口、网络接口、文件系统支持等。U-Boot的主要用途是引导和初始化系统,并在设备上电时提供基本的外设接口,如内存和磁盘访问。它还提供了一些工具,用于开发人员调试和测试。
  • Pmon则是针对龙芯处理器的一个专门开发的引导加载程序,专门用于龙芯架构的处理器。Pmon实现了包括内存管理、处理器初始化、设备初始化、以及引导流程控制等在内的全部引导加载程序功能。
  • 因此,U-BootPmon的主要区别在于它们的用途和实现的功能有所不同。U-Boot更广泛地应用于各种嵌入式系统和设备,而Pmon则专门针对龙芯处理器。

用途上uboot更广泛点,那我们来聊聊各自的优缺点

uboot和pmon优缺点

U-BootPmon作为嵌入式系统开发中常用的引导加载程序,它们各自有一些优点和缺点。

U-Boot的优点:

  • 1. 广泛性:U-Boot支持多种处理器架构和硬件平台,适用范围广泛。
  • 2. 功能丰富:U-Boot提供了丰富的功能,如网络引导、文件系统支持、命令行接口等,可以满足不同类型的嵌入式系统需求。
  • 3. 活跃社区:U-Boot拥有庞大的开发者社区和用户群体,提供了丰富的文档和支持。
  • 4. 灵活性:U-Boot可以定制和配置,适应性强,可以根据需要进行功能扩展和优化。

U-Boot的缺点:

  • 1.复杂性:U-Boot相比其他引导加载程序可能较为复杂,学习和使用门槛较高。
  • 2.资源消耗:U-Boot可能占用较多的系统资源,例如内存和存储空间。
  • 3.定制成本:定制和优化U-Boot可能需要较多的时间和成本投入。

Pmon的优点:

  • 1.专门性:Pmon专门为龙芯处理器设计,针对特定硬件平台进行了优化。
  • 2.性能:Pmon在龙芯处理器上具有良好的性能表现,可以发挥硬件的优势。
  • 3.稳定性:Pmon经过专门开发和优化,具有较高的稳定性和可靠性。

Pmon的缺点:

  • 1.局限性:Pmon仅适用于龙芯处理器,功能和适用范围相对有限。
  • 2.支持度:相比于U-Boot等通用的引导加载程序,Pmon的支持和社区可能较为有限,获取帮助和支持可能相对困难。

总的来说,选择使用U-Boot还是Pmon取决于具体的硬件平台和系统需求。对于广泛应用于多种处理器架构的项目,U-Boot可能是更好的选择;而对于特定硬件平台且对性能要求高的项目,Pmon可能更适合。在实际使用中,开发者可以根据项目需求和系统特点进行选择。

pmon目录架构

我们来详细介绍一下pmon的主要目录架构

  • -conf      -配置文件
  • -doc       -说明文档
  • -examples -例子
  • -fb         -用来在frambuffer显示的代码               Framebuffer是一种用于在屏幕上显示图形的设备,它是一个内存区域,用来存储图像像素的颜色信息。在嵌入式系统中,framebuffer可以通过底层的驱动程序来访问和控制,从而实现在屏幕上显示图形界面。
  • -include    -包含头文件的目录或文件
  • -lib         -库文件。库文件是一种包含已编译代码和数据结构的文件,用于在应用程序中提供功能和接口。
  • -pmon   里面是pmon的主体代码

  •         * `-arch`文件:通常用于存储与处理器架构相关的配置和信息,包括处理器类型、指令集、内存管理等。
  •         * `-cmds`文件:可能包含与Pmon功能相关的命令和脚本,用于控制和处理系统事件和数据。
  •         * `-cmmon`文件:可能包含公共的配置和数据,供其他文件使用。
  •         * `-custom`文件:可能用于存储自定义的配置和数据,用于扩展Pmon的功能或定制行为。
  •         * `-dev`文件:可能包含与开发相关的配置和数据,例如设备驱动程序、调试信息等。
  •         * `-fs`文件:可能涉及文件系统的配置和数据,例如文件路径、访问权限等。
  •         * `-loaders`文件:可能包含加载器相关的配置和数据,用于加载和初始化硬件设备或文件系统。
  •         * `-netio`文件:可能涉及网络输入/输出相关的配置和数据,例如网络接口驱动程序、网络地址和配置信息等Pmon 常用的命令
  • -sys        系统相关的文件和资源
  • -targets         通常包含针对不同目标平台或处理器架构的配置文件、脚本和资源。这些文件用于指定和定制Pmon在特定硬件平台上的行为和功能。
  • -tools            包含用于开发、编译、调试和部署Pmon的工具和资源。这些工具可能包括编译器、链接器、调试器等,用于构建和测试Pmon代码。
  • -x86emu       包含针对x86处理器的模拟器代码和资源。模拟器用于在模拟环境中运行Pmon,验证其在x86处理器上的行为和功能,以帮助开发人员测试和调试。
  • -zloader        用于加载和引导Pmon的引导加载程序(bootloader)代码和资源。引导加载程序负责初始化系统并加载Pmon的核心部分,以便启动Pmon的运行

pmon指令

龙芯系统进入前按“c”进入pmon的命令行

        h -帮助指令

h查看pmon所有指令,查看完按q返回

h xxx查看指令书写格式,以及指令介绍

比如h ping

        devls -显示设备信息

        fdisk -显示存储器分区信息

 

        读写寄存器

d4

格式 d4 地址 读取字节

m4 4字节写入

格式 m4 地址 写入内容

不要随便写,这里不展示了

        ifconfig/ifaddr

        格式 ifconfig/ifaddr 网口名 ip

        ifconfig 网口名 remove   -移除功能

        set  -查看或增改pmon环境变量

格式 set 环境变量名 环境变量值

 

        unset       -删除pmon环境变量

建议:别乱改,小心点现有的环境变量。你也可以不接受我的建议,坏了不怪我

        load  -加载一个elf文件到内存

格式:load 所在路径/文件名称

加载了sd卡,查看了boot的内容

这是加载内核,这样显示为加载成功了

 fload       -固件烧录

一般用来烧录新的pmon文件,这里省了下载器,但是前提你的pmon文件正确,要不然你的开发板就成了板砖

          bl           -读取boot.cfg

      

        输入这个指令就sd重新加载了,你要想硬盘加载就把sdcard0改成wd0

          fdt          -设备树

       打印所有设备树  print_dtb /

        打印dc节点

     print_dtb /soc/dc@0x400c0000

        date              -读取时间

        设置时间命

        pciscan -扫描并输出 PCI 总线上的所有设备

        env -查看环境变量命令

        vers -pmon 版本号命令

      reboot -重启

在 pmon 里面添加命令

在 pmon 源码的 pmon/cmds/目录下创建一个 cmd_test.c,上面讲到,pmon/cmds 文 件夹里面全是指令

cmd_test.c

#include <stdio.h>
#include <pmon.h>
int cmd_test (void)	
{
	printf("Welcome to use Mi Lianke products\n");
}
static const Cmd Cmds[] =
{
	{"MyCmds"},
	{"cmd_test","",0,"cmd_test  date",cmd_test,0,99,CMD_REPEAT},                                                                          
	{0,0}
};

static void init_cmd __P((void)) __attribute__ ((constructor));
  
static void
init_cmd()
{
	cmdlist_expand(Cmds,1);
}

还要再改几个文件,files.ls2k 和 ls2k.mlka,这都是编译环境所需要的文件

在file.ls2k添加

在ls2k_mlka内添加

添加完成后,开始编译 pmon,然后得到 gzrom-dtb.bin 文件,把新的文件烧录到开发 板 flash 里面即可。

这是在 pmon 下运行的结果

如果你不想调用这个指令,直接在ls2k_mlka中把该指令注释掉就行

pmon 的启动流程

让我们先来回忆一下,pmon的编译步骤

第一步我们来打开zloader.ls2k文件

我们先看makefile文件,这是我们第一个运行的文件

由makefile内容,我们看出有一个头文件,名叫getname

我们随后开始调用getname文件

由getname可以知道,我们接下来要找makefile.ls2k文件

根据代码内容,大家看到,又一个头文件,makefile.inc

makefile.inc 内容

  •  变量定义:设置一些用于控制构建过程的变量,如编译器选项、库路径、输出目录 等。
  •  编译规则:定义如何编译文件,包括编译命令、链接命令、输出文件等。
  •  安装规则:定义如何安装编译后的文件,例如复制到指定目录。
  •  清理规则:定义如何清理编译过程中产生的临时文件和目录。
  •  依赖关系:定义不同目标之间的依赖关系,确保在构建过程中按正确的顺序执行。

总结来讲,编译过程就是一环套一环

我们来看一下 makefile.inc 里面代码

第一条命令是用于预处理一个名为ld.script.S的汇编脚本文件。这个命令的作用是对ld.script.S进行预处理指定了一些宏定义,然后将预处理后的结果输出到ld.script文件中。

我们来看一下ld.script.s文件,start是入口,记住这个点,后面有用

代码不过多解释了,太多了,介绍一下ld.script.s文件,这是一个汇编脚本文件(通常用于链接脚本),用于指定如何将目标文件链接成可执行文件或库。

继续回到makefile.inc文件

这么简单的代码,大家都看得懂吧,那我就不解释喽!

看最后一步,cp那个,我们按照该路径找到文件

我们由上图看到的是已经编译好的文件.o文件,那么源文件位置在

我们打开start.S文件

看见没,_start函数,对应ld.script.S

Pmon 下的 makefile.inc 文件分析

这段代码是一个 Makefile 的片段,它用于配置和构建基于 LoongArch 架构的系统。 Makefile 是一种自动化构建工具,它根据一系列的规则和指令来编译、链接组装软 件。下面是这个 Makefile 的主要部分的解释:

  1. `try-run` 规则:这个规则用于在执行命令前尝试运行它,如果命令成功,则返回命 令的输出;如果失败,则返回错误信息。
  2.  `cc-option` 函数:这个函数用于添加编译器选项,它尝试编译一个简单的程序来 检查编译器是否支持给定的选项。
  3.  `CC` 和 `CPP`:定义了 C 和 C++ 编译器,以及预处理器的命令。
  4. `CROSS_COMPILE`:定义了交叉编译器的命令前缀。
  5.  `S`:定义了当前的工作目录。
  6.  `CACHED_MEMORY_ADDR` 和 `UNCACHED_MEMORY_ADDR`:定义了缓存和未缓 存内存的地址。
  7.  `export` 指令:导出环境变量,这些变量可以在 Makefile 的其他部分使用。
  8.  `LD`:定义了链接器的命令。
  9.  `OUT_FORMAT`:定义了输出文件的格式。
  10.  `gencode`:定义了一个用于生成启动代码的脚本。
  11.  `all` 规则:定义了默认的构建目标。
  12.  `rom` 规则:定义了生成 ROM 的目标,包括清理、生成启动脚本、和复制文件等 步骤。
  13.  `zloader.o` 和 `init_loongarch.c` 的生成规则使用了 C 编译器进行编译。
  14.  `pmon.bin.c` 的生成规则使用了 gzip 工具进行压缩并转换为 C 代码。
  15.  `dtb_rules` 和 `b` 规则:定义了生成设备树(DTB)的目标和命令。
  16.  `cleanall` 和 `clean` 规则:定义了清理构建过程中的中间文件和对象文件的命令。
  17.  `cfg_rules` 和 `cfg` 规则:定义了更新配置文件的目标和命令。

根据以上解释,大家大概能看懂每行指令的用途了吧

简要介绍一下整个 makefile.inc 各个部分的作用

# 定义一个尝试运行命令并返回结果的函数

# ccoption 函数,尝试使用编译器选项编译一个空文件,以检查是否支持该选项

# 如果 PMONCC 环境变量未定义,使用交叉编译器

# 如果 S 环境变量未定义,设置当前工作目录为上一级目录

# 定义缓存和未缓存内存地址

# 导出交叉编译器前缀

# 导出 CFLAGS_ALIGN CC 环境变量

# 定义链接器命令和输出文件格式

# 定义 ROM 文件起始地址

# 定义生成启动代码的脚本

# 定义默认构建目标

# 根据目标是否为 ls3a5000_7a,定义不同的 ROM 构建规则

# 删除编译目标文件和缓存阶段文件

# 编译启动代码文件

# 复制编译生成的启动代码文件和缓存阶段文件

# 编译 zloader.c 文件生成 zloader.o 文件

# 根据 pmon 文件生成 init_loongarch.c 文件

# 使用 gzip 工具将 pmon.bin 压缩并存储为 pmon.bin.c 文件

# 生成设备树文件的规则,通过 pmonenv.py 脚本处理 dtbinfo.txt 文件并生成包含设备树的二进制文件

# 定义生成设备树文件的规则,根据参数生成设备树文件


#定义清理所有文件的规则

# 配置规则

# 创建编译目录并运行 pmoncfg 工具

# 执行配置,根据参数执行配置规则

  • 41
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值