可以参考讯为电子的PMON学习视频:

https://www.bilibili.com/video/BV13M4y1P7H8?p=8&vd_source=7758aca909f593c8652fba5b3a94211dhttps://www.bilibili.com/video/BV13M4y1P7H8?p=8&vd_source=7758aca909f593c8652fba5b3a94211d

1.通用寄存器:

$0:即$zero ,该寄存器总是返回零,为0这个有用常数提供了一个简洁的编码形式。
           move $t0,$t1
       实际为
           add $t0,$0,$t1
       使用伪指令可以简化任务,汇编程序提供了比硬件更丰富的指令集。
$1:即$at,该寄存器为汇编保留 ,由于I型指令的立即数字段只有16位,在加载大常数时,编译器或汇编程序需要
       把大常数拆开,然后重新组合到寄存器里。比如加载一个32位立即数需要 lui(装入高位立即数)和addi两条
       指令。像MIPS程序拆散和重装大常数由汇编程序来完成,汇编程序必需一个临时寄存器来重组大常数,这
       也是为汇编 保留$at的原因之一。
$2..$3:($v0-$v1)用于子程序的非浮点结果或返回值, 对于子程序如何传递参数及如何返回,MIPS范围有一套约
       定,堆栈中少数几个位置处的内容装入CPU寄存器,其相应内存位置保留未做定义,当这两个寄存器不够存
       放返回值时,编译器通过内存来完成。
$4..$7:($a0-$a3)用来传递前四个参数给子程序,不够的用堆栈 。 a0-a3和v0-v1以及ra一起 来支持子程序/过程
       调用,分别用以传递参数,返回结果和存放返回地址。当需要使用更多的寄存器时,就需要堆栈(stack)
       了,MIPS编译器总是为参数在堆栈中留有空间以防有参数需要存储。
$8..$15:($t0-$t7)临时寄存器, 子程序可以使用它们而不用保留。
$16..$23:($s0-$s7)保存寄存器,在过程调用过程中需要保 留(被调用者保存和恢复,还包括 $fp和$ra ),MIPS
       提供了临时寄存器和保存寄存器,这样就减少了寄存器溢出(spilling,即将不常用的变量放到存储器的过程),
       编译器在编译一个叶(leaf)过程(不调用其它过程的过程)的时候,总是在临时寄存器分配完了才使用需要
       保存的寄存器。
$24..$25:($t8-$t9)同($t0-$t7)
$26..$27:($k0,$k1)为操作系统/异常处理保留,至少要预留一个 。 异常(或中断)是一种不需要在程序中显示
       调用的过程。MIPS有个叫异常程序计数器(exception program counter,EPC)的寄存器,属于CP0寄存器,

用于保存造成异常的那条指令的地址。查看控制寄存器的唯一方法是把它复制到通用寄存器里,指令mfc0
       (move from system control)可以将EPC中的地址复制到某个通用寄存器中,通过跳转语句(jr),程序可以返
       回到造成异常的那条指令处继续执行。MIPS程序员都必须保留两个寄存器$k0和$k1,供操作系统使用。

发生异常时,这两个寄存器的值不会被恢复,编译器也不使用k0和k1, 异常处理函数可以将返回地址放到这
       两个中的任何一个,然后使用jr跳转到造成异常的指令处继续执行 。
$28:($gp) 为了简化静态数据的访问,MIPS软件保留了一个寄存器:全局指针gp(global pointer,$gp),全局指针
       只想静态数据区中的运行时决定的地址,在存取位于gp值上下32KB范围内的数据时,只需要一条以gp为基
       指针的指令即可。在编译时,数据须在以gp为基指针的64KB范围内。
$29:($sp)MIPS硬件并不直接支持堆栈 ,你可以把它用于别的目的,但为了使用别人的程序或让别人使用你的程
       序, 还是要遵守这个约定的,但这和硬件没有关系。
$ 30:($fp)GNU MIPS C编译器使用了帧指针(frame pointer), 而SGI的C编译器没有使用, 而把这个寄存器当作保
       存寄存器使用($s8), 这节省了调用和返回开销,但增加了代码生成的复杂性。
$31:($ra)存放返回地址, MIPS有个jal(jump-and-link,跳转并 链接)指令,在跳转到某个地址时,把下一条指令的
       地址放到$ra中。用于支持子程序,例如调用程序把参数放到$a0~$a3,然后jal X跳到X过程,被调过程完成后

把结果放到$v0,$v1,然后使用jr $ra返回。

2.MIPS运行模式:

主要是两种运行模式:用户模式和核心模式

3.MIPS处理器地址映射

MIPS32将虚拟地址空间划分为4个区域:

  • kuseg 0x0000.0000 - 0x7FFF.FFFF(低2GB)

这些地址是用户态可用的地址。对于有MMU的机器,这些地址需要经过MMU(TLB)的转换后才可以使用;对于没有MMU的机器,这些地址的行为与具体机器实现相关。

  • kseg0 0x8000.0000 - 0x9FFF.FFFF(512MB):

这段地址只需将最高位清零即转换为物理地址,映射到连续的低端512MB物理地址上,因此在描述其属性时一般称为unmapped。另外该段地址访问时总是需要通过cache,因此描述其属性时称为cached。在一般应用上,这段地址映射到的物理地址用于存放程序和数据或者操作系统核心。

  • kseg1 0xA000.0000 - 0xBFFF.FFFF(512MB):

