PMON学习记录2:PMON启动流程1

article/2025/9/12 20:21:23

PMON启动流程分析

        B站有讯为电子的详细介绍视频,连接如下,十分推荐第一次学的看一下https://www.bilibili.com/video/BV13M4y1P7H8?p=7&vd_source=7758aca909f593c8652fba5b3a94211dhttps://www.bilibili.com/video/BV13M4y1P7H8?p=7&vd_source=7758aca909f593c8652fba5b3a94211d        

        1.找到链接脚本,链接脚本决定了入口在哪

        2.分析编译命令:

        make cfg all tgt=rom ARCH=mips CROSS_COMPILE=mipsel-linux- DEBUG=-g

                第一部分:ARCH=mips CROSS_COMPILE=mipsel-linux- DEBUG=-g

                        ARCH=mips 设置了平台是mips平台

                        CROSS_COMPILE=mipsel-linux-  设置交叉编译器前缀,在编译时会替换成mipsel-linux-,之所以设置环境变量,一个是方便在这儿不用输入绝对路径,当找不到交叉编译器的时候,需要输入交叉编译器的绝对路径

                        DEBUG=-g 设置调试信息

                第二部分:make cfg all tgt=rom

                        make cfg 是配置

                        make all 

                        make tgt=rom 在Makefile.inc里可以看到,是生成的二进制文件

        3.在pmon-loongson3/zloader.ls2k文件夹下找到Makefile文件

        Makefile.ls2k:               

                TARGET=LS2K
                TARGETEL=ls2k
                export START=start.o
                MEMSIZE=128
                ZLOADER_OPTIONS=-mips3

                include Makefile.inc

        这些变量决定了在哪个路径下去编译

        4.在pmon-loongson3/zloader.ls2k文件夹下找到Makefile.inc文件

        Makefile.inc

ejtag_rom ejtag_rom1 ejtag_ram rom: clean ${START} zloader.ogcc  -DSTARTADDR=${GZROMSTARTADDR}  -DOUT_FORMAT=\"${OUT_FORMAT}\" -DOUT_ARCH=mips -Umips -E -P ld.script.S  > ld.scri                ${LD} -T ld.script -e start -o gzrom ${START} zloader.o${CROSS_COMPILE}objcopy -O binary gzrom gzrom.bin

                ejtag_rom ejtag_rom1 ejtag_ram rom: clean ${START} zloader.o
                gcc  -DSTARTADDR=${GZROMSTARTADDR}  -DOUT_FORMAT=\"${OUT_FORMAT}\" -DOUT_ARCH=mips -Umips -E -P ld.script.S  > ld.scri                 ${LD} -T ld.script -e start -o gzrom ${START} zloader.o
                ${CROSS_COMPILE}objcopy -O binary gzrom gzrom.bin

                以上带颜色的部分都是定义了的,红色的在Makefile.ls2k里定义了,黄色的在输入指令的时候定义了,绿色的也是编译器的前缀

        下面将带颜色的部分,替换成定义的部分,更好理解这部分代码的意思

ejtag_rom ejtag_rom1 ejtag_ram rom: clean start.ozloader.ogcc  -DSTARTADDR=${GZROMSTARTADDR}  -DOUT_FORMAT=\"${OUT_FORMAT}\" -DOUT_ARCH=mips -Umips -E -P ld.script.S  > ld.scri                 mipsel-linux-ld -T ld.script -e start -o gzrom start.o zloader.omipsel-linux-objcopy -O binary gzrom gzrom.bin

               ejtag_rom ejtag_rom1 ejtag_ram rom: clean start.ozloader.o
                gcc  -DSTARTADDR=${GZROMSTARTADDR}  -DOUT_FORMAT=\"${OUT_FORMAT}\" -DOUT_ARCH=mips -Umips -E -P ld.script.S  > ld.scri //这一段代码就是为了将ld.script.s编译生成ld.script,而这个ld.script就是链接脚本               

                mipsel-linux-ld -T ld.script -e start -o gzrom start.o zloader.o
                mipsel-linux-objcopy -O binary gzrom gzrom.bin

        

${START}:rm -f ../Targets/${TARGET}/compile/${TARGETEL}/${START}gcc  -DSTARTADDR=${ROMSTARTADDR} -DOUT_FORMAT=\"${OUT_FORMAT}\" -DOUT_ARCH=mips -Umips -E -P ld.script.S  > ../Targets/${TARGET}/conf/ld.scriptmake -C ../Targets/${TARGET}/compile/${TARGETEL}/cp ../Targets/${TARGET}/compile/${TARGETEL}/${START} .

        ${START}:
                    rm -f ../Targets/${TARGET}/compile/${TARGETEL}/${START}
                    gcc  -DSTARTADDR=${ROMSTARTADDR} -DOUT_FORMAT=\"${OUT_FORMAT}\" -DOUT_ARCH=mips -Umips -E -P ld.script.S  > ../Targets/${TARGET}/conf/ld.script
                    make -C ../Targets/${TARGET}/compile/${TARGETEL}/
                    cp ../Targets/${TARGET}/compile/${TARGETEL}/${START} .

带颜色的部分,都可以在Makefile.ls2k中找到对应的定义

       将定义带入:

            ${START}:
                    rm -f ../Targets/LS2K/compile/LS2K/start.o
                    gcc  -DSTARTADDR=${ROMSTARTADDR} -DOUT_FORMAT=\"${OUT_FORMAT}\" -DOUT_ARCH=mips -Umips -E -P ld.script.S  > ../Targets/LS2K/conf/ld.script
                    make -C ../Targets/LS2K/compile/LS2K/   //使用 -C 标识会进入这个目录去执行相应的make
                    cp ../Targets/LS2K/compile/LS2K/start.o.  //执行完后,就将这个目录下的start.o复制过去了

        链接脚本:

                实际上是一个文本文件,由若干个命令组成,以分号隔开,这些命令就是命令链接器(mipsel-linux-ld)来控制链接国产

链接脚本的作用:

                我们需要分析一下这行代码:

                mipsel-linux-ld -T ld.script -e start -o gzrom start.o zloader.o

                第一部分:输入文件  start.o    zloader.o 

                第二部分:输出文件  gzrom

                第三部分:链接脚本  ld.script

                可以加将这行代码比喻成吃东西消化的国产,输入文件就是吃进去的东西,链接脚本就是消化过程,输出文件就是拉出去的东西

                我们在看看链接脚本的代码ld.script:

                        在此,将在ENTRY函数找到PMON入口_start

OUTPUT_FORMAT("elf32-tradlittlemips", "elf32-tradbigmips","elf32-tradlittlemips")//说明输出二进制的格式
OUTPUT_ARCH(mips)//说明输出二进制文件的平台
ENTRY(_start)//ENTRY函数的作用就是将括号中的符号值设置成入口地址,所以我们找到了PMON入口
SECTIONS
{. = 0xffffffff8f900000;//.可以理解成指针,指向一个地址,//这个值是在Makefile.inc里决定的,GZROMSTARTADDR.text :    //是将所有的下面*.文件合并成.text文件{_ftext = . ;*(.text)*(.rodata)*(.rodata1)*(.reginfo)*(.init)*(.stub)*(.gnu.warning)} =0_etext = .;PROVIDE (etext = .);.fini : { *(.fini) } =0.data :{_fdata = . ;*(.data). = ALIGN(32);*(.data.align32). = ALIGN(64);*(.data.align64). = ALIGN(128);*(.data.align128). = ALIGN(4096);*(.data.align4096)CONSTRUCTORS}.data1 : { *(.data1) }.ctors :{__CTOR_LIST__ = .;LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2)*(.ctors)LONG(0)__CTOR_END__ = .;}.dtors :{__DTOR_LIST__ = .;LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2)*(.dtors)LONG(0)__DTOR_END__ = .;}_gp = ALIGN(16) + 0x7ff0;.got :{*(.got.plt) *(.got)}.sdata : { *(.sdata) }.lit8 : { *(.lit8) }.lit4 : { *(.lit4) }_edata = .;PROVIDE (edata = .);__bss_start = .;_fbss = .;.sbss : { *(.sbss) *(.scommon) }.bss :{*(.dynbss)*(.bss). = ALIGN(32);*(.bss.align32). = ALIGN(64);*(.bss.align64). = ALIGN(128);*(.bss.align128). = ALIGN(4096);*(.bss.align4096)*(COMMON)}_end = . ;PROVIDE (end = .);.stab 0 : { *(.stab) }.stabstr 0 : { *(.stabstr) }.debug 0 : { *(.debug) }.debug_srcinfo 0 : { *(.debug_srcinfo) }.debug_aranges 0 : { *(.debug_aranges) }.debug_pubnames 0 : { *(.debug_pubnames) }.debug_sfnames 0 : { *(.debug_sfnames) }.line 0 : { *(.line) }.gptab.sdata : { *(.gptab.data) *(.gptab.sdata) }.gptab.sbss : { *(.gptab.bss) *(.gptab.sbss) }
}

         5._start的定义

                最后在编译pmon的时候,会将start.o编译成start.s文件,可以将PMON编译信息存到一个文件中,查看编译信息,在这里就不展示了

