我的宿主机操作系统是RedHat9.0(建议安装的时候选择“完全安装”)
一个嵌入式Linux系统从软件的角度来看,分为四个层次:
- Boot Loader. 包括固化在固件(firmware)中的 boot 代码(可选),和 Boot Loader 两大部分。
- Linux kernel. 特定于嵌入式板子的定制内核以及内核的启动参数。
- File system. 包括根文件系统和建立于 Flash 内存设备之上的文件系统。通常用 ramdisk 来作为root fs。
- User application. 特定于用户的应用程序。有时在用户应用程序和内核层之间可能还会包括一个嵌入式图形用户界面。常用的嵌入式 GUI 有:MicroWindows 和 MiniGUI 等等。
以下是开发环境搭建过程中涉及到的知识点
一. minicom的使用
minicom是Linux OS下功能强大的串口终端程序。具体使用方法在此不详述,有很多相关资料可供查阅。
NOTE:在minicom的设置中,波特率要设置正确(否则,终端上是乱码),软件流控制和硬件流控制都应设置为“无”或“NO”。
minicom的设置被保存到文件/etc/minirc.dfl中。
进入有颜色的minicom界面:# minicom -m8 -c on
二. 配置tftp服务器
在这里,我是通过网络下载kernel image和root fs到开发板的。
tftp服务器是由超级守护进程xinetd运行的,这使得tftp服务器的配置操作比独立运行守护进程的服务器(如 vsftpd)简单得多。一般,修改文件/etc/xinetd.d/tftp,当然,只有安装了tftp服务器,才会有这个文件。把“disable = yes”改成“disable = no”,然后保存,退出。重新启动超级守护进程xinetd,# service xinetd restart.把要下载的文件放到根目录下的tftpboot子目录中就ok了。
NOTE:在控制台终端输入“setup”,选中system services,回车进入系统服务选项菜单,选中[*] tftp(如果没有tftp服务,说明RedHat9.0安装的时候没有选择tftp服务,可以去安装包映像或安装光盘中找到相应的rpm包安装,ok),保存,退出setup界面。
三. 建立NFS文件系统
NFS是由SUN公司发展出来的分散式文件系统。可以让用户通过连接的网络,将其他电脑所共享的文件目录,映射到自己的系统下。用户在操作这些文件和目录时,感觉如同存储在本机上一样。共享出目录的一方称为NFS服务端,另一端称为NFS客户端。这里,当然是在开发板和宿主机之间建立NFS共享。
NOTE:首先确认宿主机上安装了NFS(查看目录/etc/xinetd.d/下是否存在nfs文件)。
NFS服务器端操作如下:
- 配置宿主机的以太网口
# ifconfig eth0 down
# ifconfig eth0 192.168.1.1 up - 在宿主机上建立目录/home/emdeder/nfs
- 编辑/etc/exports文件如下:
/home/embeder/nfs 192.168.1.2(rw,sync,no_root_squash)
允许IP为192.168.1.2的ARMer9开发系统将宿主机上的/home/embeder/nfs这个目录mount到开发系统下,即,ARMer9开发系统可以通过网络访问宿主机上的/home/embeder/nfs目录。 - 执行/etc/init.d目录下的程序nfs,重启NFS Server
# cd /etc/init.d
# exportfs -rav
# ./nfs restart
NFS客户端的操作如下:
- 启动ARMer9开发系统上的Linux系统。
- 配置ARMer9开发系统上的以太网口
# ifconfig eth0 down
# ifconfig eth0 192.168.1.2 up - ping一下宿主机,看ARMer9开发系统和宿主机的网络是否相通
# ping -c 5 192.168.1.1 - 在ARMer9开发系统中建立目录/tmp/nfs
# mkdir /tmp/nfs - 若相通,则将宿主机上的目录/home/embeder/nfs mount到ARMer9开发系统下的目录/tmp/nfs上。
# mount -t nfs -o nolock 192.168.1.1:/home/embeder/nfs /tmp/nfs - 进入目录/tmp/nfs,查看该目录下的内容,是否和宿主机上的目录/home/embeder/nfs中的内容一样?^_^,应该是一样的。
下面就可以用这种方式在开发板上调试自己的应用程序了。
三. 编译内核
这里,我已经有了目标开发系统的Linux移植源代码,否则,移植是一项烦杂的事情,有时间的话,这也是一件很值得尝试的事情。
编译内核的软件环境是KBuild系统,泛指构建一个完整并能够运行的Linux内核所需要的一切资源。这些资源包括构建程序,脚本,中间件,配置文件和Makefile。依次进行以下操作:
# make menuconfig 进入Linux内核配置界面。
NOTE:在block device中选上ramdisk的支持并且根据需要修改ramdisk的默认大小,并且选上initrd的支持。还有,在file system中选上自己文件系统所用格式的相应支持(这里是ext3),否则,kernel将不能正确引导文件系统(一般出现kernel panic提示信息)。
我在这里静态编译进了目标开发板的声卡驱动,即Philip uda1341,在sound选项里面,当然,也可以用module的方式编译。
# make dep
kbuild调用中间件Script/mkdep来生成描述与核心文件形成依赖关系的.h文件(绝大多数)列表。这个列表保存在 .depend 中。用户即使不执行这一步,kbuild也会执行的。
# make clean
清除上次编译生成的 .o 文件。
# make zImage
构建内核映像
# make modules
编译被配置为模块的内核组件
# make modules_install
把编译好的内核模块按照功能copy到/lib/modules/2.4.23目录下
编译后,可安装模块将被存放的宿主机目录是:
/tmp/lib/modules/2.4.18-rmk7-pxa1/
驱动模块所在目录 /tmp/lib/modules/2.4.18-rmk7-pxa1/kernel/driver
四. kernel和ramdisk的U-Boot可启动映像文件的制作
uboot源代码的 tools/ 目录下有mkimage工具,这个工具可以用来制作不压缩或者压缩的多种可启动映象文件。
mkimage在制作可启动映象文件的时候,是在原来的可执行映象文件的前面加上一个0x40字节的头,记录 mkimage 的参数所指定的信息,这样uboot才能识别这个映象是针对哪个CPU体系结构的,哪个OS的,哪种类型,加载到内存中的哪个位置,入口点在内存中的哪个位置以及映象名是什么。
root@Glym:/tftpboot# ./mkimage
Usage: ./mkimage -l image
-l ==> list image header information
./mkimage -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file[:data_file...] image
-A ==> set architecture to 'arch'
-O ==> set operating system to 'os'
-T ==> set image type to 'type'
-C ==> set compression type 'comp'
-a ==> set load address to 'addr' (hex)
-e ==> set entry point to 'ep' (hex)
-n ==> set image name to 'name'
-d ==> use image data from 'datafile'
-x ==> set XIP (execute in place)
参数说明:
-A 指定CPU的体系结构:
取值 表示的体系结构
alpha Alpha
arm ARM
x86 Intel x86
ia64 IA64
mips MIPS
mips64 MIPS 64 Bit
ppc PowerPC
s390 IBM S390
sh SuperH
sparc SPARC
sparc64 SPARC 64 Bit
m68k MC68000
-O 指定操作系统类型,可以取以下值:
openbsd、netbsd、freebsd、4_4bsd、linux、svr4、esix、solaris、irix、sco、
dell、ncr、lynxos、vxworks、psos、qnx、u-boot、rtems、artos
-T 指定映象类型,可以取以下值:
standalone、kernel、ramdisk、multi、firmware、script、filesystem
-C 指定映象压缩方式,可以取以下值:
none 不压缩
gzip 用gzip的压缩方式
bzip2 用bzip2的压缩方式
-a 指定映象在内存中的加载地址,映象下载到内存中时,要按照用mkimage制作映象时,这个参数所指定的地址值来下载
-e 指定映象运行的入口点地址,这个地址就是-a参数指定的值加上0x40(因为前面有个mkimage添加的0x40个字节的头)
-n 指定映象名
-d 指定制作映象的源文件
例:制作PowerPC体系结构,vxworks操作系统的不压缩kernel映象,准备下载到内存地址0x800000位置,映象名称为vxworks.image:
root@Glym:/tftpboot# ./mkimage -A ppc -O vxworks -T kernel -C none -a 0x800000 -e 0x800040 -n vxworks.image -d vxWorks image
最后会生成一个文件名称为image的映象文件,这个文件就是我们所需要的了。请注意-n参数中指定映象名不是生成的映象文件地文件名,映象名是记录在0x40个字节的头部信息中的。