与kseg0类似,这段地址同样映射到了低端512MB物理地址(将高3个bit清零),但其访问不经过cache,因此其属性可以称为 unmapped/uncached。由于unmaped/uncached特性,这段地址无需配置TLB和cache即可使用,是唯一的在系统重启时能 正常工作的地址空间,因此复位入口点(0xBFC0.0000)被放在这个区域,其物理地址为0x1FC0.0000。

  • kseg2 0xC000.0000 - 0xFFFF.FFFF(1GB):

该段地址只能在核心态下使用且需要经过MMU(TLB)转换。

PMON学习记录3:PMON启动流程相关推荐

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

    PMON启动流程分析 B站有讯为电子的详细介绍视频,连接如下,十分推荐第一次学的看一下https://www.bilibili.com/video/BV13M4y1P7H8?p=7&vd_so ...

  2. IMX6ULL学习笔记(四) —— uboot 启动流程

    IMX6ULL 学习笔记 version : v1.0 「2023.4.27」 author: Y.Z.T. 摘要: 随记, 记录 I.MX6ULL 系列 SOC 的uboot 启动流程 ⭐️ 目录 ...

  3. W801单片机学习笔记——SDK的启动流程,例程使用

    目录 1.前言 2.SDK的启动流程 3.挖坑 1.前言 W801的SDK需要配套的CDK集成开发环境进行开发,该SDK具有W801单片机所有硬件的驱动程序,FreeRTOS操作系统,基于蓝牙和WiF ...

  4. Linux驱动学习——exynos4412介绍及启动流程

    1 exynos4412芯片介绍 1.1 芯片手册 参考<Exynos 4412 SCP_Users Manual_Ver.0.10.00_Preliminary0.pdf> 1.2 核心 ...

  5. flask源码学习-helloworld与本地启动流程

    Flask源码分析 本文环境python3.5.2,flask-1.0.2. Flask的初探 首先,在项目文件夹下建立flask_run.py文件,然后写入如下, from flask import ...

  6. 【Android 源码学习】系统架构和启动流程

    Android 源码学习 系统架构和启动流程 望舒课堂 学习记录整理.以及以下参考文章的整理汇总.便于我个人的学习记录. 感谢IngresGe,Gityuan的精彩文章.为我们这些初探android系 ...

  7. 从MDK分散加载文件学习STM32启动流程

    一直在用ARM的Cortex-M系列做产品开发,也陆陆续续学习了ARM的启动流程.汇编启动文件,但是总感觉没有连贯的把全部知识串起来,不知道某些汇编语句为什么要这么写,没法按照自己的情况进行修改.今天 ...

  8. Android系统 lk启动流程简析

    本篇文章是对初步学习Android系统lk启动流程的一个大致简介.方便掌握lk启动流程的大致框架,具体细节后续再进行更新 1. 前言 需要了解的文件类型: 1)编译LK的链接文件(.ld) 2)汇编文 ...

  9. Launcher启动流程及初始化

    前言 前面我们学习了SystemServer的启动流程,也了解了AMS是如何启动起来并通过Binder注册到ServiceManger内的,OK,本文基于这俩篇基础继续来学习Launcher. Lau ...

最新文章

  1. python中adb连接手机_Python脚本利用adb进行手机控制的方法
  2. SharePoint2010是个什么东西
  3. 如何在国内跑Kubernetes的minikube
  4. ThreadGroup其实比ExecutorService更好
  5. JS实现全选、反选、不选
  6. linux 自动保存网页,Linux 定时备份网站数据至七牛云存储
  7. NgRx 和 Angular CLI 版本不一致的错误
  8. Linux的追逐,Windows的穷途恼指日可待
  9. SQL 语句 - Select(1): 指定表
  10. Django单元测试
  11. 模式匹配算法----KMP算法以及next数组的解法
  12. 大数——二进制转换(hdu2051)
  13. GPS时间服务器在电力监控系统中的应用方案
  14. 网易java笔试题_网易笔试题详细解答(Java)
  15. Express の 文件下载
  16. 这些你曾深信不疑的大众心理学观点,都是谬论!
  17. JPEG文件中的EXIF(上)
  18. pythonwhile循环语句_Python While循环语句
  19. 三菱FX系列PLC以太网连接力控ForceControl
  20. 阅读 | 皮囊与灵魂

热门文章

  1. 【EDA365电子论坛】RISC-V 能否超越 x86、Arm,成为新一代计算机系统架构?
  2. Mybatis 时间日期格式转换
  3. qt plugin metadata file does not exist解决方案
  4. 成熟的J2EE框架应该具体的功能
  5. 用python批量下载modis数据的速度怎么样_批量下载MODIS数据
  6. 计算机职业价值观测评报告,关于职业价值观测评报告
  7. python小说爬虫实训报告_1.2Python网络爬虫实践(1)爬取89文学网小说
  8. Photoshop CS6 实例之用通道抠取人像
  9. 【渝粤题库】陕西师范大学164215 电子商务概论 作业(专升本)
  10. 51单片机基础入门(2)点灯大师:单个LED点亮、多个LED点亮、流水灯(附程序代码、解析)