这几天一直在纠结于系统启动,bootloader的功能等等,没有系统学过所以总是想不明白,也没有系统的文章,总是对一些细节困惑。最近又被分配了应用程序的任务,担心以后再也没机会看驱动这边的东西了...
今天看了一下mmu相关的,都是嵌入式系统的,pc可能有很大不同
mmu,硬件设备(似乎也有软件实现?),实现虚拟地址到物理地址映射,cpu的指令都是在虚拟地址上执行的(这么说似乎也不准确),或许该说是在没有mmu的时候,cpu的地址是虚拟地址同时也是物理地址(因为没有去映射,直接输出到地址线上了),mmu可以当坐中间的翻译,系统上电后,cpu自然要从某一处读指令,那么我们要做的就是把初始化系统的代码(请允许我叫他bootloader)放在那,
这时候其他外设都(或许有的可以?)驱动不了(cpu不会),cpu的一些工作状态也不一定是我们想要的(寄存器的值),那么放在这的代码就要设置一下cpu的参数(比如关中断),也可以检测一下硬件什么的,比如往某个地址写个什么,但是终极目标是加载OS,驱动周边设备供应用工作
关于这个放指令的地方,一般(从来都是)放在rom里,flash、eeprom什么的,这里速度比较慢,运行个bootloader可以(汇编),程序还是要放到ram上(c语言还要堆栈的,不像汇编不要动态内存,堆栈的sp也要往哪分),比如sdram什么的,嵌入式的话就是知道从rom里拷到ram里了,这里你要知道放到哪,那么你就又要知道这个系统硬件怎么连的,ram规格什么样的才能知道物理地址,要不然cpu不知道给你放到哪,放完了跳过去启动就行了,跳过去的方法还是设置一下寄存器什么的
这里有个问题就是不同设备物理地址连的不一样(一般来说很多时候都是不连续的甚至),那么操作系统控制起来就有点麻烦了,每个设备都要重新设置寄存器地址啊,系统和程序分配的地址啊什么的,而且很可能某个应用申请不到连续的地址,用指针加加减减的很麻烦
于是诞生了mmu,在bootloader里配置好(似乎一般来说?),他把所有的物理地址按你的要求映射的虚拟地址,不连续的连续了,不统一的统一了(需要根据不同的设备编写不同的bootloader,但是这似乎比编写写操作系统轻松),需要说明的是mmu配置了一个寄存器存放的地址映射的表格的物理地址基址,开启mmu以后的cpu指令都会根据那个表格翻译了。
操作系统回对虚拟地址设置访问权限,有的只能操作系统涂改,有的分给用户,用户的程序不能随便改操作系统的的虚拟内存范围(这其中就有cpu寄存器之类的),但是cpu也提供了修改它们的接口,这其实是防止意外发生啦,比如你的指针乱指。
再来想想现在的dta的启动,看看能想通多少。
1、内置rom的启动程序(或许也叫bootloader)启动flash里的bootloader,起始地址0xbfe00000(物理地址哦,ps:还可以设置是否效验什么的。。);
2、flash的bootloader读取某处的配置信息,获得应用程序的在flash中的物理地址,然后把应用程序拷到ram里,然后跳过去跑应用,入口应该是个操作系统入口吧
接下来就是我根据各种网上资料对我现在看得这个bootloader的yy
该bootloader的确分两步,但是不知道这两部分别干什么暂时假设:
第一步设置一下cpu、内存控制器什么的寄存器,算是最初始的初始化,gpio引脚点亮一个led说明一下,然后把stage2的文件找个ram的地方展开,运行stage2
第二部也就是stage2,初始化串口(关于串口我实在有几千字的吐槽不提)供调试以及输出信息什么的(似乎嵌入式全部提供串口,而且都会从串口接收发送数据之类的,难道是因为串口驱动起来很简单?),再玩一下led,这时候可以找一下哪些物理地址可以用,不过这里这个嵌入式系统似乎哪些可以用都是之前就定好了的?然后就按之前说的从“定好的”地方(flash某处)读取配置信息,挑一个程序映像,并挑一个ram位置作为目的地拷过去,然后启动那个程序!
那个程序一般来说是个操作系统了,他会建几个任务运行什么的
不过很令我沮丧的是我看的关于bootloader的文章表示不要再os启动前开启mmu。。。关于os和bl实在还有很懂地方不懂啊,不知道14号前这个应用搞得出来不。。
不知道各位看这块的时候,是不是也有同感啊。
-
嵌入式系统
+关注
关注
41文章
3555浏览量
129151 -
bootloader
+关注
关注
2文章
234浏览量
45518 -
MMU
+关注
关注
0文章
91浏览量
18253
原文标题:嵌入式er日常!最近一直纠结于MMU,bootloader,dta....
文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论