1、 摘 要 随着时代的发展,人们的生活越来越离不开电子产品,特别是嵌入式电子产品。嵌入式的发展越来越好,得益于硬件的发展和各类嵌入式系统的进步。在众多的嵌入式系统中,最为让人熟悉的就是linux了。所以,这次的课题就以linux内核为主题,使用的开发板是TI的beaglebone white。 关键词:Linux移植,嵌入式,arm 目录 1.嵌入式系统的概念…………………………………………4 1.1 嵌入式系统定义……………………………………………… 4 1.2 ATME
2、L9200开发平台………………………………………. 4 2. BootLoader简介…………………………………………..4 2.1 Boot Loader概念…………………………………………….. 4 2.2 Boot Loader启动过程……………………………………….. 5 2.3 常用的Bootloader…………………………………………… .5 2.4 u-boot移植…………………………………………………… .5 3. 嵌入式linux操作系统…………………………………….7 3.1 嵌入式Linux…………………………………………………..7
3、 3.2 嵌入式Linux的特点………………………………………….7 3.3 从Linux到嵌入式Linux……………………………………..8 4. 基于BeagleBone的嵌入式linux系统移植……………9 4.1 移植概念………………………………………………………. 9 4.2 Linux与移植相关内核结构………………………………….. 9 4.3 嵌入式Linux 操作系统移植…………………………………9 5 文件系统构建………………………………………………9 6 把u-boot、linux内核、文件系统下载到SD卡中………………11 7启动开发板
4、链接pc,查看效果………………………………….11 8 参考文献....………………………………………………………….13 1.嵌入式系统的概念 1.1 嵌入式系统定义 在信息科学技术爆炸式增长的今天,嵌入式系统早已经融入了我们生活的方方面面。美国汽车大王福特公司的高级经理曾宣称,“福特出售的‘计算能力’已超过了IBM”。这并不是一个哗众取宠或者夸张的说法,在真正感受这句话的震撼力之前,让我们先了解一下嵌入式系统(Embedded Systems)的定义:以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系
5、统。举例来说,大到油田的集散控制系统和工厂流水线,小到家用VCD机或手机,甚至组成普通PC终端设备的键盘、鼠标、软驱、硬盘、显示卡、显示器、Modem、网卡、声卡等均是由嵌入式处理器控制的,嵌入式系统市场的深度和广度,由此可见一斑,尽管如此,它的市场价值也许仍然超过了您的想象:今天,嵌入式系统带来的工业年产值已超过了1万亿美元。 1.2 BeagleBone开发平台 BeagleBone 是仅有信用卡大小的低成本 Linux 计算机,它与 Internet 相连并运行高级操作系统,例如 Android 4.0 和 Ubuntu Linux。BeagleBone 包含大量 I/O
6、 并使用 TI Sitara™ AM335x ARM® Cortex™-A8 处理器为实时分析提供处理能力。要进一步进行定制和扩展,可以使用 Cape 插件板以轻松扩展 BeagleBone 的功能。 BeagleBone 具有广泛的开源软件支持选项,包括社区支持的 Ångström Linux 发行版、Ubuntu 或多个其他 Linux 发行版。它还支持 TI Android DevKit 和 TI Sitara Linux EZ SDK。TI 支持的两个操作系统使您可以快速入门并操作,只需进行简单的设置即可获得开箱即用体验。它们包括用于启动演示、基准和应用的 GUI。此外,您可以快速开
7、始开发您自己的应用。还通过嵌入的 Adeneo 支持Windows Embedded Compact 7。 BeagleBone 是一个由社区支持的平台,可用作构建更完整系统的基础和社区软件基线的目标。作为一种替代方案,德州仪器 (TI) 直接支持 AM335x 入门套件或 AM335x 评估模块。 2. BootLoader简介 2.1 Boot Loader概念 简单地说,Boot Loader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备
8、好正确的环境。通常,Boot Loader 是严重地依赖于硬件而实现的,特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的 Boot Loader 几乎是不可能的。尽管如此,我们仍然可以对 Boot Loader 归纳出一些通用的概念来,以指导用户特定的 Boot Loader 设计与实现。 2.2 Boot Loader启动过程 系统上电后,先执行第一阶段代码,进行相应的初始化后,将 Blob 第二阶段代码复制到 RAM 地址 bloc_abs_base,然后跳转到第二阶段开始执行。在第二阶段中,从汇编跳转到 C 的 Main() 函数,继续进行如下工作: 外围的硬件初始化(
9、串口,USB 等); 将 Flash 中的 kernel 加载到 DRAM 的 kernel 区域; 将 Flash 中的 ramdisk 加载到 DRAM 的 ramdisk 区域; 根据用户选择,进入命令行模块或启动 kernel。 2.3 常用的Bootloader (1)Blob Blob是Boot Loader Object的缩写,是一款功能强大的Bootloader。它遵循GPL,源代码完全开放。Blob既可以用来简单的调试,也可以启动Linux kernel。Blob最初是Jan-Derk Bakker和Erik Mouw为一块名为LART(Linux Adva
10、nced Radio Terminal)的板子写的,该板使用的处理器是StrongARM SA-1100。现在Blob已经被移植到了很多CPU上,包括S3C44B0。 (2)Armboot Armboot是一个bootloader,是为基于ARM或者StrongARM CPU的嵌入式系统所设计的.它支持多种类型的Flash;允许映像文件经由bootp . dhcp . tftp从网络传输;支持从串口线下载S-record或者binary文件;允许内存的显示及修改;支持jffs2文件系统等。 (3)u-boot U-Boot,全称Universal Boot Loader,是遵
11、循GPL条款的开放源码项目。从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是相应的Linux内核源程序的简化,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。但是U-Boot不仅仅支持嵌入式Linux系统的引导,当前,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系统。 2.4 u-boot移植 因为TI是一家非常负责的公司,所以它的官网上有非常详细的移植方法文档和工具,这给我们开发人员带来了极大的便利。以下的移植都是
12、参考Ti提供的技术文档的。 我们现在Ti的官网查找对应的资料。全英文的,看得有点吃力。下载Ti提供的在linux地下进行开发的工具ti-sdk-am335x-evm-07.00.00.00,然后安装即可得到。 我们到目录:~/ti-sdk-am335x-evm-07.00.00.00/board-support/u-boot-2013.10-ti2013.12.01/下进行如下米命令进行默认的配置编译: make O=am335x CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm am335x_evm 经过编译完成后,在当前目录下回有一个a
13、m335x目录生成,里面包含了u-boot启动映像u-boot.img文件和MLO文件。
以下是am335x的config.h的部分代码:
#ifndef __CONFIG_AM335X_EVM_H
#define __CONFIG_AM335X_EVM_H
#include
14、efines */ #define V_OSCK 24000000 /* Clock output from T2 */ #define V_SCLK (V_OSCK) /* Custom script for NOR */ #define CONFIG_SYS_LDSCRIPT "board/ti/am335x/u-boot.lds" /* Always 128 KiB env size */ #define CONFIG_ENV_SIZE (128 << 10) #define CONFIG_ENV_VARS_UBOOT_RUNTIME_CON
15、FIG #ifndef CONFIG_SPL_BUILD #define CONFIG_EXTRA_ENV_SETTINGS \ "loadaddr=0x80200000\0" \ "fdtaddr=0x80F80000\0" \ "fdt_high=0xa0000000\0" \ "boot_fdt=try\0" \ "rdaddr=0x81000000\0" \ "bootpart=0:2\0" \ "bootdir=/boot\0" \ "bootfile=zImage\0" \ "fdtfile=undefined\0" \ "conso
16、le=ttyO0,115200n8\0" \ "partitions=" \ "uuid_disk=${uuid_gpt_disk};" \ "name=rootfs,start=2MiB,size=-,uuid=${uuid_gpt_rootfs}\0" \ "optargs=\0" \ "dfu_alt_info_mmc=" DFU_ALT_INFO_MMC "\0" \ "dfu_alt_info_emmc=rawemmc mmc 0 3751936\0" \ "mmcdev=0\0" \ "mmcroot=/dev/mmcblk0p2 ro\0" \
17、 "mmcrootfstype=ext4 rootwait\0" \ "usbroot=/dev/sda2 rw\0" \ "usbrootfstype=ext4 rootwait\0" \ "rootpath=/export/rootfs\0" \ "nfsopts=nolock\0" \ "static_ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:${hostname}" \ "::off\0" \ "ramroot=/dev/ram0 rw ramdisk_size=65536 initrd=${rd
18、addr},64M\0" \ "ramrootfstype=ext2\0" \ "mmcargs=setenv bootargs console=${console} " \ "${optargs} " \ "root=${mmcroot} " \ "rootfstype=${mmcrootfstype}\0" \ "usbargs=setenv bootargs console=${console} " \ "${optargs} " \ "root=${usbroot} " \ "rootfstype=${usbrootfstype}\0"
19、\ "spiroot=/dev/mtdblock4 rw\0" \ "spirootfstype=jffs2\0" \ "spisrcaddr=0xe0000\0" \ "spiimgsize=0x362000\0" \ "spibusno=0\0" \ "spiargs=setenv bootargs console=${console} " \ "${optargs} " \ "root=${spiroot} " \ ······ ······ 3. 嵌入式linux操作系统 3.1 嵌入式Linux 嵌入式Linux(Em
20、bedded Linux)是指对Linux经过小型化裁剪后,能够固化在容量只有几十万字节或几十亿字节的存储器芯片或单片机中,应用于特定嵌入式场合的专用Linux操作系统。 3.2 嵌入式Linux的特点 1)性能稳定,功能强大,占用资源较少。Linux是按照POSIX标准编写的,许多源代码借鉴了UNIX。 2)模块的动态加载,独特的内核结构和工作方式使Linux非常适合于工作在嵌入式系统中。 3)良好的平台可移植性,Linux已经支持除i386、i586、i686和arm之外的alpha、m68k、mips、mips64、ppc、sparc、sparc64、ia64的十多
21、种体系结构。 4)系统可剪裁性,可以灵活的添加和删减各种驱动程序,具体的PDE(Portable Digital Equippment)跟实际应用联系十分密切,采用的器件多种多样,良好的平台可移植性和系统可剪裁性对灵活的系统设计有着极其重要的意义,也为开发调试提供了方便。 5)整个系统是免费的,只要遵守GPL规则,任何人都可以使用、修改甚至销售Linux,全世界有无数个人和组织在不断的完善Linux,有众多的计算机厂商提供Linux相关的产品和服务。开放源代码意味着对新设计、制造的硬件产品的快速支持。嵌入式系统的应用领域通常要求系统高度个性化、高度细分。因此,对新产品的快速支持是一
22、个适合推广的嵌入式操作系统必须具备的能力。 6)对多种网络协议的完美支持。在即将到来的后PC时代,联网将成为数字产品必备的能力,没有联网能力的设备,在信息化时代会显得毫无意义。而Linux天生具备优良的网络连接能力,支持当前所有的网络协议。 3.3 从Linux到嵌入式Linux 由于Linux开始是为台式机开发的,与台式机相比,嵌入式系统有自己的一些特点,如内存容量有限等,所以把Linux应用于嵌入式系统,还需要做大量的工作。这些工作包括: 1)嵌入式系统中的挥发性/非挥发性存储器容量受到严格的限制,为适应系统对尺寸的要求,需要剪裁嵌入式Linux的内核。 2)嵌入
23、式系统的主频和总线带宽也经常由于成本或应用的原因,不能或不必提供更高的性能,作为操作系统,嵌入式Linux也需要做出相应的改变,改写某些核心模块和驱动程序。 3)嵌入式Linux直接面向特定的应用,为了适应一些特殊的应用需求,有时必须改变嵌入式Linux的工作方式。例如Linux是一个多线程、多任务的操作系统,并不适用于某些实时性要求较高的环境中,目前已经出现了经过改造的,专门用于实时环境的嵌入式实时Linux。 4)嵌入式Linux的图形环境与桌面系统相比简陋的多,对中文的支持也不够完善,对于某些手持数字设备,这方面还有许多工作要做。 5)在嵌入式系统领域,没有Wintel
24、这样的垄断组织,相比于桌面系统Linux,嵌入式Linux有更大的发展空间。
4. 基于BeagleBone的嵌入式linux系统移植
4.1 移植概念
在同一个硬件平台上可以运行不同的操作系统,比如在PC机上可以运行windows、linux。同样把操作系统和硬件相关的部分做相应的修改就可以运行在不同的硬件平台上,这就叫移植,即把运行在一个平台上的软件,经过修改运行在其它平台。
Linux 本身是个宏内核,这给移植带来了困难,但由于其有清晰的结构,所以移植也相对容易。Linux和CPU相关的目录是arch/ 25、ecture>/目录中, 26、c和mm/swapfile.c。
2.进程间通信:
所有的SystemVIPC对象权限都包含在ipc_perm数据结构中,这可以在include/linux/ipc.h中找到。SystemV消息是在ipc/msg.c中实现。共享内存在ipc/shm.c中实现。信号量在ipc/sem.c中,管道在/ipc/pipe.c中实现。
4.3 嵌入式Linux 操作系统移植
到目录:~/ti-sdk-am335x-evm-07.00.00.00/board-support/linux-3.12.10-ti2013.12.01/下
使用默认配置编译:
make ARCH=arm CR 27、OSS_COMPILE=arm-linux-gnueabihf- omap2plus_defconfig
make ARCH=arm CROSS_COMPILE= arm-linux-gnueabihf- zImage
编译完成后,会在目录./arch/arm/boot/下生成zImage文件。在arch/arm/boot/dts下有相应的device tree 文件。如果不适用默认提供的filesystem,则需要用到相应开发板的dtb文件。如beaglebone需要am335x-bone.dtb。
把内核和对应dtb文件复制到filesystem的/boot目录下。
如果自定义 28、配置的话,可以用menuconfig的图形界面进行配置
make ARCH=arm CROSS_COMPILE=arm-linux-gunueabihf- menuconfig
5 文件系统构建
到~/ti-sdk-am335x-evm-07.00.00.00/filesystem目录下解压
tisdk-rootfs-image-am335x-evm.tar.gz
把kernel 和dtb文件复制到解压出来的文件系统目录下的/boot下。然后再把解压出来的全部文件夹打包。(也可以不压缩打包,详细见下文。)
如果不打包,可以直接将全部目录复制到已经分区好的SDcard的 29、rootfs分区,效果与使用工具把文件系统压缩包写入分区一样,但可能比较耗时。
6 把u-boot、linux内核、文件系统下载到SD卡中
到目录:~/ti-sdk-am335x-evm-07.00.00.00/bin下,使用工具create-sdcard.sh
这个shell脚本可以帮我们对SD卡进行分区,然后帮我们把三个文件都下载到对应的分区里。实际上我们只要用它来分区就可以了,文件可以直接复制到对应分区。
7启动开发板,链接pc,查看效果
启动开发板。使用如下命令minicom –c on –D /dev/ttyUSB0即可连接成功。按一下复位键。即可看到开发板上的 30、系统正在启动。输入默认的用户ID:root即可登陆。
启动时的代码打印内容如下:
U-Boot SPL 2013.10-g78d8ebd (Mar 30 2014 - 20:46:34)
No AC power, disabling frequency switch
reading args
spl: error 31、 reading image args, err - -1
reading u-boot.img
reading u-boot.img
32、
U-Boot 2013.10-00189-g78d8ebd (Dec 23 2014 - 12:26:16)
I2C: ready 33、
DRAM: 256 MiB
NAND: 0 MiB
MMC: OMAP SD/MMC: 0, OMAP SD/MMC: 1
*** Erro 34、r - No Valid Environment Area found
*** Warning - bad CRC, using default environment
Net: 35、
cpsw, usb_ether
Hit any key to stop autoboot: 0
mmc0 is current device
Scanning mmc 0... 36、
4117600 bytes read in 580 ms (6.8 MiB/s)
33206 bytes read in 59 ms (548.8 KiB/s)
mmc0 is current device
SD/MMC 37、 found on device 0
reading uEnv.txt
** Unable to read file uEnv.txt **
4117600 bytes read in 580 ms (6.8 MiB/s) 38、
33206 bytes read in 59 ms (548.8 KiB/s)
Kernel image @ 0x80200000 [ 0x000000 - 0x3ed460 ]
## Flattened Device Tree blob at 80f80000
Booting using the fdt blob at 39、 0x80f80000
Loading Device Tree to 8f321000, end 8f32c1b5 ... OK
Starting kernel ...
40、
[ 0.000000] Booting Linux on physical CPU 0x0
[ 0.000000] Linux version 3.12.10-ti2013.12.01 (gyn-root@ubuntu) (gcc versio4
[ 0.000000] CPU: ARMv7 Processor [413fc082] revision 2 41、ARMv7), cr=10c53c7d
[ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instructie
[ 0.000000] Machine: Generic AM33XX (Flattened Device Tree), model: TI AM335e
[ 0.000000] cma: CMA: reserved 24 MiB at 8d800000
[ 0.000000] Memory policy: 42、ECC disabled, Data cache writeback
[ 0.000000] CPU: All CPU(s) started in SVC mode.
[ 0.000000] AM335X ES1.0 (sgx neon )
······
·····
NOTE: If the package is a dependency of another package you
will be notified of 43、the dependent packages. You should
use the --force-removal-of-dependent-packages option to
also remove the dependent packages as well
*************************************************************** 44、
***************************************************************
Stopping Bootlog daemon: bootlogd.
_____ _____ _ 45、
| _ |___ ___ ___ ___ | _ |___ ___ |_|___ ___| |_
| | _| .'| . | . | | __| _| . | | | -_| _| _|
|__|__|_| |__,|_ |___| |__| |_| |___|_| |___|___|_|
|___| 46、 |___|
Arago Project http://arago-project.org am335x-evm ttyO0
Arago 2013.12 am335x-evm ttyO0
am335x-evm login:
我们输入用户名:root 不用密码即可登陆系统了。
到此,beaglebone的linux内核移植结束。
8 参考文献
Ti官网:






