嵌入式系统 Boot Loader 技术内幕 and Linux Process

来源:百度文库 编辑:神马文学网 时间:2024/03/28 20:33:00
嵌入式系统 Boot Loader 技术内幕
本文详细地介绍了基于嵌入式系统中的 OS 启动加载程序 ―― Boot Loader 的概念、软件设计的主要任务以及结构框架等内容。
在专用的嵌入式板子运行 GNU/Linux 系统已经变得越来越流行。一个嵌入式 Linux 系统从软件的角度看通常可以分为四个层次:
1. 引导加载程序。包括固化在固件(firmware)中的 boot 代码(可选),和 Boot Loader 两大部分。
2. Linux 内核。特定于嵌入式板子的定制内核以及内核的启动参数。
3. 文件系统。包括根文件系统和建立于 Flash 内存设备之上文件系统。通常用 ram disk 来作为 root fs。
4. 用户应用程序。特定于用户的应用程序。有时在用户应用程序和内核层之间可能还会包括一个嵌入式图形用户界面。常用的嵌入式 GUI 有:MicroWindows 和 MiniGUI 懂。
引导加载程序是系统加电后运行的第一段软件代码。回忆一下 PC 的体系结构我们可以知道,PC 机中的引导加载程序由 BIOS(其本质就是一段固件程序)和位于硬盘 MBR 中的 OS Boot Loader(比如,LILO 和 GRUB 等)一起组成。BIOS 在完成硬件检测和资源分配后,将硬盘 MBR 中的 Boot Loader 读到系统的 RAM 中,然后将控制权交给 OS Boot Loader。Boot Loader 的主要运行任务就是将内核映象从硬盘上读到 RAM 中,然后跳转到内核的入口点去运行,也即开始启动操作系统。
而在嵌入式系统中,通常并没有像 BIOS 那样的固件程序(注,有的嵌入式 CPU 也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由 Boot Loader 来完成。比如在一个基于 ARM7TDMI core 的嵌入式系统中,系统在上电或复位时通常都从地址 0x00000000 处开始执行,而在这个地址处安排的通常就是系统的 Boot Loader 程序。
本文将从 Boot Loader 的概念、Boot Loader 的主要任务、Boot Loader 的框架结构以及 Boot Loader 的安装等四个方面来讨论嵌入式系统的 Boot Loader。
简单地说,Boot Loader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
通常,Boot Loader 是严重地依赖于硬件而实现的,特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的 Boot Loader 几乎是不可能的。尽管如此,我们仍然可以对 Boot Loader 归纳出一些通用的概念来,以指导用户特定的 Boot Loader 设计与实现。
每种不同的 CPU 体系结构都有不同的 Boot Loader。有些 Boot Loader 也支持多种体系结构的 CPU,比如 U-Boot 就同时支持 ARM 体系结构和MIPS 体系结构。除了依赖于 CPU 的体系结构外,Boot Loader 实际上也依赖于具体的嵌入式板级设备的配置。这也就是说,对于两块不同的嵌入式板而言,即使它们是基于同一种 CPU 而构建的,要想让运行在一块板子上的 Boot Loader 程序也能运行在另一块板子上,通常也都需要修改 Boot Loader 的源程序。
系统加电或复位后,所有的 CPU 通常都从某个由 CPU 制造商预先安排的地址上取指令。比如,基于 ARM7TDMI core 的 CPU 在复位时通常都从地址 0x00000000 取它的第一条指令。而基于 CPU 构建的嵌入式系统通常都有某种类型的固态存储设备(比如:ROM、EEPROM 或 FLASH 等)被映射到这个预先安排的地址上。因此在系统加电后,CPU 将首先执行 Boot Loader 程序。
下图1就是一个同时装有 Boot Loader、内核的启动参数、内核映像和根文件系统映像的固态存储设备的典型空间分配结构图。

主机和目标机之间一般通过串口建立连接,Boot Loader 软件在执行时通常会通过串口来进行 I/O,比如:输出打印信息到串口,从串口读取用户控制字符等。
通常多阶段的 Boot Loader 能提供更为复杂的功能,以及更好的可移植性。从固态存储设备上启动的 Boot Loader 大多都是 2 阶段的启动过程,也即启动过程可以分为 stage 1 和 stage 2 两部分。而至于在 stage 1 和 stage 2 具体完成哪些任务将在下面讨论。
大多数 Boot Loader 都包含两种不同的操作模式:"启动加载"模式和"下载"模式,这种区别仅对于开发人员才有意义。但从最终用户的角度看,Boot Loader 的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区别。
启动加载(Boot loading)模式:这种模式也称为"自主" (Autonomous)模式。也即 Boot Loader 从目标机上的某个固态存储设备上将操作系统加载到 RAM 中运行,整个过程并没有用户的介入。这种模式是 Boot Loader 的正常工作模式,因此在嵌入式产品发布的时侯,Boot Loader 显然必须工作在这种模式下。
下载(Downloading)模式:在这种模式下,目标机上的 Boot Loader 将通过串口连接或网络连接等通信手段从主机(Host)下载文件,比如:下载内核映像和根文件系统映像等。从主机下载的文件通常首先被 Boot Loader 保存到目标机的 RAM 中,然后再被 Boot Loader 写到目标机上的FLASH 类固态存储设备中。Boot Loader 的这种模式通常在第一次安装内核与根文件系统时被使用;此外,以后的系统更新也会使用 Boot Loader 的这种工作模式。工作于这种模式下的 Boot Loader 通常都会向它的终端用户提供一个简单的命令行接口。
关于嵌入式Linux系统进程调度的分析
摘 要:本文结合源代码着重分析了Linux进程调度的依据、策略和调度程序schedule()。关键词: 嵌入式Linux;进程调度;实时进程;调度策略。1 前言处理机(CPU)是整个计算机系统的核心资源,在多进程的操作系统中,进程数往往多于处理机数,这把导致各进程互相争夺处理机。进程调度对系统功能的实现及各方面的性能都有着决定性的影响,其实质就是把处理机公平、合理、高效地分配给各个进程。调度是实现多任务并发执行的必要手段,不同的操作系统有着不同的调度目标。在传统的Unix类分时系统中,保证多个进程公平地使用系统资源,提供较好的响应时间是调度的主要目标;而在强实时操作系统中,总是优先级高的任务优先获得处理机的使用权。Linux具有内核稳定、功能强大、可裁减、低成本等特点,非常适合嵌入式应用。但是Linux内核本身并不具备强实时特性,且内核体积较大,因此,想要把Linux用于嵌入式系统,必须对Linux进行实时化、嵌入式化。Linux结合实时进程和非实时进程(普通进程)自身的特点,综合了上述几种调度策略,实现了高效、灵活的进程调度。2 Linux进程调度分析2.1 Linux进程状态的描述Linux把进程状态描述为如下五种:TASK_RUNNING:可运行状态。处于该状态的进程可以被调度执行而成为当前进程。TASK_INTERRUPTIBLE:可中断的睡眠状态。处于该状态的进程在所需资源有效时被唤醒,也可以通过信号或定时中断唤醒。TASK_UNINTERRUPTIBLE:不可中断的睡眠状态。处于该状态的进程仅当所需资源有效时被唤醒。TASK_ZOMBIE:僵尸状态。表示进程结束且已释放资源,但其task_struct仍未释放。TASK_STOPPED:暂停状态。处于该状态的进程通过其他进程的信号才能被唤醒。2 调度方式Linux中的每个进程都分配有一个相对独立的虚拟地址空间。该虚存空间分为两部分:用户空间包含了进程本身的代码和数据;内核空间包含了操作系统的代码和数据。Linux采用“有条件的可剥夺”调度方式。对于普通进程,当其时间片结束时,调度程序挑选出下一个处于TASK_RUNNING状态的进程作为当前进程(自愿调度)。对于实时进程,若其优先级足够高,则会从当前的运行进程中抢占CPU成为新的当前进程(强制调度)。发生强制调度时,若进程在用户空间中运行,就会直接被剥夺CPU;若进程在内核空间中运行,即使迫切需要其放弃CPU,也仍要等到从它系统空间返回的前夕才被剥夺CPU。3 调度策略3.1 三种调度策略(1)SCHED_OTHER。SCHED_OTHER是面向普通进程的时间片轮转策略。采用该策略时,系统为处于TASK_RUNNING状态的每个进程分配一个时间片。当时间片用完时,进程调度程序再选择下一个优先级相对较高的进程,并授予CPU使用权。(2)SCHED_FIFO。SCHED_FIFO策略适用于对响应时间要求比较高,运行所需时间比较短的实时进程。采用该策略时,各实时进程按其进入可运行队列的顺序依次获得CPU。除了因等待某个事件主动放弃CPU,或者出现优先级更高的进程而剥夺其CPU之外,该进程把一直占用CPU运行。(3)SCHED_RR。SCHED_RR策略适用于对响应时间要求比较高,运行所需时间比较长的实时进程。采用该策略时,各实时进程按时间片轮流使用CPU。当一个运行进程的时间片用完后,进程调度程序停止其运行并把其置于可运行队列的末尾。3.2  进程调度依据Linux只有一个可运行队列,处于TASK_RUNNING状态的实时进程和普通进程都加入到这个可运行队列中。Linux的进程调度采用了动态优先级和权值调控的方法,既可实现上述三种调度策略,又能保证实时进程总是比普通进程优先使用CPU。描述进程的数据结构task_struct中用以下几个数据作为调度依据: Struct task_struct { …… volatile long need_resched; /*是否需要重新调度*/   long counter; /*进程当前还拥有的时间片*/ long nice; /*普通进程的动态优先级,来自UNIX系统*/ unsigned long policy; /*进程调度策略*/ unsigned long rt_priority; /*实时进程的优先级*/ …… };
linux学习指导
1# 大 中 小 发表于 2007-7-25 20:28  只看该作者 linux->linux学习指导
所指得类unix系统 指得是包含unix(商标所有权归opengroup所有) ,以及unix各个变体(aix,hp-unix,Solaris,BSD, FreeBSD ,etc ) 以及克隆 例如linux.下面这个是目前最全面的谱系图,大家有兴趣可以看看,了解一下.[unix 谱系图] [url]http://www.levenez.com/unix/[/url]
Step 0:
这个阶段的同学基本对OS没有认识, 可以从安装系统, 配置系统,学习各种编辑器的使用,
与脚本的编写.建议从Linux入手,毕竟比较容易得到各种发行版本,而且用户群比较大,有了问题
容易得到解答.推荐的发行版本是桌面Ubuntu,服务器 Debian.
推荐教材:
O‘Reilly 出版了一系列的关于linux环境下的工具使用的书. 包括了Bash, vim , emacs,
linux 配置等 很多.用到具体工具时可以参考.
入门阶段各个linux社区的FAQ很重要,基本包含了初学者能碰到的大部分问题,好好利用.
例如国内的linuxsir, CLF, CU, etc .国外主要时几个主要的邮件列表.
Step 1:
对于系统使用有了基本掌握之后,开始进入编写应用程序阶段 ,
进入这阶段前提是  C语言必须 有非常扎实的基础. 如果看完 expert c programming , 觉得没有困难,算是过关
能基本使用vim,emacs ,其中之一
基本会编写makefile.
这阶段学习的必备之书是APUE.作者steven是我非常敬佩的前辈,可惜英年早逝.这本书讲解非常
全面,初学会感到困难,但是坚持下来受益非浅.第二版已经引进可以买到
Howto write makefile   这个有中文的,可以作为写makefile的参考.
这里除了一般的应用程序外有3个重要的分支.
A.网络编程. 类unix下有非常丰富的网络工具所以这个是很大的一类分支.网络通信本质上也是
进程间通信,所以steven的进程间通信3卷本就是必看的书(steven生前只完成了2卷
第三卷由他的朋友续写.具体情况不明).作为更进一步可以研究apache的衍生项目
APR和ACE(这个需要比较深厚的C++,设计模式的功底).可以说网络编程是一个非常大的分支,
精通需要耗费很多时间.研究内核看完steven的前2卷即可.
B. Xwindows 这个涉及到GUI, 也是一个庞大的分支,研究内核只需要关注X的架构和
驱动之间的关系即可.这个分支很庞大,可是好的书其实不多.只有92年的这个系列
O‘Reilly - The Definitive Guides To The X Window Systems,
Vol 1 - Xlib Programming Manual, 3Rd Ed .
最近xserver的架构有很大的变化,xgl的出现石破天惊,看过novell2月在法国的演示
真是无话可说.只能说在创新这一点上我们还没有资格来谈.这点我同意BNN的观点,这
10年我们的任务就是学习,追赶.CLF 上面有一些文章和翻译的project
C. 脚本.研究内核掌握Bash即可,不过这几年perl,php,python,ruby都很火爆,国内这 这方面也很红火.这些书如过江之鲫,没啥好说的.
Step2:
开始进入OS 的正题, 首先要掌握基本概念 首推 operating system concepts 第六版
通过这本书可以掌握基本概念, 有个感性认识.
然后可以看<<操作系统设计与实现>> 这本书是结合minix这个教学系统来讲的,也是经典书籍
不过很少有人有耐心看完上下两册.现在已经进化到minix3了,老头不甘于只作一个教学系统. minix3 已经改变了很多.
还有一本很好的书籍Operating Systems: A Design-Oriented Approach 这本书很难找,
当年我从一堆垃圾书中掏到这本世图的影印本,印数很小,不过确实是一本好书,作者把每章的概
念对应到java代码 ,深入浅出,可惜没人重视.
M. J. Bach , The Design of the UNIX Operating System, Prentice-Hall  经典中的经典
这个阶段主要是从总体上把握OS的整体结构,对各个概念基本了解.
step 3:
以linux为平台的内核开发的初级阶段.
<> 3th
<> 3th
<> 2th
<>
介绍unix OS内核的几本重要的书:
The Design and Implementation of the FreeBSD Operating System    FreeBSD 的经典诠释.
The Design and Implementation of the 4.4BSD Operating System      4.4BSD-Lite的经典诠释
《 UNIX 高级教程系统技术内幕 》中文的是96年的老版本,听说出新版了
Solaris Internals: Core Kernel Architecture
sun在unix历史上作出了很多贡献,solaris的进程调度 内存管理,文件系统 都有独到之处.
还有线程模型是m:n 的混合模式, 实现方法还有很有意思的.
Step4:
从这里开始进入了OS的具体实现和内核很具体的分支.
进入这章之前必须要对编译器, 体系结构有中等水平的认识.
也就是说编译器要看过龙书,体系要看过量化方法这本.最好加上see mips run
调度, 内存管理, 网络协议栈,文件系统,体系相关.进程管理,
Linker&&Loader , tool-chain
这些都是很重要的分支都有很重要的应用.
对于调试器原理要有一定的了解,能熟练使用
The Linux® Networking Architecture: Design and Implementation of Network
Understanding The Linux Virtual Memory Manager Mel Gorman ,
2.4内核内存管理的全面分析, 2.6中改动不小
linux 情景分析 2.4 kernel 的全面分析. 浙大的毛德操,李善平老师力作.
[url]www.opensolaris.org[/url]
solaris 代码已经公开 可以参考
Wiley.UNIX.Filesystems.Evolution.Design.and.Implementation
SunOS50MultithreadArchitecture
Wiley - Symbian OS Internals {Real-time Kernel Programming}
这一阶段 书籍已经是辅助,主要是靠查看代码,做实际的修改,实验,比较.
<> 作者:胡希明, 毛德操
上下册, 80, 70 元
浙大出版
特点是: 不是传统的先结构, 后代码等等. 以一种类似于情景英语
的手法来研究 linux 的源码. 适于有一定基础的朋友.
====================================================================
《The Design of The UNIX Operating System》 Author: Maurice J. Bach
中译本:《UNIX 操作系统设计》
---------------------
翻译者:陈葆钰等
北大版: 32开,黄皮,9.40¥
机工版: 16开,褐皮,30¥
---------------------
一本老书,但绝对是bible级的。其内容覆盖了经典UNIX操作系统中的所有基本概念
以及设计思想。阅读者最好能懂一些基本的操作系统理论知识。
====================================================================
====================================================================
《Unix Internals - The New Frontiers》 Author: Uresh Vahalia
中译本:《UNIX 高级教程:系统技术内幕》
---------------------
翻译者:聊鸿斌等
清华大学出版社出版,16开,桔皮,58¥
---------------------
一本新书,也是bible级的。其主要特点是80%的内容都是现代UNIX操作系统的新思想
和新概念。对各UNIX大家的精彩设计点都有很详尽的阐述。阅读者最好先看看贝奇那
本书。
====================================================================
====================================================================
《Linux Core Kernel Commentary》
---------------------
Author: Scott Maxwell
---------------------
有中译本,但具体信息不详 对照源码讲Linux内核,版本还比较高,2.2.X。有些新
东西可看看。可惜没讲网络部分的实现。
====================================================================
====================================================================
《Linux Kernel Internals: 2nd version》
---------------------
Author: M Beck ...
---------------------
目前无中译本 以数据结构为主体来介绍内核,内容很丰富,但版本太低(2.0.x),有
些陈旧的东西容易令人误入歧途。
====================================================================
====================================================================
《The Design and Implementation of the 4.4BSD Operating System》
---------------------
Author: McKusick, Bostic, Karels, Quarterman
---------------------
目前无中译本  讲述BSD操作系统最权威的书。书的作者亦即BSD最早的几名开发者。
====================================================================
====================================================================
《Linux 操作系统及实验教程》
---------------------
作者:李善平,郑扣根(浙大教师)
机工出版
---------------------
有些内容不错,讲得还比较深入。也缺少网络部分的描述。
====================================================================
====================================================================
《UNIX 系统下的80386》
---------------------
作者:周明德, 张淑玲
清华出版
---------------------
讲X86的体系结构。要想看懂/arch/i386下的辕马,最好先看看这本书。
====================================================================
====================================================================
《UNIX Systems for Modern Architectures》
---------------------
Author: Curt Schimmel
---------------------
目前无中译本  如果想了解辕马中SMP的实现。可参考看这本书。
====================================================================
====================================================================
《保护模式下的80386及其编程》
---------------------
出版社:清华大学出版社
---------------------
本书全面地介绍了80386的结构。首先是80386实模式和保护模式下的寄存器集和
指令集,接着从保护模式下的虚存管理、保护级、多任务支持、中断和异常等方
面深入地剖析386的强大功能,再接着提供几个典型的编程实例以及一个完整的从
386加电初始化开始到形成一个有基本的多任务和虚拟存储能力的系统的例子并作
了详细解释,最后还清楚地说明了80386与8086/80286的兼容性和差别。本书的特
点是严谨深入,对CPU各种条件下的动作和反应用形式化的微程序讲解得十分清楚,
尤其适合系统程序员阅读。总之,这实在是一本不可多得的好书.
====================================================================
====================================================================
《Linux 操作系统的内核分析》 作者:陈莉君编著
---------------------
价格:40 元
出版社:人民邮电出版社