最后在pmon-loongson3/Target/LS2K/ls2k文件夹下,可以看到生成的start.s文件内对_start的定义

 

        

        


http://chatgpt.dhexx.cn/article/ctI1wyah.shtml

相关文章

PMON分析(1)- ROM阶段

PMON的运行过程分为两个阶段:第一阶段是在ROM FLASH中运行,主要进行基本硬件初始化,如:初始化核的一些配置寄存器,其中包括cpu状态和原因寄存器、pcie的配置寄存器、GPIO、sata、cache、tlb、内存控制器和串口初始化等…

【基础知识】Oracle核心进程(PMON、SMON、DBWn、LGWR、CKPT)

本文主要总结的是五个核心后台进程(PMON、SMON、CKPT、DBWn、LGWR),理解这些进程的概念是Oracle学习的内功,是TroubleShooting和优化的基础,以下内容参考了Oracle编程艺术、官方文档Concept、OCP考试指南及行业大牛的总…

pmon下常用命令

pmon下常用命令 在进入系统前按 “c” 进入pmon的命令行。如设置自器动的话(pmon自动加载内核、启动文件系统),需要设置环境变量 a l / al/ al/al1、$append。 1、帮助命令 h 有两种使用方式: ① h 查看所有命令 ② h xxx 查…

PMON环境配置(龙芯,亲测成功1)

1.前言 2.运行平台 3.依赖组件 4.安装与配置安装专用GCC编译器 4.1下载GCC编译器 4.2解压GCC编译器 4.3配置系统运行 5.编译龙芯PMON执行文件 5.1下载PMON源码 5.2 编译并配置git tools插件 5.3编译gzrom…

PMON简介

最近在学习Sylix OS,将系统运行至龙芯开发板时候需要用到PMON,记录一下几种下载方式 目录 一.PMON启动过程 二.PMON命令介绍 1.load 命令 tftp 启动 USB 手动启动 硬盘手动启动 硬盘自动启动 2.reboot 命令 3.date 命令 4.ifconfig 命令 5.ping 命令 6.s…

Java多线程游戏仿真实例分享

