如何开始你的电脑?为什么系统的任何时间后,电脑处于关机状态,然后走。时间不会偏向系统后很短的时间启动您的计算机?机是怎样实现的?为什么电脑操作系统比手机占用很多其它的内存?为什么电脑没有採用运算速度更快的哈佛结构,一如既往的採用冯诺依曼机构?……近期接触到一些嵌入式linix系统中的裸机程序,对它的运行过程引发了很多思考。

       对于BIOS大家都不陌生。最经常使用的功能是在装系统时配置启动项,是从U盘启动还是硬盘启动还是其它。事实上BIOS功能远不止这些。它包括着系统的基本信息设定。上电自检,系统启动项等内容,一个有意思的设定是它能够改变电脑开机的方式。如按键盘随意键开机。鼠标点击开机,定时自启等,假设主板与网卡支持。还能够设计远程开机。

       难以想象,未来的家用电器假设配置了远程网络功能。能够实现开关机的话,下班乘公交车的时候用手机打开家里的电饭锅,回到家就能够直接享受刚出锅的晚餐了。

了解了BIOS就行对电脑从按下电源键開始到桌面化系统启动这段时间都发生了什么,以下从嵌入式系统的boot loader 工作过程简单理解一个处理器是怎样启动的(它与BIOS的工作原理惊人的相似)。

简单介绍


了解这些首先要理解一些相关概念。

一个系统的组成包含软件系统和硬件系统。




                          系统开始了解--感兴趣的文章_系统启动


         为什么嵌入式採用的Linix操作系统要比PC机採用的Windows操作系统在内存上小出那么多?事实上,不管是哪一个系统都是由内核与接口程序,驱动程序(驱动硬件操作),它是操作系统的基础。像如今的手机操作系统都是通过改编开放的Linix系统内核加上必要的接口程序驱动程序得到的。

嵌入式所要求的操作系统功能并非非常全面,它往往是针对某一个详细的功能而设计的。则系统并不须要增加全部的驱动程序,以够用为原则。而Windows操作系统为适应不同的CPU,主板等不同硬件的须要,并且要实现多功能操作。势必引入的接口,驱动程序要多出非常多了。

       Boot loader与BIOS的功能相似,是一段占用4k的启动代码,它最初存在于Norflash中(就像电脑硬盘)。

       Norflash与Nandflash都是一种存储介质。Norflash比Nandflash存储容量小。訪问速度快。

       哈佛结构与冯诺依曼结构对照,冯诺依曼结构仅仅有在上一条指令运行完毕后才干运行下一条。依次顺序运行,哈佛结构在运行第一条指令的译码工作时,第二条指令就能够同步运行取指令操作了。电脑採用但因为电脑的晶振比手机大的多,所以并没有感觉电脑比手机慢。

                                         系统开始了解--感兴趣的文章_数据_02

                        系统开始了解--感兴趣的文章_数据_03

工作

      在2410中存在一块SRAM(相当于CPU中存在一块4k内存。存放运行数据),boot loader从Nandflash中读出boot loader到SDRAM中。然后送回到2410处理器中处理数据(由于内存中的SRAM仅仅有4k相当小,假设是小程序直接烧写到这里可直接运行)。

    系统开始了解--感兴趣的文章_ios_04

        Bootloader中含有一组启动的代码init.s(用汇编编写为.s文件。但往往启动代码是由汇编与c语言混合编写的)它的详细流程例如以下:

 系统开始了解--感兴趣的文章_数据_05

1.      关闭看门狗。程序一旦開始运行,看门狗定时器就開始计时。假设一个程序一段时间后不给定时器一个信号的话,看门狗数据溢出,自己主动复位。

2.      中断是硬件运行的基本操作。程序运行过程中收到外来打搅就会响应中断运行外部程序。

3.      时钟为全部的工作提供一个统一的信号,就像运动员在喊口令一样,保持协调一致,仅仅有这样才不会造成各个程序之间的混乱

4.      RAM存储器在断电后都会清空

5.      波特率是串口的传输速率,电脑主机接显示屏的线就是一个串口线。校验位负责检验是否系统启动是否出错。寄存器负责记录当前工作状态的地址,暂存待处理数据等功能。

6.      设置堆栈指针,指针主要应对c程序。例如说程序在開始启动时运行汇编指令,突然接到中断后转到其它地址去运行指令。此时的地址要保存到堆栈中保护起来,等到中断运行完成,又返回来运行现有程序,必需要从堆栈中获取当前地址。

总结


        对照软件编程与驱动硬件的编程,其语法结构都是一样的。无外乎顺序,选择。循环结构。

但基于硬件的编程必需要考虑到硬件寄存器port地址,每个处理器中的寄存器地址都代表着不同的地址,造成程序编写过程中必需要查表才干对实现详细的操作。

而软件中的每个控件都是由自己命名的,大大简化了操作过程。


       对机器运行程序的理解:最初的计算机语言都是机器语言,用到的都是0和1。难以记忆。后逐渐发展的汇编,高级语言被大众所接受。经过专门的编译器编译生成二进制文件。

在运行过程中调入内存中,每个内存单元都有一个特定的地址。CPU通过寻址的方式发现这些被编译的0和1被电脑所识别,运行。


       就好比驱动程序,假设不是专门的驱动程序师编译出来的驱动往往都是不稳定的。仅仅有清晰的理解了内部架构才干编写出出色的硬件程序,这应该就是硬件编程困难的原因吧。


(如有错误,还望大神前来扶正)