龙芯嵌入式开发学习路线之一:pmon学习

pmon 是 cpu 上电后执行的代码,相当于 x86PC 机中的 BIOS,兼有 bootloader的功能,代码来源于早期BSD 的内核,到如今已旧貌换新颜,糟蹋得差不多了。

pmon 的二进制代码存放于主板上的一块 512KB 的 flash 芯片上,选择这个容量是因为够用了,龙芯 2F 允许的最大 boot rom 容量是 1MB。

这块 flash 芯片的地址是确定的,虚拟地址 0xbfc00000,物理地址 0x1fc00000。

cpu 上电后,会在第一时刻从虚拟地址为 0xbfc00000 的读取指令执行,这个和

x86 的 cpu 是一样的,差别的只是地址。

地址差别的一方面是地址值,另一方面是地址类型。

x86 有实模式和保护模式的区别,上电初期为实模式,地址就是物理地址。MIPS 没有这两种模式的区别,而且一开始就是虚拟地址。虚拟地址是虚的,所以必定需要映射到物理地址。

下面介绍一下 pmon 文件相关的地址问题。

cpu 眼中的地址是虚拟地址,cpu 取指和取数据的地址是物理地址(经过北桥解释后的地址是总线地址),编译器产生的地址(包括解析了所有引用和重定位的符号后)为程序地址,也就是程序它自己理解的地址。不同的地址概念间需要有映射函数来关联。

mips 的虚拟地址到物理地址的映射比x86 要复杂一些(也更有用些),既有可供页表之类动态建立映射函数的机制,也有 unmapped cacheed/uncached 这种固定映射关系的转换方式。bios 代码由于其执行时机的限制,开始阶段只能使用unmapped uncached 这个段。地址范围是 0xa0000000~0xc0000000,也就是 2.5G 到 3G 的 512MB 空间。这个范围的映射函数为物理地址=程序地址-2.5G。所有的 32 位 mips 架构的 cpu 都遵循这个约定。

pmon的代码绝大部分是用C写的,只有个别的体系结构相关的代码使用了汇编。

你可能感兴趣的:(龙芯嵌入式开发学习路线之一:pmon学习)