参考链接:
看你会多少 记一次嵌入式底层面试
一、请问uboot启动过程都做了些什么?
1、cpu刚开始初始化的时候,还未设置栈,所以先使用汇编代码,构建异常项链表,然后设置cpu为svc(特权)模式,同时关闭FIQ和IRQ(防止突发中断程序跑飞了)
注:在跳转到内核之前,要满足CPU出在SVC模式下。
2、对cp15协处理器进行设置,这里主要是关闭MMU和cache
3、进入到板级初始化阶段,这里会进行时钟、内存、串口的初始化。最后还要关闭看门狗。
4、接下来就是设置栈,为c语言准备运行环境,调用board_init_f,填充gd结构体。
5、对代码重定位,搬运到内存中去,搬运之后,跳转到内存中去执行board_init_r,这里就可以开启cache了,当然也可以不开启。然后初始化其他设备。比如flash、网卡、emmc等。初始化完之后,在执行main_loop
二、为什么uboot要关掉cache?
uboot要关掉cache
根据cache的定位可以看出来,它是用来加快cpu从内存中取出指令的速度,但我们都知道,在设备上电之初,我们的内存初始化比较慢一拍,当cpu初始化了,但内存还没准备好之后,就对内存进行数据读,那么势必会造成了指令取址异常,系统就会挂了。所以,在u-boot的上电之初,就得关闭掉数据cache,指令的cache关闭与不关闭没有太大的关系。
注:Dcache只能在MMU开启之后使用,因为没有MMU就没法完成虚实地址映射,也就不能索引Dcache了。
三、nandflash和norflash的区别,对norflash的操作方式的理解?
两种芯片的结构不同 NORflash之所以可以片内执行,就是因为他符合CPU去指令译码执行的要求。CPU送一个地址出来,NORflash就能给一个数据让CPU执行,中间不需要额外的处理操作。
NAND flash不一样是因为nandflash有地址,数据,命令共用IO口的问题,cpu把地址发出来之后,并不能直接得到数据,还需要控制线的操作才能完成。就是他没有专用的SRAM接口。
嵌入式系统中代码的执行方式主要有3种:
完全映射、按需分页、Xecute In Place (XIP)片上执行。
参考链接:http://blog.chinaunix.net/uid-27411029-id-3405543.html
1)XIP(Execute-In-Place)——就地执行
操作系统内核直接在非易失性存储器中运行,不需要拷贝到RAM。这样减少了内核从闪速存储器拷贝到RAM的时间,也减少了内核自解压的时间。就当前的技术来说,这里的非易失性存储器特指NOR型Flash。
不过,Flash的存储器访问周期要比RAM大得多,会降低程序的运行速度,但由于CPU的指令预取机制以及Cache机制,实际使用起来并不会明显降低应用程序的运行速度。
操作系统内核和应用程序在运行时,它在内存中的映像可以分为三个部分:代码段、数据段和堆栈段。代码(Text Section)包括运行代码和只读数据,一般为只读。数据段(Data Section和BSS Section),存放各种数据(经过初始化的和未经初始化的)和静态变量,而堆栈段存放函数调用和局部变量。从以上分析可知,程序运行时在内存的映像分 为两类:一类是只读的,如代码段;另一类是可写的,如数据段。而Flash虽然是可写的,但并不能像写普通RAM一样进行。因此,当程序在Flash中运 行时,我们仍然需要把部分可写的数据段放在RAM中。因而,采用XIP技术的同时,根据硬件环境对闪速存储器和RAM使用量进行平衡。
应用场景:经常用于ARM、DSP系统中。一个NOR FLASH做代码存储器,外加一些SRAM或者SDRAM作为数据存储器。NAND不适合做代码闪存,原因在于NAND闪存读取速度慢。其实51单片机的 运行机制也和XIP有着异曲同工之妙:单片机内部自带了ROM和RAM,它的代码是从ROM里运行,数据变量大多在RAM上存储。
2)Fully Shadowed——完全映射
嵌入式系统程序运行时,将所有的代码从非易失存储器(Flash、ROM等)复制到RAM中 运行。这种应用也蛮多的,它的好处在于充分依托于RAM在运行代码时速度上的优势,而它的劣势在于需要的RAM存储空间比FLASH的存储空间(代码大 小)还要大。此外,这种启动方式在上电后还必须等待一段时间,直到数据装载完成才能正常运行代码,而代码越大,这个等待时间也会越长。
3)Demand Paging——按需分页
它在代码运行时只复制部分代码到RAM中。这种方法对RAM中的页进行导入/导出管理,如果 访问位于虚存中但不在物理RAM中会产生页错误,这时才将代码和数据映射到RAM中。之所以提出按需分页的代码运行方式,这里打一个简单的比方,我们手头 的PC机,在装好XP操作系统后至少也应该有3GB的存储空间,再加上随便装一些应用程序,4-5个GB那算小的了。如果在每次开机时PC机要把这些代码 都从硬盘预载入内存中,那么我估计咱们的PC机都跑不起来。
所以,按需分页解决了上述问题,它在PC机启动时只装载部分最频繁使用的代码到内存中。而其他应用程序只在用户希望运行时才进行实在装载,这个装载过程就是用户能够感受到的延时。它相比于完全映射方式大大减少了RAM的存储空间。
来源:CSDN
作者:冷眼旁观之气
链接:https://blog.csdn.net/u012944254/article/details/104005010