16 linux
Download
Skip this Video
Download Presentation
第 16 章 嵌入式 Linux 系统

Loading in 2 Seconds...

play fullscreen
1 / 68

第 16 章 嵌入式 Linux 系统 - PowerPoint PPT Presentation


  • 129 Views
  • Uploaded on

操作系统. 第 16 章 嵌入式 Linux 系统. 陆松年 [email protected] 主要内容. 嵌入式 Linux 系统基本概念 嵌入式 Linux 系统裁减与移植 嵌入式 LINUX 软件开发. 主要内容. 嵌入式 Linux 系统基本概念 Linux 嵌入式 Linux 系统裁减与移植 嵌入式 Linux 应用. 外围电路. 电源 模块. Flash. 微处理器. RAM. 时钟. MPU. 复位. ROM. 外设. Keyboard. USB. LCD. Other. 16.1.1 嵌入式系统的定义.

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' 第 16 章 嵌入式 Linux 系统' - lynne


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
slide2
主要内容
  • 嵌入式Linux系统基本概念
  • 嵌入式Linux系统裁减与移植
  • 嵌入式LINUX软件开发
slide3
主要内容
  • 嵌入式Linux系统基本概念
  • Linux嵌入式Linux系统裁减与移植
  • 嵌入式Linux应用
16 1 1

外围电路

电源

模块

Flash

微处理器

RAM

时钟

MPU

复位

ROM

外设

Keyboard

USB

LCD

Other

16.1.1 嵌入式系统的定义

嵌入式系统硬件组成

slide5
嵌入式系统设备常见接口
  • I/O
  • A/D、D/A
  • 键盘
  • LCD
  • 存储器接口
  • 网络设备接口
cisc risc
CISC和RISC指令集

CISC:复杂指令集(Complex Instruction Set Computer)

  • 具有大量的指令和寻址方式
  • 8/2原则:80%的程序只使用20%的指令
  • 大多数程序只使用少量的指令就能够运行。
  • 如Intel X86系列或者兼容的低功耗芯片

RISC:精简指令集(Reduced Instruction Set Computer)

  • 在通道中只包含最有用的指令
  • 确保数据通道快速执行每一条指令
  • 使CPU硬件结构设计变得更为简单
  • 如PowerPC, MIPS, ARM/XScale
slide7
冯·诺依曼体系结构模型

存储器

指令寄存器

程序

控制器

指令0

指令1

指令2

指令3

指令4

数据通道

数据

输出

输入

中央处理器

数据0

数据1

数据2

slide8
哈佛体系结构

程序存储器

地址

指令寄存器

指令0

控制器

指令1

指令

指令2

数据存储器

地址

数据通道

输出

输入

数据0

中央处理器

数据1

数据

数据2

16 1 2
16.1.2 嵌入式操作系统的特点
  • “嵌入计算机系统的专用操作系统”。
    • 嵌入性:物理环境(小型)、电气环境(可靠)、成本(价廉)等要求。
    • 专用性 :满足对象要求的最小软、硬件配置等。
    • 性能要求:多任务调度、实时性能
    • 功能要求:接口与通信能力
slide10
常见嵌入式操作系统
  • VxWorks
    • 市场占有率最高的系统。它支持多种处理器 ,高性能。
  • PSOSystem
    • 模块化好,在中低端系统中应用广。pSOS已属于WindRiver。
  • QNX
    • 小巧灵活,在航空航天和工业控制中广泛应用
  • Windows CE
    • 多线程、完整优先权、多任务的操作系统。 图形界面好,开发工具友好
  • Linux-derived RTOS
    • Montavist Linx, RTlinux;
  • Other OS
    • VTRX,Palm OS,ucos etc
16 1 3 linux
16.1.3 嵌入式Linux发展与应用

专用嵌入式实时操作系统 vs 嵌入式Linux 操作系统

linux
如何选择合适的linux版本
  • 标准的Linux 版本。
  • 小型化的嵌入式版本。
  • 具有实时扩展功能的Linux 版本。
  • Linux 特殊应用版本。例如有许多针对不同的如“瘦服务器”或“防火墙”应用的小型化、实时特性增强的版本。
