软件开发与易传描述的卦辞,有异曲同工之处,现在种类繁杂的编程语言、开发框架,好比六十四卦,追根追溯,终究会回归到最初的形意图;软件开发而言,这种开发语言、框架,也就最终就会回归到操作系统。所以有了操作系统连载篇章,记录自己学习操作系统的历程。
首先来了解哪些是操作系统:"操作系统就是一个运行于硬件上的特殊软件!"
PC计算机系统
上图为现代计算机系统构架,可以看见,操作系统坐落硬件层、BIOS之上,简而言之,也就是一个软件,这个软件管理着硬件资源、软件资源。用户软件经过编译软件编译后arm linux内核启动流程,运行于操作系统上,操作系统对其进行管理、调度等统筹工作。
--BIOS是啥玩意儿?
在上图中,操作系统与硬件层之间,有一个BIOS的东西,这么BIOS是啥?我们晓得,操作系统是软件,软件是不能直接单刀直入的运行于硬件之上,而须要利用其他力量,而BIOS(输入输出系统)饰演的就是这个角色,在我们开机时出现的黑色操作界面,就是BIOS运行的疗效,如下:
BIOS操作界面供我们选择从那里启动操作系统,假如重装操作系统或则装了双系统的同学,就是会见到会让选择从那里启动操作系统(硬碟、USB等),BIOS是直接固化在硬件中的固件,出厂时早已烧录完成,不可修改,假如一台笔记本的BIOS坏了,这么这台笔记本也就寿终正寝了。BIOS作用是操作系统与硬件层的桥梁,开机时拉起操作系统。
--操作系统启动流程
以上了解了BIOS,如今来了解笔记本怎样从开机一步步步入到漂亮的操作系统界面的。
在上图中,可以看见现代操作系统的启动流程,BIOS的工作使命就是硬件初始化、建立中断向量表,之后加载主引导程序,主引导程序一旦开始执行,BIOS的任务可以说结束了,主引导程序同样会进行一系列的初始化工作,最终加载运行操作系统内核,然后便是操作系统初始化,之后就步入操作系统了。这儿我把流程分为三大块:
开机手动执行BIOS-->拉起主引导程序-->拉起操作系统内核-->操作系统自此可以自嗨
疑惑一、如何开机手动执行BIOS?
BIOS既然是固件,这么就肯定存在硬件某个地址处,这个地址就是0XFFFF0,也就是执行BIOS的入口地址,硬件的特殊设计,致使CPU在开机时手动从0XFFFF0地址开始执行,也就解答了为何开机就手动执行BIOS。
疑惑二、BIOS怎样拉起主引导程序执行?
上面说了,BIOS操作界面会选择哪些介质启动操作系统,在选择具体的启动介质后,将启动介质中主引导区的主引导程序加载到显存,主引导程序通常坐落主引导区的前512字节,但是主引导程序入口地址固定为0X7C00,拉起主引导程序,也就是跳转到0X7C00地址处执行而已,汇编语言中就是一个jmp指令,从而将控制权交给主引导程序。
疑惑二、如何找寻主引导区?怎样获取主引导程序?
主引导区固定坐落启动介质的开始地址处,大小为512字节,这512字节的内容,就是主引导程序,须要注意的一点是,512字节最后两字节固定为0X55AA
以上说明了系统的启动流程,下面用一张详尽的图来总结:
总结:
1、BIOS是计算机上电后第一个运行的程序
2、BIOS对硬件等进行必要的初始化,并加载运行主引导程序
3、主引导程序坐落启动介质的最开始512字节处,该512字节以0XX5555AA结束
4、主引导程序继续建立初始化工作,并加载运行操作系统内核
嵌入式系统
嵌入式系统与传统的PC一样,也是一种计算机系统,是由硬件和软件组成的。通常而言,典型的嵌入式系统的又可以进一步分成四个部份:嵌入式处理器、嵌入式外围设备、嵌入式操作系统和嵌入式应用软件,如右图所示:
嵌入式处理器
嵌入式处理器是嵌入式系统硬件平台的核心。嵌入式处理器与通用处理器最大的不同点在于,嵌入式CPU大多工作在为特定用户群所专门设计的系统中,它将通用CPU中许多由板卡完成的任务集成到芯片内部,进而有利于嵌入式系统在设计时趋向大型化,同时还具有很高的效率和可靠性。嵌入式处理器的体系结构经历了从CISC(复杂指令集)至RISC(精简指令集)和CompactRISC的转变,位数则由4位、8位、16位、32位逐渐发展到64位。目前常用的嵌入式处理器可分为高端的嵌入式微控制器(MicroControllerUnit,MCU)、中高档的嵌入式微处理器(EmbeddedMicroProcessorUnit,EMPU)、用于计算机通讯领域的嵌入式DSP处理器(EmbeddedDigitalSignalProcessor,EDSP)和高度集成的嵌入式片上系统(SystemOnChip,SOC)。
目前几乎每位半导体制造商都生产嵌入式处理器,而且越来越多的公司开始拥有自主的处理器设计部门,据不完全统计,全世界嵌入式处理器早已超过1000多种,流行的体系结构有30多个系列,其中以ARM、PowerPC、MC68000、MIPS等使用得最为广泛。
嵌入式外围设备
在嵌入系统硬件系统中,不仅中心控制部件(MCU、DSP、EMPU、SOC)以外,用于完成储存、通信、调试、显示等辅助功能的其他部件,事实上都可以算作嵌入式外围设备。外部设备在不同的系统中有不同的选择。诸如,在车辆上,外部设备主要是传感;而在通常手机上,外部设备可以是鼠标、液晶屏幕等。
嵌入式操作系统
嵌入式操作系统是拿来支持嵌入式应用的系统软件,是嵌入式系统极为重要的组成部份,一般包括与硬件相关的底层驱动程序、系统内核、设备驱动插口、通信合同、图形用户界面(GUI)等。嵌入式操作系统具有通用操作系统的基本特性,如才能有效管理复杂的系统资源,就能对硬件进行具象arm linux内核启动流程,才能提供库函数、驱动程序、开发工具集等。但与通用操作系统相比较,嵌入式操作系统在系统实时性、硬件依赖性、软件固化性以及应用专用性等方面,具有愈发鲜明的特征。
嵌入式应用软件
嵌入式应用软件是针对特定应用领域,基于某一固定的硬件平台,拿来达到用户预期目标的计算机软件,因为用户任务可能有时间和精度上的要求,因而有些嵌入式应用软件须要特定嵌入式操作系统的支持。嵌入式应用软件和普通应用软件有一定的区别,它除了要求其确切性、安全性和稳定性等方面才能满足实际应用的须要,但是还要尽可能地进行优化,以降低对系统资源的消耗,减少硬件成本。
ARM处理器
准确地说ARM处理器不是指某种处理器,而是采用ARM体系结构开发的处理器。可以谈谈ARM处理器是目前在嵌入式领域最重要的处理器。目前有数十家公司使用ARM体系结构开发自己的芯片,支持的外部设备和功能丰富多样。
1.3.1ARM处理器介绍
一般人们觉得ARM(AdvancedRISCMachine)是一家公司的名子,也可以觉得是一类处理器的合称,还可以觉得是一种技术的名子。
ARM公司于1991年创立于德国剑桥,是微处理器行业的一家著名企业,自己本身并不生产芯片,而是主要通过转让芯片设计技术的授权获取收益。该企业设计了大量低成本、高性能、低帧率的RISC处理器、相关技术及软件。
目前,采用ARM技术知识产权(IP核)的微处理器,即一般所说的ARM微处理器,已遍布工业控制、消费类电子产品、通信系统、网络系统、无线系统等各种产品市场。基于ARM技术的微处理器应用约抢占了32位RISC微处理器80%以上的市场份额,其中在手机市场,ARM占有绝对的垄断地位。
1.3.2ARM体系结构的发展
体系结构,定义了指令集(ISA)和基于这一体系结构下处理器的编程模型。基于同种体系结构可以有多种处理器,每位处理器性能不同,所面向的应用也就不同,但每位处理器的实现都要遵守同一体系结构。
1983年ARM公司开始ARM的设计,初期的V1结构、V2结构有26位的轮询空间,现已废弃不用。在1980年代晚期的V3结构将轮询范围扩充到32位,是ARM质通常的飞越。后来V4结构不再强制要求与先前的26位体系结构版本兼容,它清楚地指明了那个指令会导致未定义指令异常发生,V4结构堪称是真正地得到了推广,值得一提的是16位指令集Thumb指令集就是在这个版本上创立的。
V5结构在版本4的基础上,对现今指令的定义进行了必要的修正,对版本4体系结构进行了扩充,并降低了指令。V5结构的ARM处理器提高了ARM和Thumb两种指令的交互工作能力,同时有了DSP指令—V5E结构、Java指令—V5J结构的支持。
ARM体系结构版本6是2001年发布的,该版本降低了媒体指令。属于V6体系结构的处理器核有ARM11(2002年发布)。V6体系结构包含ARM体系结构中所有的4种特殊指令集:Thumb指令(T)、DSP指令(E)、Java指令(J)和Media指令。
ARM体系结构版本V7是在版本V6基础上诞生的。V7结构采用了Thumb-2技术,它是在ARM的Thumb代码压缩技术的基础上发展上去的,但是保持了对现存ARM解决方案的完整的代码兼容性。V7结构还采用了NEON技术,将DSP和媒体处理能力提升了近4倍。并支持改良的浮点运算,满足下一代3D图形、游戏以及传统嵌入式控制应用的需求。自此版本开始,ARM公司即将将原先的版本ARM处理器称为精典系列,V7结构及之后处理器称为Cortex系列,但是将Cortex系列产品分为A(应用处理)、R(实时控制)、M(微控制)三个子系列。
ARM在2012年下半年首次发布采用64位V8构架产品。V8是ARM公司的第一款64位处理器构架,包括AArch64和AArch32二种主要执行状态。其中后者引入了一套新的指令集“A64”专门用于64位处理器,前者前者拿来兼容现有的32位ARM指令集。目前我们看见的Cortex-A53,Cortex-A57(现今被A72取代了)二款处理器便属于Cortex-A50系列。
1.3.3ARM处理器
芯片厂家获得ARM公司的授权之后生成下来不同的处理器,ARM处理器的支持(如指令语义)的实现细节可能会有所不同。按照结构体系及内核的差别,目前ARM处理器又分为不同的系列,如下表所示:
表1ARM处理器内核列表
构架处理器家族
ARMv1ARM1
ARMv2ARM2、ARM3
ARMv3ARM6、ARM7
ARMv4StrongARM、ARM7TDMI、ARM9TDMI
ARMv5ARM7EJ、ARM9E、ARM1010E、XScale
ARMv6ARM11、ARMCortex-M
ARMv7ARMCortex-A、ARMCortex-M、ARMCortex-R
ARMv8Cortex-A35、Cortex-A50系列、Cortex-A72、Cortex-A73
世界各大半导体生产商从ARM公司订购其设计的ARM微处理器核,按照各自不同的应用领域,加入适当的外围电路,因而产生自己的ARM微处理器芯片步入市场,又产生了各自的ARM系列芯片。典型的如基于Cortex-M3内核的意法半导体STM32系列芯片,基于ARM920920T内核的SamsungSSamsungS33CC24422442和S3C2410芯片,基于ARM7TDMI(-S)内核的恩智浦半导体LPC2000及LH754xx系列芯片等。
1.4Linux操作系统
应用于嵌入式系统的的嵌入式操作系统好多,如Linux、uCOS-II、WinCE等,其中Linux系统是应用最为广泛的。Linux系统是一个免费使用的类似Unix的操作系统,最初运行在X86体系结构,目前已被移植到数十种处理器上,如ARM、LoongSon等。Linux最初是由德国的LinuxTorvalds设计开发,经过多年的发展,早已产生一个特别庞大、功能健全的操作系统。
嵌入式Linux是以Linux为基础的嵌入式操作系统,它被广泛应用在联通电话、媒体播放器、消费性电子产品以及民航航天等领域。嵌入式Linux是将Linux操作系统进行剪裁更改,使之能在嵌入式计算机系统上运行的一种操作系统。嵌入式Linux既承继了Internet上无限的开放源代码资源,又具有嵌入式操作系统的特点。嵌入式Linux的特征是版本免费,但是性能优异,软件移植容易,代码开放,有许多应用软件支持,应用产品开发周期短,新产品上市迅速,稳定性好、安全性好。
1.4.1Linux内核版本
严格来讲,Linux这个词本身只表示Linux内核,任何使用Linux内核的操作系统都可以称为Linux操作系统。内核,是一个操作系统的核心。是基于硬件的第一层软件扩展,提供操作系统的最基本的功能,是操作系统工作的基础,它负责管理系统的进程、内存、设备驱动程序、文件和网路系统,决定着系统的性能和稳定性。Linux内核的主要模块(或组件)分以下几个部份:储存管理、CPU和进程管理、文件系统、设备管理和驱动、网络通讯,以及系统的初始化(引导)、系统调用等。
Linux内核是源码开源的,源代码可至下载。另外网站,提供了在线工具帮助我们阅读有关代码。
Linux内核版本号通常由3组数字组成:X.Y.Z。X表示主版本号,Y表示次版本号,Z表示修订版本号。初期次版本号为质数时代表的是不稳定版本,质数时代表稳定版本。目前Linux内核的最新的稳定版本为5.1.10版。
小方法:怎么查看Linux内核版本号?
在Linux终端中输入uname-a
1.4.2Linux发行版本
Linux系统是开放的,任何人都可以制做自己的系统。Linux主要作为Linux发行版(一般被称为"distro")的一部份而使用。这种发行版由个人,松散组织的团队,以及商业机构和志愿者组织编撰。它们一般包括了其他的系统软件和应用软件,以及一个拿来简化系统初始安装的安装工具,和让软件安装升级的集成管理器。大多数系统还包括了像提供GUI界面的XFree86之类的以前运行于BSD的程序。一个典型的Linux发行版包括:Linux内核,一些GNU程序库和工具,命令行shell,图形界面的XWindow系统和相应的桌面环境,如KDE或GNOME,并包含数千种从办公套件,编译器,文本编辑器到科学工具的应用软件。
发行版为许多不同的目的而制做,包括对不同计算机结构的支持,对一个具体区域或语言的本地化,实时应用,和嵌入式系统,甚至许多版本故意地只加入免费软件。早已有超过三百个发行版被积极的开发,最普遍被使用的发行版有大概十二个。在如下可以找到当前较为流行的Linux发行版本的下载。
小方法:怎么查看Linu发行版本号?
在Linux终端中输入lsb_release-a
嵌入式linux启动流程
1、嵌入式linux启动第一步----BootLoader
BootLoader在这儿我就不细说了,详尽剖析上去的话有好多内容,网上也有好多讲解很详尽的文章。这段小程序中我们可以初始化硬件设备、建立显存空间的映射图,将系统的软硬件环境带到一个合适的状态,便于为最终调用操作系统内核做好一切打算。
2、嵌入式linux启动第二步----加载内核
如果你是从u-boot启动的话,可能会有好多形式来实现内核的加载。系统读取显存映像,并进行解压缩操作,此时屏幕通常会有一些供调试用的复印信息。内核解压好以后,系统将解压后的内核置于显存之中,并调用start_kernel()函数来启动一系列的初始化函数并初始化各类设备,完成Linux核心环境的构建。至此Linux内核早已构建上去了,也就是说核心的任务调度、多用户哪些的功能都齐全了。可能有人会问我们在BootLoader上面不是早已初始化了硬件了么?如何还要初始化设备。这儿缘由说不好,BootLoader上面确实是初始化了一些硬件设备,并且这些初始化只是临时的,系统上去以后的初始化会覆盖掉。你可以理解为BootLoader上面初始化算是游击、土八路,真正系统上去才是正规军。
3、嵌入式linux启动第三步----用户层init根据inittab文件来设定运行等级
内核加载后linux cp,第一个运行的程序便是/sbin/init,该文件会读取/etc/inittab文件,并根据此文件来进行初始化工作。虽然/etc/inittab文件最主要的作用就是设定Linux的运行等级,其设定方式是“xxx1:xxx2:xxx3:xxx4”其中xxx1是指入口标示符,xxx2是指init所处的运行等级,xxx3是指action,描述process的运行方法,xxx4是指process。
运行等级设定如下:
0:死机
1:单用户模式
2:无网路支持的多用户模式
3:有网路支持的多用户模式
4:保留,未使用
5:有网路支持有X-Window支持的多用户模式
6:重新引导系统linux,即重启
4、嵌入式linux启动第四步----init进程执行rc.sysinit
在设定了运行等级以后,Linux系统执行的第一个用户文件就是/etc/rc.d/rc.sysinit脚本程序,它做的工作十分多,包括设定PATH、设定网路配置(/etc/sysconfig/network)、启动swap分区、设定/proc等等。
5、嵌入式linux启动第五步----启动内核模块
根据/etc/modules.conf文件或/etc/modules.d目录下的文件来装载内核模块。
6、嵌入式linux启动第六步----执行不同运行级别的脚本程序
按照不同的级别设置,运行rc0.d到rc6.d中的相应的脚本程序,来完成相应的初始化工作和启动相应的服务。
7、嵌入式linux启动第七步----执行/etc/rc.d/rc.local
这是linux留给用户进行个性化的地方。可以把想设置和启动的东西放在这儿。
8、嵌入式linux启动第八步----执行/bin/login程序,步入登录状态
ARM-Linux嵌入式系统启动流程