版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、7:481基于Linux的嵌入式软件开发7:482内容提要:n3.1 嵌入式软件结构n3.2 嵌入式软件开发流程n3.3 嵌入式linux开发环境n3.4 嵌入式系统引导代码n3.5 linux内核结构及移植n3.6 嵌入式文件系统及移植n3.7 linux设备驱动概述 n3.8 设备驱动程序接口n3.9 linux设备驱动开发流程7:4833.1嵌入式软件结构n3.1.1嵌入式软件体系结构n3.1.2基于Linux的嵌入式软件7:4843.1.1嵌入式软件体系结构7:4851.设备驱动层n设备驱动层是嵌入式系统中必不可少的重要部分,使用任何外部设备都需要有相应驱动程序的支持,它为上层软件提供
2、了设备的操作接口。上层软件不用理会设备的具体内部操作,只需调用驱动层程序提供的接口即可。驱动层一般包括硬件抽象层HAL、板级支持包BSP和设备驱动程序。7:4862.实时操作系统RTOSn对于使用操作系统的嵌入式系统而言,操作系统一般以内核映像的形式下载到目标系统中。以Linux为例,在系统开发完成之后,将整个操作系统部分做成内核映像文件,与文件系统一起传送到目标系统中;然后通过BootLoader指定地址运行Linux内核,启动已经下载好的嵌入式Linux系统;再通过操作系统解开文件系统,运行应用程序。整个嵌入式系统与通用操作系统类似,功能比不带有操作系统的嵌入式系统强大了很多。7:4873
3、.中间件层n中间件(middleware)是基础软件的一大类,属于可复用软件的范畴。顾名思义,中间件处于操作系统软件与用户的应用软件的中间。中间件在操作系统、网络和数据库之上,应用软件的下层,总的作用是为处于自己上层的应用软件提供运行与开发的环境,帮助用户灵活、高效地开发和集成复杂的应用软件。7:4884.应用程序n实际的嵌入式系统应用软件建立在系统的主任务(Main Task)基础之上。用户应用程序主要通过调用系统的API函数对系统进行操作,完成用户应用功能开发。在用户的应用程序中,也可创建用户自己的任务。任务之间的协调主要依赖于系统的消息队。 7:4893.1.2基于Linux的嵌入式软件
4、n基于嵌入式Linux的软件结构如图所示,在硬件之上的是引导程序BootLoader,然后是Linux内核,最上层是应用程序。 7:48101.BootLoadern引导装载程序通常是在任何硬件上执行的第一段代码。在象台式机这样的常规系统中,通常将引导装载程序装入主引导记录(Master Boot Record,(MBR))中,或者装入 Linux 驻留的磁盘的第一个扇区中。通常,在台式机或其它系统上,BIOS 将控制移交给引导装载程序。而在嵌入式系统中,通常并没有像BIOS那样的固件程序,因此整个系统的加载启动任务就完全由BootLoader来完成。通过这段小程序,我们可以初始化硬件设备、建
5、立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。常见的BootLoader有uboot、vivi等。引导程序的开发主要是做一些移植工作。 7:48112.内核nLinux 内核的开发主要包括Linux内核的定制、裁剪等工作。在嵌入式开发中经常要面对设备驱动程序的开发,嵌入式系统通常有许多设备用于与用户交互,象触摸屏、小键盘、滚动轮、传感器、RS232 接口、LCD 等等。除了这些设备外,还有许多其它专用设备,包括闪存、USB、GSM 等。内核通过所有这些设备各自的设备驱动程序来控制它们,包括 GUI 用户应用程序也通过访问这些驱动程序来
6、访问设备。 7:48123.应用程序n对于嵌入式Linux的应用,大多数的应用并不需要图形界面,比如交换机、路由器、嵌入式网关以及服务器等等。但是,随着消费类电子的普及,越来越多的嵌入式产品如多媒体播放、手机等手持设备需要图形用户界面(或称 GUI)的支持。因此基于GUI的应用程序的开发越来越重要。目前比较流行的GUI平台有QtEmbedded、紧缩的X Windows系统、MicroWindows以及MiniGUI系统。7:48133.2嵌入式软件开发流程n3.2.1 嵌入式Linux设计概述n3.2.2 基于开发板的二次开发 n3.2.3 基于linux的嵌入式软件开发流程 7:48143
7、.2.1 嵌入式Linux设计概述7:4815n嵌入式系统的软件开发采用一种交叉编译调试的方式。交叉编译调试环境建立在宿主机(即一台PC机)上,对应的开发平台叫做目标板。运行 Linux 的 PC(宿主机)开发时使用宿主机上的交叉编译、汇编及连接工具形成可执行的二进制代码,(这种可执行代码并不能在宿主机上执行,而只能在目标板上执行。)然后把可执行文件下载到目标机上运行。 7:4816n宿主机(host)是编辑和编译程序的平台,一般是基于 X86 的 PC 机,通常也称为主机。而目标机(target)是用户开发的系统,通常都是非 X86 平台。Host 编译得到 的可执行代码在 target 上
8、运行。7:48173.2.2 基于开发板的二次开发 n所谓二次开发是利用现成的开发板进行开发,不同于通用计算机和工作站上的软件开发工程,一个嵌入式软件的开发过程具有很多特点和不确定性。其中最重要的一点是软件跟硬件的紧密耦合特性。n由于嵌入式系统的灵活性和多样性,这样就给软件设计人员带来了极大地困难。第一,在软件设计过程中过多地考虑硬件,给开发和调试都带来了很多不便;第二,如果所有的软件工作都需要在硬件平台就绪之后进行,自然就延长了整个的系统开发周期。这些都是应该从方法上加以改进和避免的问题。n为了解决这个问题,通常的做法是基于某种开发板做二次开发,从这个角度看,硬件开发所占的比重不到20%,而
9、软件开发的比重占到了80%。7:48183.2.3 基于linux的嵌入式软件开发流程n1.建立开发环境。 n2.配置开发主机。n3.建立引导装载程序BOOTLOADER 。n4.移植Linux 操作系统 n5.建立根文件系统 n6.建立应用程序的文件系统 n7.开发应用程序 n8.烧写内核、根文件系统、应用程序。n9.发布产品。7:4819n根文件系统:nLinux系统运行所需的一些文件、命令组成的整个文件目录结构。 n文件系统:n用来方便管理文件存储和数据组织的一种方法。7:48203.3 嵌入式linux开发环境n3.3.1 ARM处理器硬件开发平台n3.3.2 建立嵌入式交叉编译环境n
10、3.3.3 配置开发环境7:48213.3.1 ARM处理器硬件开发平台7:4822nUP-CUP 6410具有良好的外部存储器结构。存储系统拥有两个外部存储器接口、DRAM 和Flash/ROM 。DRAM的端口可支持移动 DDR 。UP-CUP 6410 包括许多硬件外设,如相机接口、16 位真彩液晶 LCD 控制器、系统管理(电源管理等)、4 通道 UART 接口、32 通道 DMA 、 5 通道 32 位定时器与 2PWM 输出、通用 I / O 端口、I2S 接口、总线接口、I2C 总线接口、 USB 主机、高速 USB 接口 OTG 设备(480Mbps 的传输速度)、3 通道 S
11、D / MMC 记忆主机控制器和的 PLL 时钟发生器。ARM 子系统是基于的 ARM1176JZF-S 核心。其包括独立的 16KB 指令和 16KB 数据高速缓存,16KB 指令和 16KB 数据 TCM(Terminal-to-ComputerMultiplexer终端设备至计算机多路转接器)。它还含有一个完整的 MMU 进行处理虚拟内存管理。 7:4823nUP-CUP 6410平台可运行 Linux 2.4.x 和 Linux 2.6.x 内核,支持 QT/E、miniGUI等嵌入式图形界面。集成了 USB、SD、LCD、Camera 等常用设备接口,适用于各种手持设备、消费电子和工
12、业控制设备等产品的开发。7:48243.3.2 建立嵌入式交叉编译环境n嵌入式 LINUX 开发环境有几个方案:n1.基于 PC 机 WINDOWS 操作系统下的 CYGWIN; n2.在 WINDOWS 下安装虚拟机后,再在虚拟机中安装 LINXUX 操作系统;n3.直接安装 LINUX 操作系统。7:48253.3.3 配置开发环境n1.NFS 服务n2.minicom 设置7:48261.NFS 服务nNFS是Network File System的简称,也就是网络文件系统的意思,NFS可以使不同的计算机之间通过网络进行文件共享的一种网络协议,一般用于Linux网络系统中。实际上,一台N
13、FS服务器就如同一台文件服务器,只要将文件系统共享出来,NFS客户端就可以将它挂载到本地系统中,从而可以像使用本地文件系统中的文件一样使用那些远程文件系统中的文件 7:4827使用NFS进行嵌入式开发配置n试验箱开发板IP是0,假设PC虚拟机上IP为17:48281。如果机器上没安装nfs server,先执行如下命令安装:$ sudo apt-get install nfs-kernel-server2。配置/etc/exports比如要将home目录中的 /home/unsp/develop目录让0的IP共享, 则在该文件末
14、尾添加下列语句:/home/unsp/develop 0(rw,sync,no_root_squash)3.配置/etc/hosts.deny(禁止任何host(主机)能和你的NFS服务器进行NFS连接),加入:7:4829# NFS DAEMONSportmap:ALLlockd:ALLmountd:ALLrquotad:ALLstatd:ALL7:48304.配 置/etc/hosts.allow允许那些你想要的主机和你的NFS服务器建立连接。下列步骤将允许任何IP地址以 192.168.1开头的主机(连 接到NFS服务器上),加入:# NFS DAEMONSport
15、map: 192.168.1.lockd: 192.168.1.rquotad: 192.168.1.mountd: 192.168.1.statd: .重启NFS服务sudo /etc/init.d/portmap restartsudo /etc/init.d/nfs-kernel-server restart7:48316。在板子上执行如下命令,挂载PC上的目录(假设你的IP是21)到板子的mnt目录:mount -o nolock -t nfs 1:/home/unsp/develop/ /mnt 这样你就可以在PC上/home/unsp/d
16、evelop目录进行交叉编译,在板子/mnt目录上运行编译好的程序看效果了。7:4832n一点说明:n鉴于开发板网络可能不太稳定,建议将/mnt下程序拷贝到开发板其他本地目录下运行。7:48333.minicom 设置n(1)在 Linux 平台的 X window 界面下建立一个终端,在终端的命令行提示符后键入如下命令并回车。rootJLUZH root# minicom7:48347:4835(2)minicom 启动后,先按 CtrlA 键,再按 Z 键(注意不是连续按,Ctrl+A 松开后才按 Z),进入主配置界面, 7:4836按”O”进入配置界面 7:4837n选择 Serial
17、port setup,进入端口设置界面,这里有几个重要选项改为如下值:nASerial Device:/dev/ttyS0(端口号使用串口 1)nEBPS/par/bits: /115200 8N1(波特率)nF,E 硬件流,软件流都改为 NO,若要使用 PC机的串口 2来接板子的串口1做监控,改为:/dev/ttyS1 即可。7:48387:4839n(3)选好后按 ESC 键退出到配置界面,选择 Save setup as df1 保存退出,以后只要启动 minicom 就是该配置,无需再做改动。 7:4840Windows下超级终端设置n台式机操作演示7:4841ubuntu 10.04
18、下的配置tftp服务器n第1步:安装tftp所需的软件。首先需要安装tftp-hpa,tftpd-hpa,前者是客户端,后者是服务程序,在终端下输入 sudo apt-get install tftp-hpa tftpd-hpa,安装tftp-hpa和tftpd-hpa。然后还需要安装xinetd,在终端下输入 sudo apt-get install xinetd,安装好xinetd。 7:4842n第2步: 配置相关服务文件。进入根目录下的etc文件夹(cd /etc/),首先看目录中有没有一个xinetd.conf文件,如果没有则新建一个,有的话查看内容,看是否与下面的一致,若不一致则修
19、改,内容如下:# Simple configuration file for xinetd # # Some defaults, and include /etc/xinetd.d/ defaults # Please note that you need a log_type line to be able to use log_on_success ont-size: 12pt; # log_type = SYSLOG daemon info includedir /etc/xinetd.d 7:4843n第3步:配置tftp服务器 命令:sudo vim /etc/default/tft
20、pd-hpa 将内容修改成# /etc/default/tftpd-hpa TFTP_USERNAME=tftp TFTP_DIRECTORY=/tftpboot #这是你tftp服务器的工作目录,自行修改,注意,在新建工作目录时,最好修改其权限为777,命令sudo chmod 777 /tftpboot TFTP_ADDRESS=:69 TFTP_OPTIONS=-l -c -s 7:4844n第4步:然后进入xinetd.d文件夹(cd xinetd.d),查看是否有一个tftp文件,如果没有就新建一个,如果有的话就查看内容是否与下面的一致,不一致则修改,内容如下:serv
21、ice tftp socket_type = dgram wait = yes disable = no user = root protocol = udp server = /usr/sbin/in.tftpd server_args = -s /tftpboot #log_on_success += PID HOST DURATION #log_on_failure += HOST per_source = 11 cps =100 2 flags =IPv4 其中server_args一行是配置服务器的文件存放的位置,就是进行tftp传输的时候,都是从该文件夹中搜索文件的 7:4845n
22、第5步:修改所需文件夹的权限。需要修改的文件夹也就是上一步提到的那个服务器文件存放的文件夹,以我的配置文件为例,创建一个文件夹(sudo mkdir /tftpboot),然后把它可以设置成访问权限最宽松的(sudo chmod 777 /tftpboot),也可以设置成合适的权限。第6步:重新启动服务。sudo service tftpd-hpa restart,当配置好tftp的配置文件后,需要重新启动一下xinetd,在终端中输入 sudo /etc/init.d/xinetd reload,重新加载一下进程,再输入 sudo /etc/init.d/xinetd restart,重启服
23、务。记住,每次修改完配置文件后,都需要重新启动一下服务。执行次序:sudo service tftpd-hpa restartsudo /etc/init.d/xinetd reloadsudo /etc/init.d/xinetd restart 7:4846测试n首先在/tftpboot中新建一个文件file,然后在其中随便输入内容;然后进入一个不是/tftpboot的目录下(原因是避免混淆,因为在获取文件是,默认是将想要获取的文件存放在当前目录下的);再在终端中输入 sudo tftp localhost,进入tftp命令符下(可以在其中输入help查看命令和命令的作用),输入 get
24、file,如果没有任何提示,就说明传输成功了,然后输入 q 退出tftp命令符,在当前目录下就可以看到一个file文件,内容是与开始新建的那个file的内容是一致的。同样也可以在tftp命令符中输入 put xx,把xx文件上传到服务器文件夹中。如果一切ok,那就么一个可用的tftp服务器就顺利搭建成功了。 7:48473.4 嵌入式系统引导代码n3.4.1 Bootloader简介n3.4.2 常用的bootloadern3.4.3 Bootloader基本原理n3.4.4 Bootloader移植实例一:U_Bootn3.4.5 Bootloader移植实例二:vivi7:48483.4.
25、1 Bootloader简介n1.Bootloader的作用n2.bootloader操作模式7:48491.Bootloader的作用nBoot Loader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。 7:48502.bootloader操作模式n大多数 Boot Loader 都包含两种不同的操作模式:“启动加载”模式和“下载”模式,这种区别仅对于开发人员才有意义。但从最终用户的角度看,Boot Loader 的作用就是用来加载操作系统,而
26、并不存在所谓的启动加载模式与下载工作模式的区别。 7:4851n启动加载(Boot loading)模式:这种模式也称为“自主”(Autonomous)模式。也即 Boot Loader 从目标机上的某个固态存储设备上将操作系统加载到 RAM 中运行,整个过程并没有用户的介入。这种模式是 Boot Loader 的正常工作模式,因此在嵌入式产品发布的时侯,Boot Loader 显然必须工作在这种模式下。 n下载(Downloading)模式:在这种模式下,目标机上的 Boot Loader 将通过串口连接或网络连接等通信手段从主机(Host)下载文件到目标机的 RAM 中,然后再被 Boot
27、 Loader 写到目标机上的FLASH 类固态存储设备中.工作于这种模式下的 Boot Loader 通常都会向它的终端用户提供一个简单的命令行接口。因此产品开发时通常使用这种模式。 7:48523.4.2 常用的bootloadern1.ARMBootnArmboot是一个bootloader,是为基于ARM或者StrongARM CPU的嵌入式系统所设计的。它支持多种类型的Flash;允许映像文件经由bootp、tftp从网络传输;支持从串口线下载S-record或者binary文件;允许内存的显示及修改;支持jffs2文件系统等。Armboot源码公开,可以在http:/ Denk和I
28、ntemet上的一群自由开发人员对其进行维护和开发。支持PowerPC、ARM、MIPS、m68K等多种处理器平台,易于裁剪和调试。PPCBoot遵循GPL(通用公共许可)公约,完全开放源代码。PPCBoot源代码可以在sourceforge网站的社区服务器中获得,它的项目主页是http:/ Loader Object的缩写,是一款功能强大的Bootloader。它遵循GPL,源泉代码完全开放。Blob既可以用来简单的调试,也可以启动Linux kernel。Blob最初是Jan-Derk Bakker和Erik Mouw为一块名为LART(Linux Advanced Radio Termi
29、nal)的板子写的,该板使用的处理器是StrongARM SA-1100。现在Blob已经被移植到了很多CPU上,包括S3C44B0。7:4857n6.ViVinVivi 是韩国mizi 公司开发的bootloader, 适用于ARM9处理器。 Vivi有两种工作模式:启动加载模式和下载模式。启动加载模式可以在一段时间后(这个时间可更改)自行启动linux内核,这时vivi的默认模式。在下载模式下,vivi为用户提供一个命令行接口,通过接口可以使用vivi提供的一些命令。7:48583.4.3 Bootloader基本原理n同时装有 Boot Loader、内核的启动参数、内核映像和根文件系统
30、映像的固态存储设备的典型空间分配结构图。 7:4859n在嵌入式世界里建立一个通用的 Boot Loader 几乎是不可能的。尽管如此,我们仍然可以对 Boot Loader 归纳出一些通用的概念来,以指导用户特定的 Boot Loader 设计与实现。n大多数 Boot Loader 都分为 stage1 和 stage2 两大部分。依赖于 CPU 体系结构的代码,比如设备初始化代码等,通常都放在 stage1 中,而且通常都用汇编语言来实现,以达到短小精悍的目的。而 stage2 则通常用C语言来实现,这样可以实现给复杂的功能,而且代码会具有更好的可读性和可移植性。 7:4860stage
31、1Boot Loader 的 stage1 通常包括以下步骤(以执行的先后顺序):n硬件设备初始化。n为加载 Boot Loader 的 stage2 准备 RAM 空间。 n拷贝 Boot Loader 的 stage2 到 RAM 空间中。 n设置好堆栈。 n跳转到 stage2 的 C 入口点。7:4861stage2nBoot Loader 的 stage2 通常包括以下步骤(以执行的先后顺序):n初始化本阶段要使用到的硬件设备。n检测系统内存映射(memory map)。 n将 kernel 映像和根文件系统映像从 flash 上读到 RAM 空间中。 n为内核设置启动参数。 n调用
32、内核。 7:4862第一阶段:Boot Loader 的 stage1n1.基本的硬件初始化n这是 Boot Loader 一开始就执行的操作,其目的是为 stage2 的执行以及随后的 kernel 的执行准备好一些基本的硬件环境。它通常包括以下步骤(以执行的先后顺序): n(1)屏蔽所有的中断。为中断提供服务通常是 OS 设备驱动程序的责任,因此在 Boot Loader 的执行全过程中可以不必响应任何中断。中断屏蔽可以通过写 CPU 的中断屏蔽寄存器或状态寄存器(比如 ARM 的 CPSR 寄存器)来完成。 n(2)设置 CPU 的速度和时钟频率。 7:4863n(3)RAM 初始化。包
33、括正确地设置系统的内存控制器的功能寄存器以及各内存控制寄存器等。 n(4)初始化 LED。典型地,通过 GPIO 来驱动 LED,其目的是表明系统的状态是 OK 还是 Error。如果板子上没有 LED,那么也可以通过初始化 UART 向串口打印 Boot Loader 的 Logo 字符信息来完成这一点。 n(5)关闭 CPU 内部指令数据 cache。7:4864n2.为加载 stage2 准备 RAM 空间n为了后面的叙述方便,这里把所安排的 RAM 空间范围的大小记为:stage2_size(字节),把起始地址和终止地址分别记为:stage2_start 和 stage2_end(这两
34、个地址均以 4 字节边界对齐)。因此: n stage2_endstage2_startstage2_size n另外,还必须确保所安排的地址范围的的确确是可读写的 RAM 空间,因此,必须对你所安排的地址范围进行测试。 7:4865n3.拷贝 stage2 到 RAM 中 n拷贝时要确定两点:(1) stage2 的可执行映象在固态存储设备的存放起始地址和终止地址;(2) RAM 空间的起始地址。 7:4866n4.设置堆栈指针 sp n堆栈指针的设置是为了执行 C 语言代码作好准备。通常我们可以把 sp 的值设置为(stage2_end-4),也即在上面所安排的那个 1MB 的 RAM 空
35、间的最顶端(堆栈向下生长)。 n此外,在设置堆栈指针 sp 之前,也可以关闭 led 灯,以提示用户我们准备跳转到 stage2。经过上述这些执行步骤后,系统的物理内存布局应该如下图 7:48677:4868n5.跳转到 stage2 的 C 入口点 n在上述一切都就绪后,就可以跳转到 Boot Loader 的 stage2 去执行了。比如,在 ARM 系统中,这可以通过修改 PC 寄存器为合适的地址来实现。7:4869第二阶段:Boot Loader 的 stage2 n1.初始化本阶段要使用到的硬件设备 n这通常包括:(1)初始化至少一个串口,以便和终端用户进行 I/O 输出信息;(2)
36、初始化计时器等。在初始化这些设备之前,也可以重新把 LED 灯点亮,以表明我们已经进入 main() 函数执行。设备初始化完成后,可以输出一些打印信息,程序名字字符串、版本号等。 7:4870n2.检测系统的内存映射(memory map) n所谓内存映射就是指在整个 4GB 物理地址空间中有哪些地址范围被分配用来寻址系统的 RAM 单元。比如,在 SA-1100 CPU 中,从 0 xC000,0000 开始的 512M 地址空间被用作系统的 RAM 地址空间,而在 Samsung S3C44B0X CPU 中,从 0 x0c00,0000 到 0 x1000,0000 之间的 64M 地址
37、空间被用作系统的 RAM 地址空间。虽然 CPU 通常预留出一大段足够的地址空间给系统 RAM,但是在搭建具体的嵌入式系统时却不一定会实现 CPU 预留的全部 RAM 地址空间。 7:4871n3.加载内核映像和根文件系统映像 n(1) 规划内存占用的布局 n这里包括两个方面:内核映像所占用的内存范围;根文件系统所占用的内存范围。在规划内存占用的布局时,主要考虑基地址和映像的大小两个方面。 n(2)从 Flash 上拷贝 n由于像 ARM 这样的嵌入式 CPU 通常都是在统一的内存地址空间中寻址 Flash 等固态存储设备的,因此从 Flash 上读取数据与从 RAM 单元中读取数据并没有什么
38、不同。 7:4872n用一个简单的循环就可以完成从 Flash 设备上拷贝映像的工作: nwhile(count) *dest+ = *src+; /* 都是以字方式对齐 */count -= 4; /* 字节数 */;7:4873n4.设置内核的启动参数 n应该说,在将内核映像和根文件系统映像拷贝到 RAM 空间中后,就可以准备启动 Linux 内核了。但是在调用内核之前,应该作一步准备工作,即:设置 Linux 内核的启动参数。 7:4874n5.调用内核 nBoot Loader 调用 Linux 内核的方法是直接跳转到内核的第一条指令处,也即直接跳转到 MEM_START0 x8000
39、 地址处。 7:48753.4.4 Bootloader移植实例一:U_Bootn1.U-Boot概述nU-Boot可支持的主要功能如下。n系统引导:支持NFS挂载、RAMDISK(压缩或非压缩)形式的根文件系统。支持NFS挂载,并从FLASH中引导压缩或非压缩系统内核。n基本辅助功能:强大的操作系统接口功能;可灵活设置、传递多个关键参数给操作系统,适合系统在不同开发阶段的调试要求与产品发布,尤其对Linux支持最为强劲;支持目标板环境参数多种存储方式,如FLASH、NVRAM、EEPROM;CRC32校验,可校验FLASH中内核、RAMDISK镜像文件是否完好。n设备驱动:串口、SDRAM、
40、FLASH、以太网、LCD、NVRAM、EEPROM、键盘、USB、PCMCIA、PCI、RTC等驱动支持。n上电自检功能:SDRAM、FLASH大小自动检测;SDRAM故障检测;CPU型号。n特殊功能:XIP内核引导。7:4876U-Boot 源代码分析1 第一阶段(Stage 1)第一阶段的启动代码在cpustart.S 中,完成的工作主要有: CPU 自身初始化:包括MMU,Cache,时钟系统,SDRAM 控制器等的初始化 重定位:把自己从非易失性存储器搬移到RAM 中 分配堆栈空间,设置堆栈指针 清零BSS 数据段 跳转到第二阶段入口函数 start_armboot()7:48772
41、 第二阶段(Stage 2)第二阶段是U-Boot 的主体,入口点是lib_armboard.c 中的start_armboot()函数,完成的主要工作包括: 为U-Boot 内部私有数据分配存储空间,并清零 依次调用函数指针数组init_sequence 中定义的函数进行一系列的初始化 如果系统支持NOR Flash,调用flash_init ()和display_flash_config ()初始化并显示检测到的器件信息(AT91SAM9260EK 不需要) 如果系统支持LCD 或VFD,调用lcd_setmem()或vfd_setmem()计算帧缓冲(Framebuffer)大小,然后在
42、BSS 数据段之后为Framebuffer 分配空间,初始化gd-fb_base 为Framebuffer 的起始地址(AT91SAM9260EK 不需要) 调用mem_malloc_init()进行存储分配系统(类似于C 语言中的堆)的初始化和空间分配7:4878如果系统支持NAND Flash,调用nand_init ()进行初始化 如果系统支持DataFlash,调用AT91F_DataflashInit()和dataflash_print_info()进行初始化并显示检测到的器件信息 调用env_relocate ()进行环境变量的重定位,即从Flash 中搬移到RAM 中 如果系统支
43、持VFD,调用drv_vfd_init()进行VFD 设备初始化(AT91SAM9260EK 不需要) 从环境变量中读取IP 地址和MAC 地址, 初始化gd-bd- bi_ip_addr 和gd-bd-bi_enetaddr 调用jumptable_init ()进行跳转表初始化,跳转表在global_data 中,具体用途尚不清楚7:4879调用console_init_r()进行控制台初始化 如果需要,调用misc_init_r ()进行杂项初始化 调用enable_interrupts ()打开中断 如果需要,调用board_late_init()进行单板后期初始化,对于AT91SAM
44、9260EK,主要是以太网初始化 进入主循环:根据用户的选择启动linux,或者进入命令循环执行用户输入的命令7:48802.源码阅读n从网站上下载得到U-Boot源码包,例如:U-Boot-1.1.6.tar.bz2,解压就可以得到全部U-Boot源程序。在顶层目录下有18个子目录,分别存放和管理不同的源程序。这些目录中所要存放的文件有其规则,可以分为3类。n 第1类目录与处理器体系结构或者开发板硬件直接相关;n 第2类目录是一些通用的函数或者驱动程序;n 第3类目录是U-Boot的应用程序、工具或者文档。7:48817:4882nBoard目录:存放和一些已有开发板有关的文件,比如Make
45、file和U-Boot.lds等都和具体开发板的硬件和地址分配有关,nCommon目录:存放与体系结构无关的文件,实现各种命令的C文件。nCpu目录:存放CPU相关文件,其中的子目录都是以U-BOOT所支持的CPU为名,比如有子目录arm926ejs、mips、mpc8260和nios等,每个特定的子目录中都包括cpu.c和interrupt.c,start.S。其中cpu.c初始化CPU、设置指令Cache和数据Cache等。interrupt.c设置系统的各种中断和异常,比如快速中断、开关中断、时钟中断、软件中断、预取中止和未定义指令等;start.S是U-BOOT启动时执行的第一个文件,
46、它主要是设置系统堆栈和工作方式,为进入C程序奠定基础。7:4883nDisk目录:存放disk驱动的分区处理代码。nDoc目录:存放开发使用的文档。nDrivers目录:存放通用设备驱动程序,比如各种网卡、支持CF1的Flash、串口和USB总线等。nFs目录:存放支持文件系统的文件,U-BOOT现在支持cramfs、fat、fdos、jffs2和registerfs。nnet目录:存放与网络有关的代码,BOOTP协议、TFTP协议、RARP协议和NFS文件系统的实现。nlib_arm目录:存放与ARM体系结构相关的代码。ntools目录:存放创建S-Record格式文件和U-BOOT ima
47、ges的工具。nInclude存放:头文件,还有对各种硬件平台支持的汇编文件,系统的配置文件和对文件系统支持的文件。 7:48843.u-boot的移植n(1)在顶层Makefile中为开发板添加新的配置选项 n(2)创建一个新目录存放开发板相关的代码,并且添加文件。n(3)为开发板添加新的配置文件n(4)配置开发板n(5)编译U-Bootn(6)添加驱动或者功能选项n(7)调试U-Boot源代码,直到U-Boot在开发板上能够正常启动。7:48854.烧写U-Bootn新开发的电路板没有任何程序可以执行,也就不能启动,需要先将U-Boot烧写到Flash中。n多数嵌入式单板通过处理器的调试接
48、口,直接对板上的Flash编程。最简单方式就是通过JTAG电缆,转接到计算机并口连接。把Bootloader下载并烧写到Flash中。n烧写完成后,复位实验板,串口终端应该显示U-Boot的启动信息。 7:48863.4.5 Bootloader移植实例二:vivin1.vivi概述nvivi是由韩国Mizi公司开发的一种Bootloader,适合于ARM9处理器,支持S3C2410 x处理器,其源代码可以在http:/网站下载。和所有的Bootloader一样,vivi有两种工作模式,即启动加载模式和下载模式。当vivi处于下载模式时, 它为用户提供一个命令行接口,通过该接口能使用vivi提
49、供的一些命令集。大多数Bootloader都分为stage1和stage2两部分,stage2 的代码通常用 C 语言来实现,以便于实现更复杂的功能并取得更好的代码可读性和可移植性。7:48872.vivi源码导读n代码基本结构7:4888narch:此目录包括了所有vivi支持的目标板的子目录,例如s3c2410目录。nDocumentation:存放一些使用VIVI的帮助文档。ndrivers:其中包括了引导内核需要的设备的驱动程序(MTD和串口)。MTD目录下分map、nand和nor三个目录。ninit:这个目录只有main.c和version.c两个文件。和普通的C程序一样,vivi
50、将从main函数开始执行。7:4889ninclude:头文件的公共目录,其中的s3c2410.h定义了这块处理器的一些寄存器。Platform/smdk2410.h定义了与开发板相关的资源配置参数,我们往往只需要修改这个文件就可以配置目标板的参数,如波特率、引导参数、物理内存映射等。nlib:一些平台公共的接口代码,比如time.c里的udelay()和mdelay()。nScripts:存放VIVI脚本配置文件。nTest: 存放一些测试代码文件。nUtil:存放一些NAND Flash烧写image相关的工具实现代码。7:4890n3.vivi的移植nvivi作为Linux系统的启动代码
51、,在编译配置时需要用到函数库,包括交叉编译器库和头文件,交叉编译开关选项设置,还包括Linux内核代码中的库和头文件,所以,通常需要修改vivi工程管理文件Makefile。 7:4891n(1)vivi中与硬件相关的初始化n(2)对不同Flash启动的修改n(3)内核启动参数设置7:48923.5 linux内核结构及移植n3.5.1 linux内核结构n3.5.2 linux的移植n3.5.3 修改linux内核源码n3.5.4 内核的裁剪n3.5.5内核的编译和下载7:48933.5.1 linux内核结构7:4894nLinux 内核可以进一步划分成 3 层。最上面是系统调用接口,它实
52、现了一些基本的功能,例如 read 和 write。系统调用接口之下是内核代码,可以更精确地定义为独立于体系结构的内核代码。这些代码是 Linux 所支持的所有处理器体系结构所通用的。在这些代码之下是依赖于体系结构的代码,构成了通常称为 BSP(Board Support Package)的部分。这些代码用作给定体系结构的处理器和特定于平台的代码。7:48952.Linux 内核的主要子系统7:4896n(1)进程调度n(2)进程间通信n(3)内存管理n(4)虚拟文件系统n(5)网络堆栈n(6)设备驱动程序n(7)依赖体系结构的代码7:4897(1)进程调度nSCI 层提供了某些机制执行从用户
53、空间到内核的函数调用。SCI 实际上是一个非常有用的函数调用多路复用和多路分解服务。在 ./linux/kernel 中您可以找到 SCI 的实现,并在 ./linux/arch 中找到依赖于体系结构的部分。 7:4898(2)进程间通信n支持进程间各种通信机制,包括管道、FIFO、共享内存、信号、消息队列、套接字等。 7:4899(3)内存管理n内核所管理的另外一个重要资源是内存。为了提高效率,如果由硬件管理虚拟内存,内存是按照所谓的内存页 方式进行管理的(对于大部分体系结构来说都是 4KB)。Linux 包括了管理可用内存的方式,以及物理和虚拟映射所使用的硬件机制。7:48100(4)虚拟
54、文件系统n虚拟文件系统(VFS)是 Linux 内核中非常有用的一个方面,因为它为文件系统提供了一个通用的接口抽象。VFS 在 SCI 和内核所支持的文件系统之间提供了一个交换层。 7:48101(5)网络堆栈n网络堆栈在设计上遵循模拟协议本身的分层体系结构。回想一下,Internet Protocol (IP) 是传输协议(通常称为传输控制协议或 TCP)下面的核心网络层协议。TCP 上面是 socket 层,它是通过 SCI 进行调用的。7:48102(6)设备驱动程序nLinux 内核中有大量代码都在设备驱动程序中,它们能够运转特定的硬件设备。Linux 源码树提供了一个驱动程序子目录,
55、这个目录又进一步划分为各种支持设备,例如 Bluetooth、I2C、serial 等。设备驱动程序的代码可以在 ./linux/drivers 中找到。7:48103(7)依赖体系结构的代码n尽管 Linux 很大程度上独立于所运行的体系结构,但是有些元素则必须考虑体系结构才能正常操作并实现更高效率。./linux/arch 子目录定义了内核源代码中依赖于体系结构的部分,其中包含了各种特定于体系结构的子目录(共同组成了 BSP)。 7:481043.Linux 内核的技术特点nLinux内核最注重实用和效率:Linux内核被设计成分层的微内核,所以效率高,紧凑性强。 nLinux内核纯粹是一
56、种被动调用服务对象。所谓被动是指Linux内核为用户进程服务的唯一方式是用户进程通过系统调用来请求在内核空间运行某个函数。内核本身是一种函数和数据结构的集合,不存在运行的内核进程为用户进程服务。虽然Linux的确存在一种被称为内核线程的进程,但它并不是用来服务于用户进程的,仅仅作为系统自身的服务目的。7:48105nLinux内核采用虚拟内存技术,每个进程的虚拟内存空间为4GB。其中0-3G属于用户空间,称为用户段,3G-4G属于内核空间,称为内核段。nLinux 最新的一个增强是可以用作其他操作系统的操作系统(称为系统管理程序)。 7:481063.5.2 linux的移植n1.linux的
57、源代码结构n2.linux的移植7:481071.linux的源代码结构7:48108n(1)linux目录:该是源代码的主目录,在该主目录中包括所有的子目录,还含有唯一的一个Makefile文件。该文件是编译辅助工具软件make的参数配置文件。make工具软件的主要用途是通过识别哪些文件已被修改过,从而自动地决定在一个含有多个源程序文件的程序系统中哪些文件需要被重新编译。因此,make工具软件是程序项目的管理软件。nlinux目录下的这个Makefile文件还嵌套地调用了所有子目录中包含的Makefile文件。这样,当linux目录(包括子目录)下的任何文件被修改过时,make都会对其进行重
58、新编译。因此为了编译整个内核所有的源代码文件,只要在linux目录下运行一次make软件即可。 7:48109n(2)arch目录:包含和硬件体系结构相关的代码,每种平台占一个相应的目录。该目录包含了此内核源码所支持的硬件体系结构相关的内核源码。在这个目录下,针对不同体系结构所移植的版本都有三个子目录:kernel、lib和mm。 nkernel子目录包含依赖于体系结构实现的一般内核功能,如信号处理、时钟处理等;nlib子目录包含库函数的本地实现,如果从依赖于体系结构的源码编译,则运行更快;nmm子目录包含存储管理实现的代码。 7:48110n(3)block目录:存放部分块设备驱动程序。n(
59、4)crypto目录:存放常用加密和散列算法(如AES、SHA等),还有一些压缩和CRC校验算法。n(5)Documentation目录:存放关于内核各部分的通用解释和注释。n(6)drivers目录:存放设备驱动程序,每个不同的驱动占用一个子目录,如声卡的驱动对应于drivers/sound。这个目录拥有50%以上的内核源码,系统中所有的设备驱动程序都位于该目录中。n(7)fs目录:Linux支持的文件系统代码。不同的文件系统有不同的子目录与之对应。如ext、fat、ntfs等。n(8)include目录:存放头文件,包括了内核的大多数头文件,另外对每种支持的体系结构分别有一个子目录。其中,
60、和系统相关的头文件被放置在linux子目录下。7:48111n(9)init目录:存放内核初始化代码(注意不是系统引导代码)。包含了所有系统的初始化源码,许多主要的文件,如main.c就位于该目录下。该文件还包含了许多核心代码如实现fork()的代码和最常执行的代码cpuidle()循环。n(10)ipc目录:处理进程间通信的全部所需的代码都放在该目录下。n(11)kernel目录:内核的最核心部分,许多最常调用的内核函数放在该目录下。包括调度器fork()和timer.c等,和平台相关的一部分代码放在arch/*/kernel目录下。n(12)lib目录:存放库文件代码。该目录放置内核其他部
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 急性肺栓塞的护理与多学科团队合作
- 探究初中化学实验趣味性提升策略研究教学研究课题报告
- 山东省体育局所属事业单位2025年度公开招聘人员备考题库及参考答案详解
- 浙江银行招聘-招商银行温州分行2026年社会招聘备考题库附答案
- 2026年广西培贤国际职业学院单招职业技能测试题库新版
- 2026年江西工业贸易职业技术学院单招职业技能测试模拟测试卷必考题
- 2026年兰州工商学院教师招聘50人备考题库新版
- 2026年江苏医药职业学院单招职业适应性测试题库新版
- 2026广西梧州市卫生幼儿园招聘1人参考题库含答案
- 2026年岳阳现代服务职业学院单招职业倾向性考试题库附答案
- 上海市园林工程估算指标(SHA2-12-2025)
- 涉水工程影响国家基本水文测站影响评价分析报告
- 黄芪中药课件
- 沈阳盛京军胜农业发展科技有限公司及所属企业2025年面向社会招聘备考题库带答案详解
- 入驻直播协议书
- 血液净化中心(透析室)年度述职报告
- 酒吧消防安培训
- 养老院消防培训方案2025年课件
- Smaart7产品使用说明手册
- 烟站述职报告(4篇)
- 盖州市水务有限责任公司2025年工作总结暨2026年工作计划
评论
0/150
提交评论