这是一篇学习分享博客,这篇博客将会介绍以下几项内容: 1、如何让一个程序同时做多件事?(多线程的创建、多线程的应用) 2、如何让小球在画面中真实地动起来?(赋予小球匀速直线、自由落体、上抛等…

算法工程 # 深度学习算法落地最后一公里:工业界中的大规模向量检索

前言:现代深度学习实践中很多场景其实都是对输入数据进行处理、嵌入,最终获得一个 embedding,然后对 embedding 进行相似度检索,而工业界中的被检索数据往往是海量的,因此深度学习模型落地的最后一步也就是大规模向量检…

向量检索-faiss检索

一、语义相似检索背景 1、为什么引入语义相似检索(向量检索) 问题引出: 搜索引擎和搜索广告最难解决的问题是语义相似度 具体体现:召回和排序。 Case1: 如"从北京到上海的机票"与"携程网"的相似性 Case2"快递软件"与&q…

ModaHub魔搭社区:向量数据库Milvus性能优化问题(三)

目录 Milvus 的导入性能如何? 边插入边搜索会影响搜索速度吗? 批量搜索时,用多线程的收益大吗? 为什么同样的数据量,用 GPU 查询比 CPU 查询慢? Milvus 的导入性能如何? 客户端和服务端在同一台物理机上时,10 万条 128 维的向量导入需要约 0.8 秒(基于 SSD 磁盘)…

Shader 优化相关资料整理

什么是渲染管线 注: 应用程序阶段:主要是CPU与内存打交道,例如碰撞检测,计算好的数据(顶点坐标、法向量、纹理坐标、纹理)就会通过数据总线传给图形硬件 。 几何阶段:其实上图有个问题&#xff…

pthread多线程入门-并行计算高维向量

介绍pthread ​ pthread其实也可以当作C/C的一个库&#xff0c;所有的函数和数据类型都在<pthread.h>中&#xff0e;跟AVX一样&#xff0c;如果使用了pthread&#xff0c;在编译的时候必须加上编译参数-lpthread&#xff0e;使用gcc编译指令如下&#xff1a; gcc filen…

Unity项目优化详解(持续补充ing)

Unity开发项目总结的几项优化点&#xff0c;比较适合中小项目优化&#xff0c;拿来即用&#xff0c;大型项目需要考虑定制化渲染管线、剔除、光照等。针对优化更多的还是需要结合项目去考虑。 一、模型 Read/Write&#xff1a;同Texture&#xff0c;若开启&#xff0c;Unity会…

SQL查询优化原理与向量化执行引擎

文章目录 1.SQL查询优化的目的2.SQL 查询优化的基本原理之研究如何通过关系代数优化执行方案3.总结使用关系代数进行查询优化的要点4.SQL 查询优化的基础算法5.Volcano Optimizer6.自底向上 vs. 自顶向下7.广度优先搜索与启发式算法8. 向量化执行引擎 1.SQL查询优化的目的 本文…

SQL优化之火山模型、向量化、编译执行

文章目录 1.当代CPU特性2.查询执行模型3.向量化VS编译执行4.编译执行融合向量化5.优化方向 1.当代CPU特性 向量化执行和编译执行是目前主流的两种数据库执行引擎优化手段。 了解CPU特性可以让我们真正理解各种数据库执行引擎优化技术的动机。 影响数据库执行引擎执行效率的C…

UE4性能优化

UE4性能优化 参考文档&#xff1a;UE4性能优化GPU分析**CPU分析**一些相关工具 Time: 2021年10月19日16:46:22 Desc: UE4性能优化 参考文档&#xff1a; https://docs.unrealengine.com/4.27/zh-CN/TestingAndOptimization/PerformanceAndProfiling/https://blog.csdn.net/u01…

一文纵览向量检索

摘要&#xff1a;本文针对向量检索要解决的问题&#xff0c;梳理了主流向量检索相关的技术&#xff0c;分析了向量检索目前的一个趋势。 什么是向量检索 首先我们了解下什么是向量&#xff0c;所谓向量就是由n个数字&#xff08;二值向量由n个比特组成&#xff09;组成的数组&…

C/C++编译器并行优化技术:并行优化针对多核处理器和多线程环境进行优化,以提高程序的并行度

目录标题 引言数据并行&#xff1a;将数据集分割成多个子集&#xff0c;分配给多个线程或处理器并行处理。延迟执行与乱序执行&#xff1a;对指令的执行顺序进行调整&#xff0c;提高指令流水线的利用率和性能。延迟执行乱序执行 任务并行&#xff1a;将程序分解为多个独立的任…

离散与提炼——一些关于向量召回算法优化方法的思考

✏️ 作者介绍&#xff1a; 周语馨&#xff0c;高级云智能工程师 最近做的很多向量召回的相关工作&#xff0c;主要集中在优化 Faiss 里面常用的几个算法&#xff0c;包括 IVFFlat 和 IVFPQ&#xff0c;并且针对这两个算法都做出了专门的优化。 前一阵子灵光乍现&#xff0c;想…

java手动回收线程_性能优化:线程资源回收

本文来自: PerfMa技术社区 PerfMa(笨马网络)官网 一、问题 模型服务平台的排序请求出现较多超时情况&#xff0c;且不定时伴随空指针异常。 二、问题发生前后的改动 召回引擎扩大了召回量&#xff0c;导致排序请求的item数量增加了。 三、出问题的模型 基于XGBoost预测的全排序…

编译优化之 - 向量化优化入门

1. 介绍 2. Intel高级向量扩展 3. GCC中向量化 4. ICC中向量化 5. AOCC/LLVM中向量化 1. 介绍 什么是自动向量化&#xff1f; 自动向量化&#xff08;automatic vectorization&#xff09;是自动并行化&#xff08;automatic parallelization&#xff09;的一种特殊情况&#…