slide13
网络可选择资源-标准版本
  • Debian:http://www.debian.org.com/
  • Red Hat:http://www.redhat.com/
  • Slackware:http://www.slackware.com/
  • Turbo Linux:http://www.turbolinux.com/
slide14
网络可选择资源-小型化版本
  • ETLinux:http://www.prosa.it/embedded/etlinux/
  • Linux Router Project:http://www.linuxrouter.org/
  • LOAF:http://loaf.ecks.org/
  • ucLinux:http://www.uclinux.org/
slide15
网络可选择资源-实时扩展版
  • RTLinux:http://www.rtlinux.com
  • RTAI:http://www.rtai.org/
  • EL/IX:http://www.sourceware.cygus.com/elix/
  • SRT-Linux:http://www.cl.cam.ac.uk/~dmi1000/linux-srt/index.html
linux1
嵌入式linux构建与应用的关键技术
  • 对linux 的裁减达到小型化的目的;
  • 对不同嵌入式微处理器的linux 内核代码移植,驱动程序的研究;
  • 专业应用开发: 移植应用程序,开发面向特定应用的控制软件。
linux2
嵌入式Linux操作系统实时性
  • 常用衡量实时性标准
    • 确定性(Determinism):系统的行为表现应该是确定的,每个系统调用执行的时间是可预测的。
    • 中断延迟时间(Interrupt Latency Time):从接收到中断信号到操作系统作出响应,并进入中断服务程序的时间;
    • 上下文切换时间(Context-Switching Time),就是操作系统将控制权从执行中取回,然后交给另一个任务所需的时间。
linux3
嵌入式Linux操作系统实时性
  • 影响中断处理时间的因素
    • 处理器硬件电路的延迟时间,通常这个时间可以忽略。
    • 操作系统处理中断并将控制权转移给中断处理程序所需要的时间。
    • 操作系统的中断禁止时间,这是操作系统为了保护重要的系统程序代码暂停接受中断需要的时间。
linux6
嵌入式Linux实时化技术

RTlinux双内核实时化结构

linux7
嵌入式Linux实时化技术

RTLinux任务处理流程

slide23
主要内容
  • 嵌入式Linux系统基本概念
  • Linux嵌入式Linux系统裁减与移植
  • 嵌入式Linux软件开发
slide24
从何处开始?
  • 需要考虑的问题
    • 是否支持自己的硬件平台
    • 有多少可选软件、文件定制能力如何
    • 是否有完整文档、新版本升级是否方便等等一系列问题。
  • 可以选择的方法
    • 基于面向特定应用的嵌入式Linux版本
    • 基于通用嵌入式Linux版本
    • 基于某通用Linux系统和Linux源代码库
c shell
内核,C库,Shell和实用程序
  • 典型的Linux系统包括3个主要的软件层:Linux内核、C库和应用程序;
  • 内核主要的功能包括内存管理、进程调度、设备驱动、文件系统、网络协议栈和模块管理等;
  • 内核之上是C库,这一层负责把符合POSIX标准的API转换成内核可以识别的形式;
  • 离硬件最远的是应用程序层,细分包含两部分:
    • 系统程序,一般指运行系统所不可缺少的程序;
    • 用户程序,给用户提供各种功能;
linux9
嵌入式Linux系统构建流程
  • 裁减编译内核
  • 建立root文件系统
  • 制作系统映像
  • 安装引导
slide28
第1步:裁减和编译内核
  • 获得内核源代码
    • 根据硬件平台获得对应的Linux系统源代码
    • 从一个通用系统,如redhat系统获得源代码
  • 裁减编译内核的步骤
    • 配置内核
    • 更新编译文件
    • 编译内核
slide29
编译内核原则
  • Linux内核拥有灵活方便的配置功能,菜单分为,芯片组支持,外设支持,文件支持,网络等,每类只将需要的内容编译进内核。
    • 根据目标系统的硬件配置选择模块
    • 根据应用目标选择其他功能模块
    • 应当保证内核只支持一种或是两种必要的文件系统,如ext2和minix;
    • 为支持内存虚拟磁盘启动,需要编译内核支持ram disk和initrd
