已阅读5页,还剩25页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 y第4章 嵌入式Linux软件开发环境搭建1.1 体验嵌入式linux系统1. 获得光盘image目录提供的映像文件2. 使用h-jtag将u-boot.bin烧写进nor flash中3. 启动超级终端,设置bautrate为115200,8IN1。重启开发板,将会进入u-boot的命令界面。表明bootloader已正常运行Dennis Yang 4. 在PC机上安装usb驱动(安装文件位于光盘softwareUSB Download Driver.exe)5. 用usb线将PC机与开发板连接起来6. 在PC机上启动USB传输软件dnw(位于光盘softwarednw.exe)7. 在开发板上输入usbslave命令,让开发板进入等待接收数据状态Dennis Yang usbslave 1 0x32000000USB host is connected. Waiting a download8. 在dnw软件界面,单击“USB Port”-“Transmit/Restore”,找到image目录中的kernel文件uImage(如果你使用的是天嵌tq2440,请选择uImage-embsky),进行传输。这将导致uImage被传输到开发板内存的0x32000000处Dennis Yang usbslave 1 0x32000000USB host is connected. Waiting a download.Now, Downloading ADDRESS:32000000h,TOTAL:1518826RECEIVED FILE SIZE: 1518826 (741KB/S, 2S)9. 在u-boot命令行输入命令,将nand flash的0x100000 - 0x400000区间擦除(格式化)Dennis Yang nand erase 0x100000 0x300000NAND erase: device 0 offset 0x100000, size 0x30000Erasing at 0x120000 - 133% complete.OK10. 在u-boot命令行输入命令,将内存0x32000000处的kernel烧写到nand flash的0x100000- 0x400000区间Dennis Yang nand write.jffs2 0x32000000 0x100000 0x300000NAND write: device 0 offset 0x100000, size 0x300000Writing data at 0x3ff800 - 100% complete. 3145728 bytes written: OK11. 使用相同的方法将根文件系统(myfs-128M.jffs2,如果使用64M的nand flash,请选择myfs-64M.jffs2)烧写到nand flash的0x400000 - 0x3c00000区间Dennis Yang usbslave 1 0x30000000USB host is connected. Waiting a download.Now, Downloading ADDRESS:30000000h,TOTAL:24594994RECEIVED FILE SIZE:24594994 (667KB/S, 36S)Dennis Yang nand erase 0x400000 0x3c00000NAND erase: device 0 offset 0x400000, size 0x3c00000Erasing at 0x3fe0000 - 100% complete.OKDennis Yang nand write.jffs2 0x30000000 0x400000 $(filesize)NAND write: device 0 offset 0x400000, size 0x1774a28Writing data at 0x1b74800 - 100% complete. 24594984 bytes written: OK12. 输入启动操作系统命令,将进入linux操作系统Dennis Yang boot13. 使用触笔进行屏幕校正后,将进入qtopia图形系统如果由于屏幕校正不准确而不能正常使用触摸屏的话,请删除/etc/pointercal文件后,重启开发板,重新进行校正14. 在linux命令提示符下,播放歌曲# madplay /music/pianpianxihuanni.mp3MPEG Audio Decoder 0.15.2 (beta) - Copyright (C) 2000-2004 Robert Leslie et al. Title: Track 1 Artist: 陳百強 Orchestra: 陳百強 Album: Best Memory Track: 15 Genre: Other1.2 Linux操作系统安装1.2.1 在Window上安装虚拟机本书基于ubuntu9.10进行开发,它是一个容易安装和使用的Linux发行版,光盘映像文件可以自由从互联网上获得,在配套光盘中提供了该文件(software/ubuntu-9.10-desktop-i386.iso)。下面介绍在Window中通过vmware来安装ubuntu的方法。特别说明:本书在虚拟机中使用2个硬盘,40G的硬盘用于挂载root分区(/)并制作snapshot,这样可以在系统损坏时,快速的一键恢复;80G硬盘用于挂载work分区(/work),并设置为不受snapshot影响的独立硬盘,以后将在这个分区上编辑、编译软件,这样可以避免当系统出错后使用snapshot恢复时,不破坏学习成果。请按照如下的一系列操作建立虚拟机。1. 在window上安装vmware workstation 7.0软件该软件可以从wmware的官方网站下载2. 启动vmware,新建客户虚拟机。选择File-New-Virtual Machine(1)在主机能联通互联网的情况下,图4 - 9选择虚拟机与主机的互联方式为NAT,使得虚拟机可以通过主机联通互联网(2)图4 - 13中选择“Split disk into 2GB files”,表示使用多个小于2GB的文件来表示一个很大的硬盘。如果windows的硬盘格式为FAT32,请务必选择此选项,因为FAT32支持的最大文件大小为4GB,否则虚拟机将无法启动;如果是NTFS格式,就无需选择这个选项。(3)图4 - 16中选择“Edit virtual machine settings”,可以增减、修改虚拟机的设备(4)图4 - 18用于新增第2个硬盘,大小80G,用于将来挂载work分区(5)图4 - 19设置新增的硬盘不受snapshot影响,即该硬盘上修改的内容不会被一键恢复(6)图4 - 20设置虚拟机使用光盘映像文件,这相当于将ubuntu的安装光盘插入了虚拟机的光驱。请务必确保“connect at power on”选项被选中,这样当虚拟机启动时就能够从光盘启动,以便可以安装linux操作系统图4 - 1 选择新建虚拟机图4 - 2 选择定制虚拟机图4 - 3 选择虚拟机版本图4 - 4 选择虚拟机安装操作系统方式图4 - 5 选择虚拟机操作系统图4 - 6 设置虚拟机名字及存储位置图4 - 7 设置虚拟机CPU数目图4- 8 设置虚拟机内存数量图4 - 9 指定虚拟机同主机互联的方式图4 - 10 指定虚拟机硬盘控制器类型图4 - 11 选择创建新的虚拟硬盘图4 - 12 选择硬盘类型图4 - 13 指定虚拟硬盘容量图4 - 14 设置虚拟硬盘文件的名字(在windows下将新建一个文件来表示这个虚拟硬盘)图4 - 15 虚拟机设置总结图4 - 16 修改虚拟机属性图4 - 17 增加新硬件图4 - 18 选择增加新硬盘图4 - 19 设置硬盘不受snapshot影响图4 - 20 在虚拟机光驱上使用光盘映像文件 1.2.2 在虚拟机上安装Linux操作系统ubuntu9.10本书使用ubuntu9.10的光盘映像文件ubuntu9.10-desktop-i386.iso进行安装。下面介绍关键步骤,其它步骤可以参见安装时出现的说明。1. 单击vmware7.0的主菜单:VM-power-power on,启动虚拟机。此时虚拟机会从ubuntu9.10的安装光盘启动,进入安装ubuntu 的界面图4 - 21 选择安装ubuntu2. 在图4 - 21中使用键盘选择“Install Ubuntu”,会进入ubuntu安装的图形界面,以后各个步骤中,大多数情况下只需选择“下一步”即可。特别说明:此时鼠标和键盘被虚拟机接管,你将无法操作window主机。如想从虚拟机退出到windows主机,按“ctrl+alt”即可;之后如想重新操控虚拟机,请用鼠标单击虚拟机的安装界面3. 安装过程中,当出现图4 - 22时,需要选择“specify partitions manually(advanced)”选项,以便手动对2个硬盘进行分区图4 - 22 指定手动对硬盘进行分区4. 在分区界面中,将第1个硬盘(/dev/sda)分为2个区:/dev/sda1分区大小39G,挂载root目录(/),文件系统为ext3;/dev/sda2分区大小1G,挂载交换分区(swap)。将第2个硬盘(/dev/sdb)划分为1个分区(/dev/sdb1),大小80G,挂载/work目录,文件系统为ext3。如图4 - 23所示。特别说明:l 在linux操作系统中,对于SCSI磁盘,用sdx来表示,第1个磁盘x为a,第2个磁盘x为b,依次类推l 磁盘上的第1个分区编号为1,第2个分区编号为2,依次类推l ext3文件系统是linux在PC机上最常用的硬盘文件系统。在嵌入式设备上则常用jffs2文件系统和yaffs2文件系统l swap分区,用于linux在运行期间的虚拟内存使用,其作用类似windows中的交换文件pagefile.sys图4 - 23 对虚拟机硬盘进行分区5. 当出现图4 - 24时,设置ubuntu的第1个普通用户登录名为dennis,密码为1234。用户dennis将成为使用ubuntu操作系统的主要用户图4 - 24 设置ubuntu中第1个普通用户的登录名和密码6. 安装完成后,请务必在图4 - 20中去掉“Connect at power on”选项,以便使得虚拟机重启后从硬盘启动,而不是从光盘启动。1.3 在ubuntu9.10中安装基本的开发环境使用光盘安装的ubuntu9.10是一个比较精简的linux发行版,大部分软件和工具都没有安装,这些工具和软件都需要从互联网上获得和安装,这正是ubuntu的一大优点之一,因为只要能联通互联网就能安装数量不断增加、版本不断更新的优质软件,而不必考虑从哪里去获得它们。但对习惯了windows setup.exe的初学者而言,则是一大缺点,因为在使用ubuntu的过程中总是完成不了想完成的工作,原因是该工具软件没有安装,而初学者总是无所适从,因为不知道应该如何安装该工具软件。为了避免你在学习本书的过程中,遇到这样恼人的尴尬,请按如下步骤在ubuntu中安装学习本书的过程中要用到的所有软件。当然你要是想快速学习本书,不想浪费时间安装这些工具软件的话,可以直接使用配套光盘中已经制作好的虚拟机(位于光盘的ubuntu910目录中),它已经安装了学习本书所需的所有软件。使用已制作好的虚拟机的方法是:将配套光盘的整个ubuntu910目录全拷贝到windows主机的C盘根目录;去掉该目录中所有文件的只读属性;在vmware7.0主菜单中选择File-Open,找到C:ubuntu910目录下的Ubuntu910.vmx文件,单击打开即可。登录ubuntu的用户名为dennis,密码为1234。特别提醒:在安装软件前,务必确保window主机能够联通互联网,虚拟机与window主机的联接方式为NAT。1. 安装编辑器vim$ sudo apt-get update$ sudo apt-get install vim特别说明:l 出于操作安全考虑,默认情况下ubuntu不允许root用户登录,所以一般情况下都使用普通用户dennis登录系统进行操作,而安装软件的操作需要root权限,所以需要在执行apt-get前加上sudo命令,表示以管理员的身份执行apt-get命令。此后系统会要求你输入密码,你只需要输入dennis的密码1234即可。l apt-get是ubuntu系统提供的从互联网上安装软件的命令行工具,install是apt-get的参数,表示安装。常用的参数还有uninstall表示卸载软件,update表示更新软件数据库,以获得最新可安装软件的列表。l vim是要安装的软件的名字2. 安装基本的开发环境$ sudo apt-get install build-essential3. 安装语法、词法分析器$ sudo apt-get install bison flex4. 安装C以及C+函数库man手册$ sudo apt-get install manpages-dev manpages-posix-dev glibc-doc5. 安装串口工具minicom和ckermit$ sudo apt-get install minicom ckermit6. 安装已经制作好的arm平台的交叉编译工具链交叉编译工具链是进行嵌入式开发必须具备的基础工具。它的获得,最原始的方法是下载编译器gcc、C库glibc、二进制工具binutil的源代码,然后进行复杂的编译过程得到。该方法需要制作者具备很强的关于编译器和C库的知识和经验,而且制作过程极其不易成功。因此本书光盘中提供了制作好的交叉编译工具链(wok/sysbuild/arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2),只需要解压即可。该文件如何从window主机上传到linux虚拟机,请参见“ubuntu9.10上网络服务的安装与配置”的ftp服务器部分。(1)将交叉编译工具链解压到/usr/local/arm$ sudo tar xjvf arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2 -C /usr/local/arm说明:l tar是linux下的打包、解包命令,命令中的选项x表示解包,对应的打包的选项是cl 选项j表示在解包(打包)过程中调用bzip2进行解压缩(压缩),对应的z选项表示调用gzip。后缀名为bz2的文件通常是由bzip2进行压缩的,而后缀名为gz的文件通常是由gzip压缩的。l 选项f表示后面跟的参数是要打包或解包的文件的名称l -C后跟的参数表示要解包到的目标位置(2)修改交叉编译工具链目录权限$ sudo chown dennis:dennis /usr/local/arm/gcc-3.4.5-glibc-2.3.6 R执行这个操作的原因是:本书学习过程中要编译一些新的C库文件并将其拷贝到交叉编译工具链的相关目录中。(3)修改PATH环境变量,使其包含交叉编译器的路径使用vim,将/etc/environment文件中的内容由PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games改为PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/arm/gcc-3.4.5-glibc-2.3.6/bin退出系统重新登录后,输入arm-linux-gcc v,如出现图4 - 25 验证交叉编译工具链安装成功则表示交叉编译工具链安装成功。7. 安装移植qtopia的时候所需的工具$ sudo apt-get install x-dev libx11-dev x11proto-xext-dev libxext-dev libqt3-mt-dev uuid uuid-dev8. 安装配置内核(make menuconfig)时需要的ncurse库$ sudo apt-get install libncurses5 libncursesw5 libncurses5-dev ncurses-base ncurses-bin9. 安装制作根文件系统的jffs2映像时需要的工具软件$ sudo apt-get install mtd-utils10. 安装编译tslib时需要的工具软件$ sudo apt-get install m4 autoconf automake libtool1.4 ubuntu9.10上网络服务的安装与配置我们将在ubuntu上配置2个网络服务:ftp服务和nfs服务。前者用于在window主机与linux虚拟机之间交换数据,后者用于在开发板和linux虚拟机之间交换数据。1.4.1 设置vmware网络目前虚拟机只有1张网卡,其被设置为NAT的连接方式,我们可以通过它实现windows主机与linux虚拟机的通信;此外,还需要为虚拟机增加1张网卡,并将其桥接到windows主机的物理网卡上,通过它可实现linux虚拟机与开发板的通信。1. linux虚拟机未添加第2张网卡前图4 - 26 添加第2张网卡前2. 为虚拟机添加第2张网卡,并设置为桥接图4 - 27 虚拟机设备页图4 - 28 添加网卡图4 - 29 指定新网卡桥接到主机物理网卡图4 - 30 完成第2张网卡添加后3. 在linux虚拟机中为第2张网卡设置IP地址本书假设:windows主机的IP为2,linux虚拟机第2张网卡的IP地址为1,开发板的IP地址为7。按照图4 - 31-图4 - 33所示,设置第2张网卡的IP为1,第1张网卡的IP保持自动获得不变。图4 - 31 网络配置工具图4 - 32 网卡基本情况列表图4 - 33 设置eth1的IP地址1.4.2 安装、配置和使用ftp服务执行下面操作之前,再次使windows主机能联通互联网。1. 安装ftp服务器vsftpd$ sudo apt-get install vsftpd2. 配置ftp服务器修改配置文件/etc/vsftpd.conf,将下面2行前的注释符号“#”去掉#local_enable=YES#write_enable=YES上面第一行表示是否允许本地用户(dennis就是本地用户之一)登录,第二行表示是否允许上传文件。3. 重启ftp服务$ sudo /etc/init.d/vsftpd restart4. 使用ftp服务器从ftp服务器下载和上传数据,需要在windows主机上安装ftp客户端。你可以使用任何你熟悉的ftp客户端,配套光盘中提供了1个ftp客户端软件(softwareuestudio.rar)。1.4.3 安装、配置nfs服务1. 安装nfs服务器$ sudo apt-get install nfs-kernel-server portmap2. 配置nfs服务器修改配置文件/etc/exports,添加如下内容,以后就可以通过nfs文件系统访问/work目录了/work *(rw,sync,no_root_squash)3. 重启nfs服务器$ sudo /etc/init.d/nfs-kernel-server restart2 第5章 建构bootloader2.1 准备工作2.1.1 嵌入式Linux系统概述嵌入式系统是以应用为中心,以计算机技术为基础,且软硬件可裁减,适应应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。 以上定义是学究形的官方定义。其实嵌入式系统本质上必然是计算机系统,不严格的讲,当你看到可以干活(运行程序)的东西,但它又没有显示器或者显示器很小的时候,大体上你见到的就是嵌入式系统。不过嵌入式有别于通用的pc机,主要体现在功耗要小(想想如果一个手机的电池只能支撑2个小时,谁会用它?),体积要小(砖头式的mp3你会用吗?),成本要低(s3c2440才卖40人民币),可靠性要高(中国移动在山顶上的基站如果几天就坏一次的话,恐怕王同学和李同学早就下课了),硬件可裁减(如果只是做mp3,你会让你的硬件有网卡、显卡吗?),软件可裁减(如果只做mp3,你会让linux含有摄像头驱动吗?你会让系统含有powerpoint吗?)嵌入式系统最初的应用是基于单片机的,嵌入式系统的历史可以追溯到上世纪70年代,当时可爱的 Intel公司生产了全球第1款单片机(my god,Intel竟然是单片机的鼻祖)。20 世纪80 年代嵌入式操作系统出现,最著名的是wind river公司荣誉出品的vxworks。商业嵌入式实时内核包含传统操作系统的特征,使得开发周期缩短,成本降低,效率提高促使嵌入式系统有了更为广阔的应用空间。20 世纪90 年代,Linux、ucos等可用于嵌入式的操作系统横空出世。进入本世纪,wince、symbian、blackberry、iphone、 android也跑来凑热闹,好不快活。值得一提的是我的母校也弄出了个完整的商用嵌入式操作系统deltaos,不过主要是军用,民口还没看到。 嵌入式系统的构架从下往上,一般分为:硬件、驱动程序、操作系统、API接口、应用程序 图5 1 嵌入式系统构架对硬件来说,最重要的是CPU,目前在嵌入式设备上使用最多的通用CPU是:ARM/Strong、MIPS、PowerPC 、M68k等。同时带DSP功能的CPU也在逐渐兴起。存储系统除了常见的SDRAM外,通常还使用Nor flash充当ROM以存放启动程序(bootloader),Nand flash充当硬盘。通信接口一般有:RS-232接口(串口UART)、 USB接口(通用串行总线接口)、IrDA(Infra Red Data Association红外线接口)、SPI(串行外围设备接口)、I2C、CAN总线接口、蓝牙接口(Bluetooth)、 Ethernet(以太网接口)、IEEE1394接口、通用可编程接口GPIO、LCD和触摸屏、扩展卡(各种CF卡、SD卡、Memory Stick等)。在便携式嵌入式系统的应用中,还必须特别关注电源装置等辅助设备。 对于嵌入式Linux系统而言,其软件系统的组成主要有: l bootloader:vivi、u-boot l 内核(kernel) l 根文件系统(yaffs、jffs2、cramfs、ramdisk) l 系统应用程序(web server) l 图形界面系统(QTE、MINIGUI) 开发工具,主要是: l 交叉编译工具链 l 图形界面开发工具 2.1.2 构建交叉编译工具链嵌 入式系统的开发过程有别与普通的pc程序的开发,主要表现在程序的编辑、编译与程序的运行不在同一台设备上,通常前者在开发机(pc)上,后者在嵌入式设备(ARM开发板)上。这样就要求在进行实际开发前必须要搭建基于ARM的嵌入式linux交叉开发环境,这个过程主要包含:l 开发主机linux操作系统(ubuntu9.10)的安装 l 开发主机基本服务(nfs、vsftpd)及程序(minicom)的安装、配置与使用 l 交叉编译工具链(binutilsgccglibc)的生成、安装与使用 前两者比较容易,我们已经在前一章完成了,而交叉编译工具链由交叉编译器(arm-linux-gcc)、供arm平台使用的C库(glibc)以及辅助的二进制工具 binutils(包括arm-linux-readelf、arm-linux-objcopy等)组成。这3者的源码是独立开发和维护的,他们之间的版本兼容性较为繁杂,因此分别构造这三个部分较为复杂,难以成功,好在有志愿者为我们制作好了工具软件,例如crosstool以及它的后继版本crosstool-ng,使用它们可以方便快捷地制作出交叉编译工具链。或者干脆使用别人已经制作好的二进制格式的交叉编译工具链,这样就只需要简单的解包安装即可,就像前一章那样操作。为什么要制作交叉编译工具链呢?因为程序的编译是在pc上完成的,如果我们使用gcc来编译程序,得到的二进制程序是 for X86的,而不是for ARM的,它根本就不能运行在ARM平台上,因此我们需要交叉编译器arm-linux-gcc,它编译出来的二进制程序是for ARM的,而不是for X86的。arm-linux-gcc真是很有特点,它自己本身运行在X86平台上,但它编译出来的程序则运行在ARM平台上,它是不是有点不伦不类?所以我喜欢称它为杂种编译器,哈哈。光有arm-linux-gcc还是不够的,因为应用程序中会调用printf之类的库函数,编译器在编译时需要去库中链接这些库函数代码,由于最终程序是运行在ARM平台上的,所以被链接的库也必须是for arm的。因此除了制作arm-linux-gcc外,还必须制作for arm的C库(glibc)。 最后我们来看一看光盘中提供的交叉编译工具链的3个组成部分在硬盘上的位置。交叉编译工具链安装于/usr/local/arm/gcc-3.4.5-glibc-2.3.6/目录:l 交叉编译器位于bin目录,主要有:C编译器arm-linux-gcc,C+编译器arm-linux-g+,汇编器arm-linux-as,链接器arm-linux-ld; l 交叉编译用到的C库位于arm-linux/lib;头文件位于arm-linux/includel binutil工具位于bin目录,主要有:arm-linux-readelf、arm-linux-ar、arm-linux-ranlib、arm-linux-objcopy等2.1.3 bootloader概述引导加载程序是系统加电后运行的第一段软件代码。回忆一下 PC 的体系结构我们可以知道,PC 机中的引导加载程序由 BIOS(其本质就是一段固件程序)和位于硬盘 MBR 中的 OS Boot Loader(比如,LILO 和 GRUB 等)一起组成。BIOS 在完成硬件检测和资源分配后,将硬盘 MBR 中的 Boot Loader 读到系统的 RAM 中,然后将控制权交给 OS Boot Loader。Boot Loader 的主要运行任务就是将内核映象从硬盘上读到 RAM 中,然后跳转到内核的入口点去运行,也即开始启动操作系统。 而在嵌入式系统中,通常并没有像 BIOS 那样的固件程序(注,有的嵌入式 CPU 也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由 Boot Loader 来完成。比如在一个基于 ARM9 core 的嵌入式系统中,系统在上电或复位时通常都从地址 0x00000000 处开始执行,而在这个地址处安排的通常就是系统的 Boot Loader 程序。 下面从Boot Loader 的概念、Boot Loader 的主要任务、Boot Loader 的框架结构来讨论嵌入式系统的 Boot Loader。1. Boot Loader 的概念 简单地说,Boot Loader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。 通 常,Boot Loader 是严重地依赖于硬件而实现的,特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的 Boot Loader 几乎是不可能的。尽管如此,我们仍然可以对 Boot Loader 归纳出一些通用的概念来,以指导用户设计与实现特定的 Boot Loader。 (1)Boot Loader 所支持的 CPU 和嵌入式板 每种不同的 CPU 体系结构都有不同的 Boot Loader。有些 Boot Loader 也支持多种体系结构的 CPU,比如 U-Boot 就同时支持 ARM 体系结构和MIPS 体系结构。除了依赖于 CPU 的体系结构外,Boot Loader 实际上也依赖于具体的嵌入式板级设备的配置。这也就是说,对于两块不同的嵌入式板而言,即使它们是基于同一种 CPU 而构建的,要想让运行在一块板子上的 Boot Loader 程序也能运行在另一块板子上,通常也都需要修改 Boot Loader 的源程序。 (2) Boot Loader 的安装媒介(Installation Medium) 系统加电或复位后,所有的 CPU 通常都从某个由 CPU 制造商预先安排的地址上取指令。比如,基于 ARM core 的 CPU 在复位时通常都从地址 0x00000000 取它的第一条指令。而基于CPU 构建的嵌入式系统通常都有某种类型的固态存储设备(比如:ROM、EEPROM 或 FLASH 等)被映射到这个预先安排的地址上。因此在系统加电后,CPU 将首先执行 Boot Loader 程序。 (3) 用来控制 Boot Loader 的设备或机制 主机和目标机之间一般通过串口建立连接,Boot Loader 软件在执行时通常会通过串口来进行 I/O,比如:输出打印信息到串口,从串口读取用户控制字符等。 (4) Boot Loader 的启动过程是单阶段(Single Stage)还是多阶段(Multi-Stage) 通常多阶段的 Boot Loader 能提供更为复杂的功能,以及更好的可移植性。从固态存储设备上启动的 Boot Loader 大多都是 2 阶段的启动过程,也即启动过程可以分为 stage 1 和 stage 2 两部分。而至于在 stage 1 和 stage 2 具体完成哪些任务将在下面讨论。 (5) Boot Loader 的操作模式 (Operation Mode) 大多数 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 通常都会向它的终端用户提供一个简单的命令行接口。 像 Blob 或 U-Boot 等这样功能强大的 Boot Loader 通常同时支持这两种工作模式,而且允许用户在这两种工作模式之间进行切换。比如,U-boot 在启动时处于正常的启动加载模式,但是它会延时 10 秒等待终端用户按下任意键而将 U-boot切换到下载模式。如果在 10 秒内没有用户按键,则 U-boot 继续启动 Linux 内核。 (6) BootLoader 与主机之间进行文件传输所用的通信设备及协议 最常见的情况就是,目标机上的 Boot Loader 通过串口与主机之间进行文件传输,传输协议通常是 xmodemymodemzmodem 协议中的一种。但是,串口传输的速度是有限的,因此通过以太网连接并借助 TFTP 协议(或者NFS协议)来下载文件是个更好的选择。 此外,在论及这个话题时,主机方所用的软件也要考虑。比如,在通过以太网连接和 TFTP 协议(或者NFS协议)来下载文件时,主机方必须有一个软件用来的提供 TFTP(或者NFS) 服务。 2. Boot Loader 的主要任务与典型结构框架 从操作系统的角度看,Boot Loader 的总目标就是正确地调用内核来执行。 另外,由于 Boot Loader 的实现依赖于 CPU 的体系结构,因此大多数 Boot Loader 都分为 stage1 和 stage2 两大部分。依赖于 CPU 体系结构的代码,比如设备初始化代码等,通常都放在 stage1 中,而且通常都用汇编语言来实现,以达到短小精悍的目的。而 stage2 则通常用C语言来实现,这样可以实现更复杂的功能,而且代码会具有更好的可读性和可移植性。 Boot Loader的stage1通常包括以下步骤(以执行的先后顺序): l 硬件设备初始化。 l 为加载 Boot Loader 的 stage2 准备 RAM 空间。 l 拷贝 Boot Loader 的 stage2 到 RAM 空间中。 l 设置好堆栈。 l 跳转到 stage2 的 C 入口点。Boot Loader 的 stage2 通常包括以下步骤(以执行的先后顺序): l 初始化本阶段要使用到的硬件设备。 l 检测系统内存映射(memory map)。 l 将 kernel 映像和根文件系统映像从 flash 上读到 RAM 空间中。 l 为内核设置启动参数。 l 调用内核。3. Boot Loader 的 stage1完成的主要任务(1)基本的硬件初始化 这是 Boot Loader 一开始就执行的操作,其目的是为 stage2 的执行以及随后的 kernel 的执行准备好一些基本的硬件环境。它通常包括以下步骤(以执行的先后顺序): l 屏蔽所有的中断为中断提供服务通常是 OS 设备驱动程序的责任,因此在 Boot Loader 的执行全过程中可以不必响应任何中断。中断屏蔽可以通过写 CPU 的中断屏蔽寄存器或状态寄存器(比如 ARM 的 CPSR 寄存器)来完成。 l 设置 CPU 的速度和时钟频率 l RAM 初始化包括正确地设置系统的内存控制器的功能寄存器等。 l 关闭 CPU 内部指令数据 cache(2)拷贝 stage2 到 RAM 中拷贝时要确定两点:stage2 的可执行映象在固态存储设备的存放起始地址和终止地址; RAM空间的起始地址。(3)设置堆栈指针 sp 堆栈指针的设置是为了执行 C 语言代码作好准备。 (4)跳转到 stage2 的 C 入口点 在上述一切都就绪后,就可以跳转到 Boot Loader 的 stage2 去执行了。比如,在 ARM 系统中,这可以通过修改 PC 寄存器为合适的地址来实现。 4. Boot Loader 的 stage2完成的主要任务stage2 的代码通常用C语言来实现,以便于实现更复杂的功能和取得更好的代码可读性和可移植性。但是与普通 C 语言应用程序不同的是,在编译和链接 boot loader 这样的程序时,我们不能使用 glibc 库中的任何支持函数。其原因是显而易见的。(1)初始化本阶段要使用到的硬件设备 这通常包括:初始化至少一个串口,以便和终端用户进行 I/O 输出信息。设备初始化完成后,可以输出一些打印信息,程序名字字符串、版本号等。 (2)加载内核映像 从nor flash或nand flash(需要编写nand flash裸驱动)上将内核映像拷贝到RAM中 (3)设置内核的启动参数 应该说,在将内核映像拷贝到 RAM 空间中后,就可以准备启动 Linux 内核了。但是在调用内核之前,应该作一步准备工作,即:设置 Linux 内核的启动参数。 Linux 2.4.x 以后的内核都期望以标记列表(tagged list)的形式来传递启动参数。启动参数标记列表以标记 ATAG_CORE 开始,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- Unit3CelebrationsLesson1SpringFestival教学设计-高中英语北师大版
- 角(第2课时补角余角)(教学设计)数学苏科版2024七年级上册
- 行业规范与职业道德培训教材
- 小学一年级语文好奇的孩子二教案
- 中班数学小鱼有多长教案反思
- 小学六年级语文课堂教学的全面创新林海教案
- 九年级数学圆周角新人教版教案
- 室内腻子施工方案最终版本试卷教案
- 幼儿园大班英语《Mybody我的身体》教案
- 新人教版五年级数学上册第七单元教案
- 博物馆管理员文物保管岗位面试问题及答案
- 压力容器考试试题大全及答案
- GB 5725-2025坠落防护安全网
- 2025至2030中国冬虫夏草行业市场深度分析及有效策略与实施路径评估报告
- 仓储安全消防培训课件
- 机电设备安装工程工程质量管理制度
- 2025-2026学年度导游资格考试试题预测试卷含答案详解【满分必刷】
- 生产计划与排程优化标准模板
- 高速公路工程施工作业指导书
- 解读《荷花淀》中的“潜台词”
- 2026年高考生物一轮复习:人教版必修+选必修共5册知识点考点背诵提纲
评论
0/150
提交评论