slide30
第1步:裁减编译内核
  • 以root超级用户登录,进入目录/usr/src/linux。
    • 如果目标系统和主机系统不是同一硬件平台需要先建立交叉编译环境并获得目标系统的内核源代码
  • #make menuconfig
    • 对内核模块进行配置(也可以在X Window中运行make xconfig)。
  • #make dep
    • 更新配置文件
  • #make bzImage
    • (如果内核不大则执行#make zImage),执行该命令后,将在/usr/src/linux/arch/i386/boot目录下生成内核文件bzImage(或zImage)。
    • 若配置中加入了模块的支持(选项为M),还需要执行#make modules和#make modules_install。
  • 生成内核
    • /usr/src/linux/arch/i386/boot/bzImage文件为内核文件
    • 改名为MiniKernel备用
2 root
第2步:建立root文件系统
  • 什么是root文件系统?
    • 一个完整的Linux系统除了内核外,还必须有一个由C库和系统应用程序构成的root文件系统。
    • 一个root文件系统包括支持完整Linux系统运行的全部东西。
  • 建立root文件系统的步骤
    • 在主机中建立目标系统的root文件系统目录结构
    • 从代码库中挑选并裁减出适用的各种文件
    • 将root文件系统目录中的所有内容打包制作成映像
2 root1
第2步:建立root文件系统
  • root文件系统的内容
    • 基本文件系统结构,至少含有目录/dev、/proc、/bin、/etc、/lib、/usr、/tmp ;
    • 最基本的系统应用程序,如sh、ls、cp、mv等;
    • 最低限度的配置文件,如rc、inittab、fstab等;
    • 基本设备,如/dev/mem、/dev/ tty*、/dev/console;
    • 基本程序运行所需的C函数库。
2 root2
第2步:建立root文件系统
  • 建立目录系统
    • 以root用户登录开发主机,在合适的目录下(如根目录下),用mkdir rootfs命令建立一个工作目录rootfs。
    • 在rootfs/目录下的内容就是今后目标系统根目录(/)下的内容。
    • 在当前目录下执行cd rootfs进入到rootfs目录中,然后用mkdir命令分别在rootfs目录下建立以下目录:

/etc 放置系统配置文件;/sbin 放置重要的系统程序;/bin 放置系统基本应用程序;

/dev 设备文件的目录;/proc proc文件系统所需目录;/lib 准备存放共享函数库;/mnt 准备挂载其他设备的目录节点/usr 准备放置用户应用程序。

2 root3
第2步:建立root文件系统
  • 建立目录系统
    • /proc、/mnt和/usr在此情况下都是空的,只需要用mkdir创建它们即可。
    • /dev:设备文件需要用mknod产生。如果简单起见用cp -dpR 参数开关来复制原系统的设备文件节点也可以,例如cp -dpR /dev/mem /mnt/dev 。至少需要console、kmem、mem、null、ram、tty*等文件。
    • /etc:一般可以包含rc.d/* (系统启动脚本)、fstab(列出要登录的文件系统)、inittab(包含启动过程参数) 。
2 root4
第2步:建立root文件系统
  • 建立目录系统
    • /bin和/sbin:这两个目录中包含有一些系统运行不可缺少的程序和大量实用程序,如ls、mv、cat、cp等。系统实用程序可以根据需要选择拷贝,而系统运行不可缺少的一些程序必须拷贝过来,如init、getty、login、mount、bash等。。
    • /lib: 必须有函数库装载器,这个装载器或是ld.so (对 a.out 库) 或是 ld-linux.so (对 ELF 库)。如果有一个模块化的内核,你还得必须考虑需要加载的模块。它们都位于/lib/modules。
2 root5
第2步:建立root文件系统
  • 裁减root文件系统
  • 动态库的裁减
  • 精简系统应用程序
  • 精简嵌入式系统专用程序
2 root6
第2步:建立root文件系统
  • 裁减root文件系统
  • 动态库的裁减
    • Linux的C库glibc就是系统的动态连接库,相当于Windows系统的系统dll动态连接库。
    • 用软件工具扫描系统所需要的库,然后进行删减。
    • 采用精简版本的C库,目前可以选择的开源动态库有libc5、uclibc、dietlibc等,但需要测试兼容性。
2 root7
第2步:建立root文件系统
  • 精简系统应用程序
    • Shell是必须的,采用Shell脚本开发的程序因为是解释性的,所以尺寸往往只需要几百个字节,而完成相同功能的C程序编译后都至少要几KB。
    • /bin和/sbin目录下的ls等各种系统实用程序需要精简
2 root8
第2步:建立root文件系统
  • 用busybox精简系统应用程序
    • Busybox 是 Debian GNU/Linux 的Bruce Perens 首先开发的。
    • Busybox 编译出一个单个的独立执行程序,就叫做 busybox。但是它可以根据配置,执行 ash shell 的功能,以及几十个各种小应用程序的功能。
    • 采用busybox作为Shell和系统实用程序的精简并不会改变系统的使用方式,因为编译busybox除了生成busybox这个可执行程序外,还为每个busybox替代的系统实用程序生成了一个符号链接。例如,对于ls实用程序,会生成符号连接ln -s /bin/busybox /bin/ls。
2 root9
第2步:建立root文件系统
  • 精简嵌入式系统专用程序
    • 原则一,没有用处的软件一律不安装在嵌入式系统中。
    • 原则二,如果某软件模块是必须的,则寻找是否有相同功能的嵌入式版本的软件可以作为其替代品。
      • 如用thttpd,boa等替代庞大的Apache。
    • 原则三,如果只能选择某软件模块,则通过重新配置和编译优化来进行裁减。
      • 如采用动态链接库,优化编译选项等
    • 原则四,对于自行开发的软件,在设计、开发和编译的时候都要针对嵌入式系统进行优化。
      • 调用精简的C库函数等
3 root1
第3步:制作root文件系统映像
  • 集成好的root文件系统最终要安装到嵌入式系统目标板上去 。
  • 精简的root文件系统其体积比起一般配备的只有十几MB字节大小的flash存储器来讲还是太大。
  • flash存储器的特点不允许系统像读写磁盘驱动器那样反复读写它。
  • 很多专用嵌入式Linux,如LRP等,都有自己独特的系统映像打包、组织和管理方式,但其原理都大同小异。
3 root2
第3步:制作root文件系统映像
  • 在开发主机中建立一个loop设备的临时挂接点,准备后面用来暂时挂载目标嵌入式系统的root文件系统:

mkdir /mnt/loop

  • 建立一个大小为6.6MB的临时文件并将其清零。这个文件会被用来制作root文件系统的映像,因此其大小是根据前面对root文件系统裁减的情况确定的,可以根据实际情况进行调整:dd if=/dev/zero of=/tmp/loop_tmp bs=1k count=6600
  • 在开发主机上将一个loop设备与临时文件联系起来:losetup /dev/loop0 /tmp/loop_tmp
  • 在这个loop设备上建立文件系统,Linux内核识别两种可以直接拷贝到ramdisk的文件系统,它们是minix和ext2,ext2性能更好,因此我们建立ext2文件系统:mke2fs /dev/loop0
3 root3
第3步:制作root文件系统映像
  • 将loop设备上的虚拟盘挂在前面建立挂接节点/mnt/loop上:mount /dev/loop0 /mnt/loop -t ext2
  • 将制作好的root文件系统所有内容拷贝到所挂载的节点上: cp -a /rootfs/* /mnt/loop
  • 卸下挂接点,删除建立的挂接点,再取消loop设备与临时挂接点的联系:umount /mnt/looprmdir /mnt/loop losetup -d /dev/loop0
  • 压缩文件系统后,就拥有了一个目标嵌入式系统的root文件系统的压缩映像rootfs.gz,最后删除最初建立的临时文件:dd if=/tmp/loop_tmp | gzip -9 > rootfs.gzrm -f /tmp/loop_tmp
  • 检查压缩后的root文件映像的大小,并比较目标系统的flash尺寸,如果超出了大小,还得进一步裁减root文件系统后重新制作映像:ls –l rootfs.gz
slide45
第4步:安装引导

嵌入式Linux系统启动过程

slide46
第4步:安装引导
  • 用ext2文件系统格式化flash磁盘。因为flash磁盘是装在第二个IDE接口上的,所以它是hdc设备,格式化它的第一个分区:

mke2fs /dev/hdc1

  • 挂载flash磁盘到开发系统上/mnt/temp的挂载节点上:

mount /dev/hdc1 /mnt/temp/

  • 在flash磁盘上建立用来存放映像的目录:

mkdir /mnt/temp/boot

mkdir /mnt/temp/etc

  • 拷贝先前编译好的嵌入式Linux的内核:

cp /usr/src/linux/arch/i386/boot/MiniKernel /mnt/temp/boot

  • 拷贝安装Lilo需要的文件:

cp /boot/boot.b /mnt/temp/boot/

cp /etc/lilo.conf /mnt/temp/etc/

  • 拷贝已经制作好的root文件系统的映像文件:

cp /rootfs/rootfs.gz /mnt/temp/

slide47
第4步:安装引导
  • 安装后的根目录结构(/mnt/temp/)

boot/

etc/

rootfs.gz

  • RAMDisk和initrd
    • RAMDisk就是把RAM中的一块空间拿出来作为磁盘设备来用,initrd使用了RAMDisk技术;
    • 使用initrd的理由:
      • 加载内核模块,驱动存放根文件系统的介质;
      • 相对于访问软盘,RAMDisk的速度快得多;
slide48
第4步:安装引导
  • 一般嵌入式系统烧写flash的方法
    • 用专用仪器烧写;
    • 启动bootloader后通过通信口烧写;
    • 通过BDM,JTAG等调试端口烧写
  • X86系统
    • CF卡或者DOM等都可以作为硬盘,通过IDE接口挂接在主机系统上进行读写。
ramdisk initrd
RAMDisk和initrd
  • RAMDisk就是把RAM中的一块空间拿出来作为磁盘设备来用,显然这会浪费内存;
  • initrd使用了RAMDisk技术,常用于软盘启动中;
  • 使用initrd的理由:
    • 加载内核模块,驱动存放根文件系统的介质;
    • 相对于访问软盘,RAMDisk的速度快得多;
    • 可以将软驱空闲出来;
slide50
第4步:安装引导

Lilo.conf脚本文件

##################begin################

default=linux

boot=/dev/hdc

disk=/dev/hdc

install=/boot/boot.b

image=/boot/MiniKernel

label=linux

initrd=rootfs.gz

read-write

root=/dev/ram0

append=" console=ttyS1,9600n8 ramdisk_size=65536 load_ramdisk=1"

################end####################

slide51
第4步:安装引导
  • 在flash磁盘上安装Lilo引导程序,注意参数-r指明了Lilo引导程序安装的设备:

lilo -v -r /mnt/temp/

  • 卸载flash磁盘,准备进行测试:

umount /mnt/temp/

slide52
主要内容
  • 嵌入式Linux系统基本概念
  • Linux嵌入式Linux系统裁减与移植
  • 嵌入式Linux软件开发
slide54
服务器软件系统
  • Redhat linux 装上所有的网络服务软件
  • 嵌入式linux应用系统
  • 开启nfs, telnet, ftp 服务
  • Nfs 给目标板 ,telnet与ftp给windows客户机
slide55
开发流程
  • 开发模式
    • 编写驱动程序
    • 配置、编译内核
    • 下载、引导内核
    • 用NFS文件共享调试应用程序
slide56
开发流程
  • 固化模式
    • 应用程序 + 驱动程序构建Ramdisk
    • 编译内核
    • 烧写Flash
slide57

开始

新工程

编辑源代码

网络

×××

开发板

接口

JTAG

JTAG

交叉编译

stub

接口

仿真器

CPU

Debug

USB

处理器

接口

执行

串口

USB

0

仿真调试

Dvk

程序下载

超级终端

监测结果

×××

开发板实验流程

结束

台式/笔记本式PC机

16 4 11
16.4.1 开发系统与目标系统

用网络文件系统挂接应用软件

  • 设置Linux服务器的IP地址为192.168.1.1。
  • root用户登录后用netconf命令配置支持网络文件系统服务器。
  • 设置输出目录是/usr/cross/project,而且使得主机IP为192.168.1.2可读写。
  • 保存设置后运行ntsysv使NSF启动。
  • 在编译目标系统内核时选择支持可读写NSF文件系统,并在其root文件系统的/etc/fstab文件中加入一行:
  • 192.168.1.1:/usr/cross/project /mnt/nfs nfs
  • 设目标系统的IP地址为192.168.1.2。
  • 当目标系统启动后,从开发主机telnet到目标系统,执行mount –a命令,在目标系统中的/mnt/nfs目录下就会挂载开发系统中的输出目录。
16 4 2
16.4.2 交叉编译环境
  • 开发应用程序如同嵌入式系统构建那样,同样遵循编辑,编译,最后下载到目标板运行的过程。
  • 在开发主机的开发目录/usr/cross下至少存在如下目录结构

bin/ 编译目标系统运行程序的编译器,调试器等工具

powerpc-linux/include/ 编译目标系统应用程序需要的头文件

powerpc-linux/lib/ 编译目标系统应用程序需要的运行库

project/ 开发目标系统应用程序的工作目录

16 4 21
16.4.2 交叉编译环境

(1)在开发系统的/usr/coss/project下编辑hello.c文件:

/******************************begin**********************/

#include<stdio.h>

int main(int argc, char *argv[])

{

printf(“hello, world!\n”);

return 0;

}

/*********************************end************************/

16 4 22
16.4.2 交叉编译环境

(2) 编辑hello.c程序的Makefile文件,该文件是下一步用make命令交叉编译时读取的配置文件。

##############begin######################

#定义交叉编译器

CC=powerpc-linux-gcc

#定义交叉编译的归档文件

AR=powerpc-linux-ar

#定义交叉编译的连接库

RANLIB=powerpc-linux-ranlib

#定义交叉编译器对处理器的优化参数

CFLAGS=-mcpu=860

all:

CC -g hello.c -o hello

clean:

rm -f hello.o

rm -f hello

#######################end###############

16 4 23
16.4.2 交叉编译环境

(3) 在开发系统上交叉编译hello.c文件,生成可执行文件hello:

make all

(4 )telnet登录到目标系统后进入挂载的nfs文件系统运行hello程序:

cd /mnt/nsf

./hello

注意:虽然hello程序实际是存储在开发系统上的,但是这时它是在目标系统上运行的。

16 4 3 linux
16.4.3 嵌入式Linux软件调试方法
  • GDB远程调试
  • 在线仿真调试
  • 其他调试方法
16 4 3 linux2
16.4.3 嵌入式Linux软件调试方法
  • 在开发主机上运行超级终端登录目标系统,启动调试代理进入调试状态,向调试代理指明了调试器的IP地址和端口。

gdbsever 192.168.1.1:2345 hello

  • 运行telnet登录目标系统,运行gdb调试程序:

gdb hello

  • 进入调试状态后显示提示符(gdb)指明目标程序:

(gdb)target extended-remote 192.168.1.2:2345

  • 列源代码:

(gdb)list

  • 在第四行设置断点:

(gdb)break 4

  • 运行到断点

(gdb)run

16 4 3 linux3
16.4.3 嵌入式Linux软件调试方法
  • 在线调试
    • 在处理器内部嵌入额外的控制模块,当满足了一定的触发条件时进入某种特殊状态。
    • 在该状态下,被调试程序停止运行,主机的调试器可以通过处理器外部特设的通信接口访问各种资源(寄存器、存储器等)并执行指令。
    • 接口标准有BDM, JTAG等。
16 4 3 linux4
16.4.3 嵌入式Linux软件调试方法
  • 其他调试方法
    • 最基本的printf()语句;
    • strace和ltrace分别可以分析程序的系统调用和库函数调用过程 ;
    • 如果符合POSIX标准,则可以在开发主机上用用户熟悉的集成编译开发环境来调试完成 。
ad